diff --git a/allianceauth/framework/datatables.py b/allianceauth/framework/datatables.py index 5c855658..229bc50d 100644 --- a/allianceauth/framework/datatables.py +++ b/allianceauth/framework/datatables.py @@ -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) ) diff --git a/allianceauth/framework/tests/test_datatables.py b/allianceauth/framework/tests/test_datatables.py index 3e1a64be..ce641a43 100644 --- a/allianceauth/framework/tests/test_datatables.py +++ b/allianceauth/framework/tests/test_datatables.py @@ -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"