diff --git a/aurweb/util.py b/aurweb/util.py index 494a988d..e993c440 100644 --- a/aurweb/util.py +++ b/aurweb/util.py @@ -8,7 +8,8 @@ import string from collections import OrderedDict from datetime import datetime -from urllib.parse import quote_plus, urlparse +from typing import Any, Dict +from urllib.parse import quote_plus, urlencode, urlparse from zoneinfo import ZoneInfo import fastapi @@ -148,6 +149,17 @@ def dedupe_qs(query_string: str, *additions): return '&'.join([f"{k}={quote_plus(v)}" for k, v in reversed(qs.items())]) +def extend_query(query: Dict[str, Any], *additions) -> Dict[str, Any]: + """ Add additionally key value pairs to query. """ + for k, v in list(additions): + query[k] = v + return query + + +def to_qs(query: Dict[str, Any]) -> str: + return urlencode(query, doseq=True) + + def get_vote(voteinfo, request: fastapi.Request): from aurweb.models.tu_vote import TUVote return voteinfo.tu_votes.filter(TUVote.User == request.user).first() diff --git a/test/test_util.py b/test/test_util.py index f54a98a0..06fc08d3 100644 --- a/test/test_util.py +++ b/test/test_util.py @@ -35,3 +35,18 @@ def test_dedupe_qs(): def test_number_format(): assert util.number_format(0.222, 2) == "0.22" assert util.number_format(0.226, 2) == "0.23" + + +def test_extend_query(): + """ Test extension of a query via extend_query. """ + query = {"a": "b"} + extended = util.extend_query(query, ("a", "c"), ("b", "d")) + assert extended.get("a") == "c" + assert extended.get("b") == "d" + + +def test_to_qs(): + """ Test conversion from a query dictionary to a query string. """ + query = {"a": "b", "c": [1, 2, 3]} + qs = util.to_qs(query) + assert qs == "a=b&c=1&c=2&c=3"