mirror of
https://gitlab.com/allianceauth/allianceauth.git
synced 2026-02-06 07:06:19 +01:00
add basic column control fitlering
This commit is contained in:
@@ -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)
|
||||
)
|
||||
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user