mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2026-02-10 17:16:22 +01:00
add basic column control fitlering
This commit is contained in:
@@ -53,12 +53,16 @@ class DataTablesView(View):
|
|||||||
filter_qs = Q()
|
filter_qs = Q()
|
||||||
for id, c in table_conf["columns"].items():
|
for id, c in table_conf["columns"].items():
|
||||||
_c = self.columns[int(id)][0]
|
_c = self.columns[int(id)][0]
|
||||||
if c["searchable"] and len(_c) > 0:
|
if c.get("searchable", False) and len(_c) > 0:
|
||||||
if c["columnControl"]:
|
if c.get("columnControl", False):
|
||||||
_sv = str(c["columnControl"]["search"]["value"])
|
_sv = str(c["columnControl"]["search"]["value"])
|
||||||
|
"""contains, equal, ends, starts, empty"""
|
||||||
_logic = str(c["columnControl"]["search"]["logic"])
|
_logic = str(c["columnControl"]["search"]["logic"])
|
||||||
|
"""text, date, num"""
|
||||||
_type = str(c["columnControl"]["search"]["type"])
|
_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":
|
if _logic == "contains":
|
||||||
filter_qs |= Q(**{f'{_c}__icontains': _sv})
|
filter_qs |= Q(**{f'{_c}__icontains': _sv})
|
||||||
elif _logic == "starts":
|
elif _logic == "starts":
|
||||||
@@ -67,8 +71,7 @@ class DataTablesView(View):
|
|||||||
filter_qs |= Q(**{f'{_c}__iendswith': _sv})
|
filter_qs |= Q(**{f'{_c}__iendswith': _sv})
|
||||||
elif _logic == "equal":
|
elif _logic == "equal":
|
||||||
filter_qs |= Q(**{f'{_c}': _sv})
|
filter_qs |= Q(**{f'{_c}': _sv})
|
||||||
elif _logic == "empty":
|
|
||||||
filter_qs |= Q(**{f'{_c}': ""})
|
|
||||||
else:
|
else:
|
||||||
_sv = str(c["search"]["value"])
|
_sv = str(c["search"]["value"])
|
||||||
if len(_sv) > 0:
|
if len(_sv) > 0:
|
||||||
@@ -81,6 +84,28 @@ class DataTablesView(View):
|
|||||||
filter_qs |= Q(**{f'{_c}__icontains': _gsv})
|
filter_qs |= Q(**{f'{_c}__icontains': _gsv})
|
||||||
return filter_qs
|
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):
|
def get_table_config(self, get: dict):
|
||||||
_cols = nested_param_dict()
|
_cols = nested_param_dict()
|
||||||
for c, v in get.items():
|
for c, v in get.items():
|
||||||
@@ -134,6 +159,8 @@ class DataTablesView(View):
|
|||||||
**kwargs
|
**kwargs
|
||||||
).filter(
|
).filter(
|
||||||
self.filter_qs(table_conf)
|
self.filter_qs(table_conf)
|
||||||
|
).exclude(
|
||||||
|
self.except_qs(table_conf)
|
||||||
).order_by(
|
).order_by(
|
||||||
*self.get_order(table_conf)
|
*self.get_order(table_conf)
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -104,6 +104,17 @@ class TestDataTables(TestCase):
|
|||||||
self.assertEqual(data[0][0], "1020")
|
self.assertEqual(data[0][0], "1020")
|
||||||
self.assertEqual(data[9][0], "1011")
|
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):
|
def test_view_non_sortable_sort(self):
|
||||||
self.get_params["order[0][dir]"] = "desc"
|
self.get_params["order[0][dir]"] = "desc"
|
||||||
self.get_params["order[0][column]"] = "0"
|
self.get_params["order[0][column]"] = "0"
|
||||||
|
|||||||
Reference in New Issue
Block a user