add basic column control fitlering

This commit is contained in:
Aaron Kable
2026-01-09 08:55:58 +08:00
parent 6c2cbb069f
commit 775db62c7a
2 changed files with 43 additions and 5 deletions

View File

@@ -53,12 +53,16 @@ class DataTablesView(View):
filter_qs = Q()
for id, c in table_conf["columns"].items():
_c = self.columns[int(id)][0]
if c["searchable"] and len(_c) > 0:
if c["columnControl"]:
if c.get("searchable", False) and len(_c) > 0:
if c.get("columnControl", False):
_sv = str(c["columnControl"]["search"]["value"])
"""contains, equal, ends, starts, empty"""
_logic = str(c["columnControl"]["search"]["logic"])
"""text, date, num"""
_type = str(c["columnControl"]["search"]["type"])
if len(_sv) > 0:
if _logic == "empty":
filter_qs |= Q(**{f'{_c}': ""})
elif len(_sv) > 0:
if _logic == "contains":
filter_qs |= Q(**{f'{_c}__icontains': _sv})
elif _logic == "starts":
@@ -67,8 +71,7 @@ class DataTablesView(View):
filter_qs |= Q(**{f'{_c}__iendswith': _sv})
elif _logic == "equal":
filter_qs |= Q(**{f'{_c}': _sv})
elif _logic == "empty":
filter_qs |= Q(**{f'{_c}': ""})
else:
_sv = str(c["search"]["value"])
if len(_sv) > 0:
@@ -81,6 +84,28 @@ class DataTablesView(View):
filter_qs |= Q(**{f'{_c}__icontains': _gsv})
return filter_qs
def except_qs(self, table_conf: dict):
# Search
except_qs = Q()
for id, c in table_conf["columns"].items():
_c = self.columns[int(id)][0]
if c.get("searchable", False) and len(_c) > 0:
if c.get("columnControl", False):
_sv = str(c["columnControl"]["search"]["value"])
"""notContains, notEqual, notEmpty"""
_logic = str(c["columnControl"]["search"]["logic"])
"""text, date, num"""
_type = str(c["columnControl"]["search"]["type"])
if _logic == "notEmpty":
except_qs |= Q(**{f'{_c}': ""})
elif len(_sv) > 0:
if _logic == "notContains":
except_qs |= Q(**{f'{_c}__icontains': _sv})
elif _logic == "notEqual":
except_qs |= Q(**{f'{_c}': _sv})
return except_qs
def get_table_config(self, get: dict):
_cols = nested_param_dict()
for c, v in get.items():
@@ -134,6 +159,8 @@ class DataTablesView(View):
**kwargs
).filter(
self.filter_qs(table_conf)
).exclude(
self.except_qs(table_conf)
).order_by(
*self.get_order(table_conf)
)

View File

@@ -104,6 +104,17 @@ class TestDataTables(TestCase):
self.assertEqual(data[0][0], "1020")
self.assertEqual(data[9][0], "1011")
def test_view_no_sort(self):
self.get_params.pop("order[0][column]")
self.get_params.pop("order[0][dir]")
self.client.force_login(self.user)
request = self.factory.get('/fake-url/', data=self.get_params)
response = TestView()
response.setup(request)
data = json.loads(response.get(request).content)["data"]
self.assertEqual(data[0][0], "1001")
self.assertEqual(data[9][0], "1010")
def test_view_non_sortable_sort(self):
self.get_params["order[0][dir]"] = "desc"
self.get_params["order[0][column]"] = "0"