accrete 0.0.36__py3-none-any.whl → 0.0.38__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- accrete/annotation.py +46 -0
- accrete/contrib/ui/__init__.py +5 -12
- accrete/contrib/ui/context.py +111 -218
- accrete/contrib/ui/filter.py +105 -43
- accrete/contrib/ui/static/css/accrete.css +128 -128
- accrete/contrib/ui/static/css/accrete.css.map +1 -1
- accrete/contrib/ui/static/css/accrete.scss +9 -9
- accrete/contrib/ui/static/js/filter.js +23 -0
- accrete/contrib/ui/static/js/htmx.min.js +1 -0
- accrete/contrib/ui/templates/ui/layout.html +133 -131
- accrete/contrib/ui/templates/ui/list.html +2 -2
- accrete/contrib/ui/templates/ui/partials/filter.html +28 -4
- accrete/contrib/ui/templates/ui/partials/header.html +5 -5
- accrete/contrib/ui/templates/ui/table.html +1 -1
- accrete/contrib/ui/templatetags/accrete_ui.py +10 -6
- accrete/contrib/user/templates/user/login.html +6 -12
- accrete/contrib/user/views.py +10 -9
- accrete/middleware.py +15 -0
- accrete/models.py +9 -7
- accrete/querystring.py +16 -25
- accrete/utils/models.py +19 -0
- {accrete-0.0.36.dist-info → accrete-0.0.38.dist-info}/METADATA +1 -1
- {accrete-0.0.36.dist-info → accrete-0.0.38.dist-info}/RECORD +25 -23
- accrete/contrib/ui/querystring.py +0 -19
- {accrete-0.0.36.dist-info → accrete-0.0.38.dist-info}/WHEEL +0 -0
- {accrete-0.0.36.dist-info → accrete-0.0.38.dist-info}/licenses/LICENSE +0 -0
accrete/querystring.py
CHANGED
@@ -2,6 +2,8 @@ import logging
|
|
2
2
|
import json
|
3
3
|
import operator
|
4
4
|
from django.db.models import Model, Q, QuerySet
|
5
|
+
from accrete.utils.models import get_related_model
|
6
|
+
from accrete.annotation import Annotation
|
5
7
|
|
6
8
|
_logger = logging.getLogger(__name__)
|
7
9
|
|
@@ -13,10 +15,7 @@ def filter_from_querystring(
|
|
13
15
|
order = order or model._meta.ordering
|
14
16
|
return model.objects.filter(
|
15
17
|
parse_querystring(model, query_string)
|
16
|
-
).
|
17
|
-
annotation['name']: annotation['func']
|
18
|
-
for annotation in getattr(model, 'annotations', [])
|
19
|
-
}).order_by(*order).distinct()
|
18
|
+
).order_by(*order).distinct()
|
20
19
|
|
21
20
|
|
22
21
|
def parse_querystring(model: type[Model], query_string: str) -> Q:
|
@@ -32,36 +31,28 @@ def parse_querystring(model: type[Model], query_string: str) -> Q:
|
|
32
31
|
invert = True
|
33
32
|
term = term[1:]
|
34
33
|
|
35
|
-
parts = term.split('
|
34
|
+
parts = term.split('__')
|
36
35
|
if len(parts) == 1:
|
37
36
|
expression = Q(**{term: value})
|
38
37
|
return ~expression if invert else expression
|
39
38
|
|
40
|
-
rel_path = parts[
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
39
|
+
rel_path = '__'.join(parts[:-2])
|
40
|
+
related_model, x = get_related_model(model, rel_path)
|
41
|
+
attr = getattr(related_model, parts[-2])
|
42
|
+
if not isinstance(attr, Annotation):
|
43
|
+
expression = Q(**{term: value})
|
44
|
+
return ~expression if invert else expression
|
45
|
+
|
46
|
+
objects = related_model.objects.filter(Q(**{
|
47
|
+
'__'.join(parts[len(x):]): value
|
48
|
+
}))
|
47
49
|
expression = Q(**{
|
48
|
-
f'{rel_path}{"__" if rel_path else ""}id__in':
|
50
|
+
f'{rel_path}{"__" if rel_path else ""}id__in':
|
51
|
+
objects.values_list('id', flat=True)
|
49
52
|
})
|
50
53
|
|
51
54
|
return ~expression if invert else expression
|
52
55
|
|
53
|
-
def get_related_model(rel_path: str):
|
54
|
-
related_model = model
|
55
|
-
for part in rel_path.split('__'):
|
56
|
-
try:
|
57
|
-
related_model = related_model._meta.fields_map[part].related_model
|
58
|
-
except (AttributeError, KeyError):
|
59
|
-
try:
|
60
|
-
related_model = getattr(related_model, part).field.related_model
|
61
|
-
except AttributeError:
|
62
|
-
break
|
63
|
-
return related_model
|
64
|
-
|
65
56
|
def parse_query_block(sub_item) -> Q:
|
66
57
|
op = ops['&']
|
67
58
|
parsed_query = Q()
|
accrete/utils/models.py
ADDED
@@ -0,0 +1,19 @@
|
|
1
|
+
from django.db.models import Model
|
2
|
+
|
3
|
+
|
4
|
+
def get_related_model(model: type[Model], rel_path: str) -> tuple[Model, list[str]]:
|
5
|
+
names = []
|
6
|
+
related_model = model
|
7
|
+
for part in rel_path.split('__'):
|
8
|
+
names.append(str(related_model._meta.verbose_name))
|
9
|
+
try:
|
10
|
+
next_model = related_model._meta.fields_map[part].related_model
|
11
|
+
related_model = next_model
|
12
|
+
except (AttributeError, KeyError):
|
13
|
+
try:
|
14
|
+
next_model = getattr(related_model, part).field.related_model
|
15
|
+
if next_model is not None:
|
16
|
+
related_model = next_model
|
17
|
+
except AttributeError:
|
18
|
+
break
|
19
|
+
return related_model, names
|
@@ -1,12 +1,13 @@
|
|
1
1
|
accrete/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
2
2
|
accrete/admin.py,sha256=MUYUmCFlGYPowiXTbwl4_Q6Cq0-neiL53WW4P76JCLs,1174
|
3
|
+
accrete/annotation.py,sha256=-nYqDQPOixkD9qdzVZDCIA4lETH2fAZcCSxNmaY2s80,1251
|
3
4
|
accrete/apps.py,sha256=F7ynMLHJr_6bRujWtZVUzCliY2CGKiDvyUmL4F68L2E,146
|
4
5
|
accrete/config.py,sha256=eJUbvyBO3DvAD6xkVKjTAzlXy7V7EK9bVyb91girfUs,299
|
5
6
|
accrete/forms.py,sha256=nPDgSZao-vuVFRam2Py18yiet3Bar-A-qkWjwbeUDlg,11235
|
6
|
-
accrete/middleware.py,sha256=
|
7
|
-
accrete/models.py,sha256=
|
7
|
+
accrete/middleware.py,sha256=RWeHHcYCfpVO4EnG5HMS52F1y5OKRzNCuidMeq6b0zY,3176
|
8
|
+
accrete/models.py,sha256=ruPKqNeKYzqSpYRhpQ12S82iJDYxy0EjSEtNSKWeRz4,6126
|
8
9
|
accrete/queries.py,sha256=bchiqLzE1DmR9kvQ6Yyog6cNlYK_lxpztQMOx6Hy_0c,410
|
9
|
-
accrete/querystring.py,sha256=
|
10
|
+
accrete/querystring.py,sha256=jtPBs3VYQ5_NVwCfjDQV-orv44KHi9b1AAzajvjwYvc,2997
|
10
11
|
accrete/tenant.py,sha256=g3ZuTrQr2zqmIopNBRQeCmHEK2R3dlUme_hOV765J6U,1778
|
11
12
|
accrete/tests.py,sha256=Agltbzwwh5htvq_Qi9vqvxutzmg_GwgPS_N19xJZRlw,7197
|
12
13
|
accrete/views.py,sha256=9-sgCFe_CyG-wllAcIOLujyueiq66C-zg0U7Uf5Y2wU,2954
|
@@ -32,13 +33,12 @@ accrete/contrib/system_mail/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2
|
|
32
33
|
accrete/contrib/system_mail/views.py,sha256=xc1IQHrsij7j33TUbo-_oewy3vs03pw_etpBWaMYJl0,63
|
33
34
|
accrete/contrib/system_mail/migrations/0001_initial.py,sha256=6cwkkRXGjXvwXoMjjgmWmcPyXSTlUbhW1vMiHObk9MQ,1074
|
34
35
|
accrete/contrib/system_mail/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
35
|
-
accrete/contrib/ui/__init__.py,sha256=
|
36
|
+
accrete/contrib/ui/__init__.py,sha256=D_QP3FW_4IzP2c_4WTWyuRIENDA1AFrSOXWL_FNeSMY,445
|
36
37
|
accrete/contrib/ui/admin.py,sha256=suMo4x8I3JBxAFBVIdE-5qnqZ6JAZV0FESABHOSc-vg,63
|
37
38
|
accrete/contrib/ui/apps.py,sha256=E0ao2ox6PQ3ldfeR17FXJUUJuGiWjm2DPCxHbPXGzls,152
|
38
|
-
accrete/contrib/ui/context.py,sha256=
|
39
|
+
accrete/contrib/ui/context.py,sha256=IV66Dtac-MoHelVWrCmFlXQnHZ1XMfwBEYsdZ59-sbg,6870
|
39
40
|
accrete/contrib/ui/elements.py,sha256=g6wksl7hHGJb3CKmkio5rWgcpr1Eyr2vxbKVD-59lkc,1570
|
40
|
-
accrete/contrib/ui/filter.py,sha256=
|
41
|
-
accrete/contrib/ui/querystring.py,sha256=vMP_4Hn6L3jCLf6_HIscZkPgkZGe9g9Y7GfI2zZYn2A,709
|
41
|
+
accrete/contrib/ui/filter.py,sha256=0E5dSd58s1mdDhz8WqIX19e0jPBUlEPi5NWFL8PImgA,13050
|
42
42
|
accrete/contrib/ui/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
|
43
43
|
accrete/contrib/ui/urls.py,sha256=TUBlz_CGs9InTZoxM78GSnucA73I8knoh_obt12RUHM,186
|
44
44
|
accrete/contrib/ui/views.py,sha256=WpBKMsxFFG8eG4IN7TW_TPE6i3OFF7gnLDTK7JMKti8,191
|
@@ -117,14 +117,15 @@ accrete/contrib/ui/static/bulma/sass/utilities/extends.sass,sha256=jb5Ipy_k6hBSF
|
|
117
117
|
accrete/contrib/ui/static/bulma/sass/utilities/functions.sass,sha256=tRNFJ9yQTS-GZ6ouJ7EIWiFITL7irYR7srzKwzacvUA,4896
|
118
118
|
accrete/contrib/ui/static/bulma/sass/utilities/initial-variables.sass,sha256=JXNQHoF4YlBTUW6WSJ14_38SA9lbk6VkouzYURmlV8g,2691
|
119
119
|
accrete/contrib/ui/static/bulma/sass/utilities/mixins.sass,sha256=oijSh2f1DPqod0W5op9iVEAFbC1huMqBIJmnHRx3exc,6291
|
120
|
-
accrete/contrib/ui/static/css/accrete.css,sha256=
|
120
|
+
accrete/contrib/ui/static/css/accrete.css,sha256=XflTQHcjaGSFHjtojR1t8MWSt2MRDEQPeWH5QuU1hIo,253378
|
121
121
|
accrete/contrib/ui/static/css/accrete.css.bak,sha256=2RErGa8_tm8lFSamfW3UfqPgEVkPDejk2fh8IidW-B0,2359
|
122
|
-
accrete/contrib/ui/static/css/accrete.css.map,sha256=
|
123
|
-
accrete/contrib/ui/static/css/accrete.scss,sha256=
|
122
|
+
accrete/contrib/ui/static/css/accrete.css.map,sha256=eAGk5OIGglWaUl-B8ORQI24KwqZfYj_tkkTfEFr9MwU,55936
|
123
|
+
accrete/contrib/ui/static/css/accrete.scss,sha256=KCY4QZNNVtIvogyNYkSwxeFzCCHs1MD4-l-f5bL6QFM,5694
|
124
124
|
accrete/contrib/ui/static/css/icons.css,sha256=IMdNurvI1cUwpGG8n3UXRkxl8MqP2Eqkvyh2maeyghw,6301
|
125
125
|
accrete/contrib/ui/static/icons/Logo.svg,sha256=hGZuxrAa-LRpFavFiF8Lnc7X9OQcqmb6Xl_dxx-27hM,1861
|
126
126
|
accrete/contrib/ui/static/icons/accrete.svg,sha256=CWHJKIgk3hxL7xIaFSz2j1cK-eF1TroCbjcF58bgOIs,1024
|
127
|
-
accrete/contrib/ui/static/js/filter.js,sha256=
|
127
|
+
accrete/contrib/ui/static/js/filter.js,sha256=wMK4rIx4J8ps3uB6J1z2wRAZ5MzkAN6D8EhFQiXybjM,22864
|
128
|
+
accrete/contrib/ui/static/js/htmx.min.js,sha256=s73PXHQYl6U2SLEgf_8EaaDWGQFCm6H26I-Y69hOZp4,47755
|
128
129
|
accrete/contrib/ui/static/js/list.js,sha256=OX_81ifRmawE-1QBU5Qpq_E6sHiiNwIPleETAn9EOJw,4280
|
129
130
|
accrete/contrib/ui/templates/django/forms/widgets/attrs.html,sha256=zNxjU4Ta_eWZkh1WhrF_VIwNZ0lZyl980gSSijUK51k,195
|
130
131
|
accrete/contrib/ui/templates/django/forms/widgets/email.html,sha256=fXpbxMzAdbv_avfWC5464gD2jFng931Eq7vzbzy1-yA,48
|
@@ -135,13 +136,13 @@ accrete/contrib/ui/templates/django/forms/widgets/text.html,sha256=MSmLlQc7PsPoD
|
|
135
136
|
accrete/contrib/ui/templates/django/forms/widgets/textarea.html,sha256=c9BTedqb3IkXLyVYd0p9pR8DFnsXCNGoxVBWZTk_Fic,278
|
136
137
|
accrete/contrib/ui/templates/ui/detail.html,sha256=0sqsW_XbtLVIquXA8157ZWamnwRc4Wp-6_aZgZ5HN64,1051
|
137
138
|
accrete/contrib/ui/templates/ui/form.html,sha256=kIIG4zzNbxb5fJAVr3lI05oa3yoxyAwstMeQWLa2Z0Y,409
|
138
|
-
accrete/contrib/ui/templates/ui/layout.html,sha256=
|
139
|
-
accrete/contrib/ui/templates/ui/list.html,sha256=
|
140
|
-
accrete/contrib/ui/templates/ui/table.html,sha256=
|
141
|
-
accrete/contrib/ui/templates/ui/partials/filter.html,sha256=
|
139
|
+
accrete/contrib/ui/templates/ui/layout.html,sha256=qxLTBR16uh3ed1qm_eC-GrFkN6RYZZx0k1bX07Dcfz4,9247
|
140
|
+
accrete/contrib/ui/templates/ui/list.html,sha256=dcPS1aSN9GlsljJsTNhKMqgPe8goF1uwknZ4DIbElLU,1212
|
141
|
+
accrete/contrib/ui/templates/ui/table.html,sha256=xVSFKrjO_2YkSEO3nspHqMj8mQU4ZV8GSAQFSsAk5SI,3868
|
142
|
+
accrete/contrib/ui/templates/ui/partials/filter.html,sha256=Y2-9fwV_sjrsu-Jvuh8hseku0mQTjsnePSHemps3Tqg,3936
|
142
143
|
accrete/contrib/ui/templates/ui/partials/form_errors.html,sha256=1_TQvTdiejsn-43YSyp2YfnP52P-MFYb-HGY0DLm4oA,991
|
143
144
|
accrete/contrib/ui/templates/ui/partials/form_modal.html,sha256=FFDfI5qjOCUBSGqDjBXa8tcqN2q94wOOCNFDaiyplHQ,1032
|
144
|
-
accrete/contrib/ui/templates/ui/partials/header.html,sha256=
|
145
|
+
accrete/contrib/ui/templates/ui/partials/header.html,sha256=Fr65wv84RgcjpRr1jRdGzChaX08SVhmFhcdEmkTBmyI,2859
|
145
146
|
accrete/contrib/ui/templates/ui/partials/onchange_form.html,sha256=K5twTGqRUW1iM2dGtdWntjsJvJVo5EIzKxX2HK-H1yw,160
|
146
147
|
accrete/contrib/ui/templates/ui/partials/pagination_detail.html,sha256=58nA3X7Il0FAD4VcYyr7tTGWRiVf_FN1TkImmKEpKHU,1014
|
147
148
|
accrete/contrib/ui/templates/ui/partials/pagination_list.html,sha256=9h-I5PfjViomZjoeBUZIwmx7tgWodCs4bDtjOdsPQ8c,1379
|
@@ -150,7 +151,7 @@ accrete/contrib/ui/templates/ui/partials/table_field_float.html,sha256=GH_jFdpk8
|
|
150
151
|
accrete/contrib/ui/templates/ui/partials/table_field_monetary.html,sha256=Wtod9vel2dD4vG8lUVLbtls4aU_2EG3p0E1QRRUSH10,166
|
151
152
|
accrete/contrib/ui/templates/ui/partials/table_field_string.html,sha256=GH_jFdpk8wEJXv4QfO6c3URYrZGGLeuSyWwWl2cWxwQ,45
|
152
153
|
accrete/contrib/ui/templatetags/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
153
|
-
accrete/contrib/ui/templatetags/accrete_ui.py,sha256=
|
154
|
+
accrete/contrib/ui/templatetags/accrete_ui.py,sha256=NBwRhaqojUGSZal7WI-Ugzl-Qiw6joygarP7B3CsfZc,1462
|
154
155
|
accrete/contrib/user/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
155
156
|
accrete/contrib/user/admin.py,sha256=YS4iApli7XUaIl9GsEJxys2j8sepX0by88omYHjff-E,85
|
156
157
|
accrete/contrib/user/apps.py,sha256=oHDrAiHf-G57mZLyxqGJzRY2DbPprGFD-QgyVJG_ruI,156
|
@@ -159,7 +160,7 @@ accrete/contrib/user/middleware.py,sha256=qblcujwJsthopagyT-hPFq4HsMyGt-VvqZw5TQ
|
|
159
160
|
accrete/contrib/user/models.py,sha256=SFEXG9G-XY7Nuss7DT51abDv8BWLHKYJocOhQDI_1Lw,3926
|
160
161
|
accrete/contrib/user/tests.py,sha256=mrbGGRNg5jwbTJtWWa7zSKdDyeB4vmgZCRc2nk6VY-g,60
|
161
162
|
accrete/contrib/user/urls.py,sha256=ktQJ3vZxDlKNUfzOxReeDLOduSdoW5z5Sz0LVFpxZGU,460
|
162
|
-
accrete/contrib/user/views.py,sha256=
|
163
|
+
accrete/contrib/user/views.py,sha256=82-RPqabxE6o7cglnfZmCUxNNRii4pmVFGiTThE4Zp0,3727
|
163
164
|
accrete/contrib/user/locale/de/LC_MESSAGES/django.mo,sha256=p3rgUg6WltAVIMkQsjvjBqTsd_usLhSr1GH4Cyltc2c,433
|
164
165
|
accrete/contrib/user/locale/de/LC_MESSAGES/django.po,sha256=f_Nxpo3HTm2L3f3zoHLfeWsZ-4IQp_EEVSku6TCZSvw,1870
|
165
166
|
accrete/contrib/user/migrations/0001_initial.py,sha256=JWfM9PcMDfkJUdCjLWuWieGs6643qP0KdbCyr5uAZoY,2950
|
@@ -167,7 +168,7 @@ accrete/contrib/user/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm
|
|
167
168
|
accrete/contrib/user/templates/user/accrete_navbar_end_dropdown.html,sha256=vDFjrOZ95doOpdGYSCRlP8H-FfKUWpkYgYP8mOKcboY,481
|
168
169
|
accrete/contrib/user/templates/user/change_email.html,sha256=i9ZgDH31awO9W87E6c3_MKgQNf1ff7EYQX1nEdPqRC8,995
|
169
170
|
accrete/contrib/user/templates/user/change_password.html,sha256=wcwm5_tfPgs9V7VWdDQqhhyMpcIkiGsx2OIptF5fWMk,1498
|
170
|
-
accrete/contrib/user/templates/user/login.html,sha256=
|
171
|
+
accrete/contrib/user/templates/user/login.html,sha256=TuEH4uKK1CFV5X7nP3xPSzu2VJaoEn6APsHh-k6GiCc,1388
|
171
172
|
accrete/contrib/user/templates/user/user_detail.html,sha256=SMkghUKVncVq3KFGBxADJf_wDnLYwmK4oDTKLO0Ejlo,1445
|
172
173
|
accrete/contrib/user/templates/user/user_form.html,sha256=4o24KV940D_KsBP4YwBguwTFW9nYz1uz-RILs91M7Po,1935
|
173
174
|
accrete/contrib/user_registration/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
@@ -188,7 +189,8 @@ accrete/migrations/0002_initial.py,sha256=dFOM7kdHlx7pVAh8cTDlZMtciN4O9Z547HAzEK
|
|
188
189
|
accrete/migrations/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
189
190
|
accrete/utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
190
191
|
accrete/utils/dates.py,sha256=apM6kt6JhGrKgoT0jfav1W-8AUVTxNc9xt3fJQ2n0JI,1492
|
191
|
-
accrete
|
192
|
-
accrete-0.0.
|
193
|
-
accrete-0.0.
|
194
|
-
accrete-0.0.
|
192
|
+
accrete/utils/models.py,sha256=EEhv7-sQVtQD24PEb3XcDUAh3VVhVFoMMLyFrDjGEaI,706
|
193
|
+
accrete-0.0.38.dist-info/METADATA,sha256=qCGJ5Bvnu6mpV3aC_R8hV6bMl2VYNjmeX2T_AhoHFqA,4892
|
194
|
+
accrete-0.0.38.dist-info/WHEEL,sha256=TJPnKdtrSue7xZ_AVGkp9YXcvDrobsjBds1du3Nx6dc,87
|
195
|
+
accrete-0.0.38.dist-info/licenses/LICENSE,sha256=_7laeMIHnsd3Y2vJEXDYXq_PEXxIcjgJsGt8UIKTRWc,1057
|
196
|
+
accrete-0.0.38.dist-info/RECORD,,
|
@@ -1,19 +0,0 @@
|
|
1
|
-
import json
|
2
|
-
|
3
|
-
|
4
|
-
def load_querystring(get_params: dict) -> list:
|
5
|
-
return json.loads(get_params.get('q', '[]'))
|
6
|
-
|
7
|
-
|
8
|
-
def build_querystring(get_params: dict, extra_params: list[str] = None) -> str:
|
9
|
-
querystring = f'?q={get_params.get("q", "[]")}'
|
10
|
-
if paginate_by := get_params.get('paginate_by', False):
|
11
|
-
querystring += f'&paginate_by={paginate_by}'
|
12
|
-
if order_by := get_params.get('order_by', False):
|
13
|
-
querystring += f'&order_by={order_by}'
|
14
|
-
if crumbs := get_params.get('crumbs', False):
|
15
|
-
querystring += f'&crumbs={crumbs}'
|
16
|
-
for param in extra_params or []:
|
17
|
-
if value := get_params.get(param, False):
|
18
|
-
querystring += f'&{param}={value}'
|
19
|
-
return querystring
|
File without changes
|
File without changes
|