Skip to content

Commit 8cb6e41

Browse files
authored
triv: refactor of certain function for easier usage (#17)
* triv: refactor of certain function for easier usage * refactor: changes after code review - removed supporting_annotates_lambda from library * triv: removed changes * triv: bump up version * triv: revert back code --------- Co-authored-by: Viliam Mihalik <[email protected]>
1 parent 904ea8f commit 8cb6e41

File tree

3 files changed

+55
-14
lines changed

3 files changed

+55
-14
lines changed

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "django-smartbase-admin"
3-
version = "0.2.38"
3+
version = "0.2.39"
44
description = ""
55
authors = ["SmartBase <[email protected]>"]
66
readme = "README.md"

src/django_smartbase_admin/actions/advanced_filters.py

Lines changed: 46 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,11 @@
1717
QB_JS_PREFIX = "SB_REPLACE_ME"
1818

1919

20+
class Conditions(models.TextChoices):
21+
AND = "AND"
22+
OR = "OR"
23+
24+
2025
class AllOperators(models.TextChoices):
2126
EQUAL = "equal", _("Equal")
2227
NOT_EQUAL = "not_equal", _("Not equal")
@@ -157,11 +162,45 @@ class QueryBuilderService:
157162
]
158163

159164
@classmethod
160-
def querybuilder_to_django_filter(
161-
cls, request, view_id: str, column_fields: dict, query: dict
162-
) -> [Q, list]:
165+
def get_fields_from_querybuilder(
166+
cls,
167+
view_id: str,
168+
column_fields: dict,
169+
query: dict,
170+
) -> list:
163171
all_fields = []
164172

173+
# Recursively build the Q object
174+
def build_q(rules, condition):
175+
for rule in rules:
176+
if "condition" in rule:
177+
# Nested group of rules
178+
build_q(rule["rules"], rule["condition"])
179+
continue
180+
181+
if rule["field"] is None or "value" not in rule:
182+
# rule is not valid skip
183+
continue
184+
185+
# Single rule
186+
field_name = rule["field"].replace(f"{view_id}-", "")
187+
field = column_fields.get(field_name)
188+
if field is None:
189+
continue
190+
191+
all_fields.append(field)
192+
193+
build_q(query["rules"], query["condition"])
194+
return all_fields
195+
196+
@classmethod
197+
def querybuilder_to_django_filter(
198+
cls,
199+
request,
200+
view_id: str,
201+
column_fields: dict,
202+
query: dict,
203+
) -> Q:
165204
# Recursively build the Q object
166205
def build_q(rules, condition):
167206
queries = []
@@ -189,8 +228,6 @@ def build_q(rules, condition):
189228
if operator not in cls.LIST_OPERATORS and isinstance(value, list):
190229
value = value[0]
191230

192-
all_fields.append(field)
193-
194231
if operator in cls.ZERO_INPUTS_OPERATORS:
195232
filter_value = (
196233
True
@@ -217,12 +254,12 @@ def build_q(rules, condition):
217254
)
218255
queries.append(q)
219256

220-
if condition == "AND":
257+
if condition == Conditions.AND.value:
221258
return Q(*queries)
222259
else: # condition == "OR"
223260
return Q(*queries, _connector=Q.OR)
224261

225-
return build_q(query["rules"], query["condition"]), all_fields
262+
return build_q(query["rules"], query["condition"])
226263

227264
@classmethod
228265
def get_filters_for_list_action(cls, list_action):
@@ -231,7 +268,7 @@ def get_filters_for_list_action(cls, list_action):
231268
return Q()
232269
view_id = list_action.view.get_id()
233270
column_fields = {field.field: field for field in list_action.column_fields}
234-
query, _ = cls.querybuilder_to_django_filter(
271+
query = cls.querybuilder_to_django_filter(
235272
list_action.threadsafe_request,
236273
view_id,
237274
column_fields,
@@ -246,8 +283,7 @@ def get_filters_fields_for_list_action(cls, list_action):
246283
return []
247284
view_id = list_action.view.get_id()
248285
column_fields = {field.field: field for field in list_action.column_fields}
249-
_, fields = cls.querybuilder_to_django_filter(
250-
list_action.threadsafe_request,
286+
fields = cls.get_fields_from_querybuilder(
251287
view_id,
252288
column_fields,
253289
querybuilder_filters,

src/django_smartbase_admin/engine/filter_widgets.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -156,10 +156,15 @@ class BooleanFilterWidget(SBAdminFilterWidget):
156156
template_name = "sb_admin/filter_widgets/boolean_field.html"
157157

158158
def parse_value_from_input(self, request, filter_value):
159-
value = super().parse_value_from_input(request, filter_value)
160-
if value is None:
159+
input_value = super().parse_value_from_input(request, filter_value)
160+
try:
161+
input_value = json.loads(input_value)
162+
except:
163+
pass
164+
165+
if input_value is None:
161166
return None
162-
return json.loads(value)
167+
return input_value
163168

164169
@classmethod
165170
def is_used_for_model_field_type(cls, model_field):

0 commit comments

Comments
 (0)