From cc8fd003cbb93820008ff075a274f8f3cd92c8ba Mon Sep 17 00:00:00 2001 From: Valentin Deniaud Date: Thu, 1 Jun 2023 15:29:45 +0200 Subject: [PATCH] wcs: add status to card cell available filters (#78065) --- combo/apps/wcs/forms.py | 10 +++++++++- combo/apps/wcs/templatetags/wcs.py | 6 +++++- tests/wcs/test_card.py | 22 +++++++++++++++++----- tests/wcs/utils.py | 29 +++++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 7 deletions(-) diff --git a/combo/apps/wcs/forms.py b/combo/apps/wcs/forms.py index 8b32935a..eb3cc9d1 100644 --- a/combo/apps/wcs/forms.py +++ b/combo/apps/wcs/forms.py @@ -156,7 +156,8 @@ class WcsCardCellDisplayForm(forms.ModelForm): del self.fields['custom_schema'] del self.fields['filters'] else: - self.fields['filters'].choices = BLANK_CHOICE_DASH + [ + choices = BLANK_CHOICE_DASH + [('status', _('Status'))] + self.fields['filters'].choices = choices + [ (x['varname'], x['label']) for x in self.instance.cached_json['fields'] if x['type'] in ('item', 'items') and x.get('varname') @@ -177,6 +178,13 @@ class WcsCardCellFiltersForm(forms.Form): return for filter_id in cell.filters: + if filter_id == 'status' and 'workflow' in cell.cached_json: + options = [(x['id'], x['name']) for x in cell.cached_json['workflow']['statuses']] + self.fields[filter_id] = forms.MultipleChoiceField( + label=_('Status'), choices=options, widget=MultipleSelect2Widget + ) + continue + field_schemas = [x for x in cell.cached_json['fields'] if x.get('varname') == filter_id] if not field_schemas: continue diff --git a/combo/apps/wcs/templatetags/wcs.py b/combo/apps/wcs/templatetags/wcs.py index 675d8263..d00b7a90 100644 --- a/combo/apps/wcs/templatetags/wcs.py +++ b/combo/apps/wcs/templatetags/wcs.py @@ -66,7 +66,11 @@ def get_filter_attrs(cell, card): attrs = {} for filter_id in cell.filters: - value = card['fields'].get(filter_id + '_raw') + if filter_id == 'status' and 'workflow' in card: + value = card['workflow']['real_status']['id'] + else: + value = card['fields'].get(filter_id + '_raw') + if not value: continue diff --git a/tests/wcs/test_card.py b/tests/wcs/test_card.py index 9e11c802..fe786c44 100644 --- a/tests/wcs/test_card.py +++ b/tests/wcs/test_card.py @@ -748,6 +748,7 @@ def test_manager_card_cell_filters(mock_send, app, admin_user): # only item and items field with varnames are allowed assert resp.form['c%s-filters' % cell.get_reference()].options == [ ('', True, '---------'), + ('status', False, 'Status'), ('fieldj', False, 'Field J'), ('related', False, 'Related'), ] @@ -758,12 +759,13 @@ def test_manager_card_cell_filters(mock_send, app, admin_user): cell.refresh_from_db() assert cell.filters == ['related'] - cell.filters = ['related', 'fieldj'] + cell.filters = ['related', 'fieldj', 'status'] cell.save() resp = app.get('/manage/pages/%s/' % page.pk) assert resp.form.get('c%s-filters' % cell.get_reference(), 0).value == 'related' assert resp.form.get('c%s-filters' % cell.get_reference(), 1).value == 'fieldj' + assert resp.form.get('c%s-filters' % cell.get_reference(), 2).value == 'status' @mock.patch('requests.Session.send', side_effect=mocked_requests_send) @@ -1598,19 +1600,28 @@ def test_card_cell_table_mode_render_filters(mock_send, context, app): {}, ] - cell.filters = ['related', 'fieldj'] + cell.filters = ['related', 'fieldj', 'status'] cell.save() resp = TestResponse(cell.render(context)) - assert len(resp.form.fields) == 2 + assert len(resp.form.fields) == 3 assert resp.form['fieldj'].options == [ ('first value', False, 'First Value'), ('second value \'', False, 'Second Value \''), ('third value', False, 'Third Value'), ] + assert resp.form['status'].options == [('recorded', False, 'Recorded'), ('deleted', False, 'Deleted')] assert [x.attrib for x in resp.pyquery('.list-of-cards li')] == [ - {'data-related': '["42"]', 'data-fieldj': '["first value", "second value \'"]'}, - {'data-related': '["13"]', 'data-fieldj': '["first value", "third value"]'}, + { + 'data-related': '["42"]', + 'data-fieldj': '["first value", "second value \'"]', + 'data-status': '["recorded"]', + }, + { + 'data-related': '["13"]', + 'data-fieldj': '["first value", "third value"]', + 'data-status': '["deleted"]', + }, {}, ] @@ -1620,6 +1631,7 @@ def test_card_cell_table_mode_render_filters(mock_send, context, app): {'varname': 'fieldb', 'field_content': 'value', 'display_mode': 'title'}, ] } + cell.filters = ['related', 'fieldj'] cell.save() resp = TestResponse(cell.render(context)) diff --git a/tests/wcs/utils.py b/tests/wcs/utils.py index 31d6d8d8..c74da686 100644 --- a/tests/wcs/utils.py +++ b/tests/wcs/utils.py @@ -138,6 +138,10 @@ WCS_CARDS_DATA = { 'first_name': 'User', 'last_name': 'Foo Bar', }, + 'workflow': { + 'real_status': {'id': 'recorded', 'name': 'Recorded'}, + 'status': {'id': 'recorded', 'name': 'Recorded'}, + }, }, { 'id': 12, @@ -152,6 +156,10 @@ WCS_CARDS_DATA = { 'related': 'Abc', 'related_raw': 13, }, + 'workflow': { + 'real_status': {'id': 'deleted', 'name': 'Deleted'}, + 'status': {'id': 'deleted', 'name': 'Deleted'}, + }, }, { 'id': 13, @@ -285,6 +293,27 @@ WCS_CARDDEF_SCHEMAS = { {'label': 'Last name', 'varname': 'last_name', 'type': 'string'}, ], }, + 'workflow': { + 'fields': [], + 'functions': {'_editor': 'Editor', '_viewer': 'Viewer'}, + 'name': 'default', + 'statuses': [ + { + 'endpoint': False, + 'forced_endpoint': False, + 'id': 'recorded', + 'name': 'Recorded', + 'waitpoint': True, + }, + { + 'endpoint': True, + 'forced_endpoint': False, + 'id': 'deleted', + 'name': 'Deleted', + 'waitpoint': True, + }, + ], + }, }, 'card_a': { 'name': 'Card A',