wcs: add support for |filter_by_identifier (#85618)
gitea/publik-django-templatetags/pipeline/head This commit looks good Details

This commit is contained in:
Frédéric Péters 2024-02-18 12:32:09 +01:00
parent 7bb34ba534
commit 6ad1cc0911
3 changed files with 54 additions and 1 deletions

View File

@ -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:

View File

@ -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:

View File

@ -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'