From 6ad1cc0911c208f124860e8f8773fe4a69dff693 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sun, 18 Feb 2024 12:32:09 +0100 Subject: [PATCH] wcs: add support for |filter_by_identifier (#85618) --- .../wcs/context_processors.py | 8 +++- .../wcs/templatetags/wcs.py | 8 ++++ tests/test_wcs.py | 39 +++++++++++++++++++ 3 files changed, 54 insertions(+), 1 deletion(-) diff --git a/publik_django_templatetags/wcs/context_processors.py b/publik_django_templatetags/wcs/context_processors.py index 16a52d2..0e368ac 100644 --- a/publik_django_templatetags/wcs/context_processors.py +++ b/publik_django_templatetags/wcs/context_processors.py @@ -147,7 +147,7 @@ class LazyCardDefObjectsManager: if isinstance(value, bool): value = str(value).lower() op = getattr(self, 'pending_op', 'eq') - if self.pending_attr in ['internal_id', 'number', 'user', 'status', 'distance']: + if self.pending_attr in ['internal_id', 'number', 'identifier', 'user', 'status', 'distance']: return getattr(self, 'filter_by_%s' % self.pending_attr)(value, op) qs._filters['filter-%s' % self.pending_attr] = value qs._filters['filter-%s-operator' % self.pending_attr] = op @@ -205,6 +205,12 @@ class LazyCardDefObjectsManager: qs._filters['filter-number'] = number return qs + def filter_by_identifier(self, identifier, op='eq'): + qs = self._clone() + if identifier: + qs._filters['filter-identifier'] = identifier + return qs + def filter_by_user(self, user, op='eq'): qs = self._clone() if user: diff --git a/publik_django_templatetags/wcs/templatetags/wcs.py b/publik_django_templatetags/wcs/templatetags/wcs.py index 9bda88c..69d15fd 100644 --- a/publik_django_templatetags/wcs/templatetags/wcs.py +++ b/publik_django_templatetags/wcs/templatetags/wcs.py @@ -144,6 +144,14 @@ def filter_by_number(queryset, number): return None +@register.filter +def filter_by_identifier(queryset, identifier): + try: + return queryset.filter_by_identifier(identifier) + except AttributeError: + return None + + @register.filter def filter_by_user(queryset, user): try: diff --git a/tests/test_wcs.py b/tests/test_wcs.py index ab03c8a..bdb0e27 100644 --- a/tests/test_wcs.py +++ b/tests/test_wcs.py @@ -498,6 +498,45 @@ def test_filter_by_number(mock_send, context, nocache): assert mock_send.call_args_list == [] +@mock.patch('requests.Session.send', side_effect=mocked_requests_send) +def test_filter_by_identifier(mock_send, context, nocache): + t = Template('{{ cards|objects:"foo"|list }}') + t.render(context) + assert 'filter-identifier' not in mock_send.call_args_list[0][0][0].url + + for tpl in ['filter_by_identifier', 'filter_by:"identifier"|filter_value']: + mock_send.reset_mock() + t = Template('{{ cards|objects:"foo"|%s:None|list }}' % tpl) + t.render(context) + assert 'filter-identifier' not in mock_send.call_args_list[0][0][0].url + + mock_send.reset_mock() + t = Template('{{ cards|objects:"foo"|%s:""|list }}' % tpl) + t.render(context) + assert 'filter-identifier' not in mock_send.call_args_list[0][0][0].url + + mock_send.reset_mock() + t = Template('{{ cards|objects:"foo"|%s:"42-35"|list }}' % tpl) + t.render(context) + assert 'filter-identifier=42-35&' in mock_send.call_args_list[0][0][0].url + + for filter_op, api_op in OPERATORS: + mock_send.reset_mock() + t = Template( + '{{ cards|objects:"foo"|filter_by:"identifier"|%s|filter_value:"42-35"|list }}' % filter_op + ) + t.render(context) + assert 'filter-identifier=42-35&' in mock_send.call_args_list[0][0][0].url + # not for this filter + assert 'filter-identifier-operator=%s&' % api_op not in mock_send.call_args_list[0][0][0].url + + mock_send.reset_mock() + context['foobar'] = None + t = Template('{{ foobar|filter_by_identifier:"42"|list }}') + t.render(context) + assert mock_send.call_args_list == [] + + @mock.patch('requests.Session.send', side_effect=mocked_requests_send) def test_filter_by_user(mock_send, context, nocache): context['nameid'] = 'zyx'