wcs: add status to card cell available filters (#78065)
gitea/combo/pipeline/head This commit looks good Details

This commit is contained in:
Valentin Deniaud 2023-06-01 15:29:45 +02:00
parent 221af86bd9
commit cc8fd003cb
4 changed files with 60 additions and 7 deletions

View File

@ -156,7 +156,8 @@ class WcsCardCellDisplayForm(forms.ModelForm):
del self.fields['custom_schema'] del self.fields['custom_schema']
del self.fields['filters'] del self.fields['filters']
else: else:
self.fields['filters'].choices = BLANK_CHOICE_DASH + [ choices = BLANK_CHOICE_DASH + [('status', _('Status'))]
self.fields['filters'].choices = choices + [
(x['varname'], x['label']) (x['varname'], x['label'])
for x in self.instance.cached_json['fields'] for x in self.instance.cached_json['fields']
if x['type'] in ('item', 'items') and x.get('varname') if x['type'] in ('item', 'items') and x.get('varname')
@ -177,6 +178,13 @@ class WcsCardCellFiltersForm(forms.Form):
return return
for filter_id in cell.filters: 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] field_schemas = [x for x in cell.cached_json['fields'] if x.get('varname') == filter_id]
if not field_schemas: if not field_schemas:
continue continue

View File

@ -66,7 +66,11 @@ def get_filter_attrs(cell, card):
attrs = {} attrs = {}
for filter_id in cell.filters: 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: if not value:
continue continue

View File

@ -748,6 +748,7 @@ def test_manager_card_cell_filters(mock_send, app, admin_user):
# only item and items field with varnames are allowed # only item and items field with varnames are allowed
assert resp.form['c%s-filters' % cell.get_reference()].options == [ assert resp.form['c%s-filters' % cell.get_reference()].options == [
('', True, '---------'), ('', True, '---------'),
('status', False, 'Status'),
('fieldj', False, 'Field J'), ('fieldj', False, 'Field J'),
('related', False, 'Related'), ('related', False, 'Related'),
] ]
@ -758,12 +759,13 @@ def test_manager_card_cell_filters(mock_send, app, admin_user):
cell.refresh_from_db() cell.refresh_from_db()
assert cell.filters == ['related'] assert cell.filters == ['related']
cell.filters = ['related', 'fieldj'] cell.filters = ['related', 'fieldj', 'status']
cell.save() cell.save()
resp = app.get('/manage/pages/%s/' % page.pk) 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(), 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(), 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) @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() cell.save()
resp = TestResponse(cell.render(context)) resp = TestResponse(cell.render(context))
assert len(resp.form.fields) == 2 assert len(resp.form.fields) == 3
assert resp.form['fieldj'].options == [ assert resp.form['fieldj'].options == [
('first value', False, 'First Value'), ('first value', False, 'First Value'),
('second value \'', False, 'Second Value \''), ('second value \'', False, 'Second Value \''),
('third value', False, 'Third 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')] == [ 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'}, {'varname': 'fieldb', 'field_content': 'value', 'display_mode': 'title'},
] ]
} }
cell.filters = ['related', 'fieldj']
cell.save() cell.save()
resp = TestResponse(cell.render(context)) resp = TestResponse(cell.render(context))

View File

@ -138,6 +138,10 @@ WCS_CARDS_DATA = {
'first_name': 'User', 'first_name': 'User',
'last_name': 'Foo Bar', 'last_name': 'Foo Bar',
}, },
'workflow': {
'real_status': {'id': 'recorded', 'name': 'Recorded'},
'status': {'id': 'recorded', 'name': 'Recorded'},
},
}, },
{ {
'id': 12, 'id': 12,
@ -152,6 +156,10 @@ WCS_CARDS_DATA = {
'related': 'Abc', 'related': 'Abc',
'related_raw': 13, 'related_raw': 13,
}, },
'workflow': {
'real_status': {'id': 'deleted', 'name': 'Deleted'},
'status': {'id': 'deleted', 'name': 'Deleted'},
},
}, },
{ {
'id': 13, 'id': 13,
@ -285,6 +293,27 @@ WCS_CARDDEF_SCHEMAS = {
{'label': 'Last name', 'varname': 'last_name', 'type': 'string'}, {'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': { 'card_a': {
'name': 'Card A', 'name': 'Card A',