backoffice: add criticality level filter (#67776) #1216

Merged
fpeters merged 1 commits from wip/67776-criticality-criteria into main 2024-03-15 07:21:33 +01:00
2 changed files with 99 additions and 1 deletions

View File

@ -12,7 +12,8 @@ from wcs.carddef import CardDef
from wcs.data_sources import NamedDataSource
from wcs.formdef import FormDef
from wcs.qommon.http_request import HTTPRequest
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef
from wcs.wf.criticality import MODE_INC
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef, WorkflowCriticalityLevel
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app, login
from .test_all import create_environment, create_superuser
@ -1975,3 +1976,76 @@ def test_backoffice_numeric_filter(pub):
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>123.4</td>') == 0
assert resp.text.count('<td>315</td>') > 0
def test_backoffice_criticality_filter(pub):
pub.user_class.wipe()
create_superuser(pub)
pub.role_class.wipe()
role = pub.role_class(name='test')
role.store()
Workflow.wipe()
workflow = Workflow(name='test')
workflow.criticality_levels = [
WorkflowCriticalityLevel(name='green'),
WorkflowCriticalityLevel(name='yellow'),
WorkflowCriticalityLevel(name='red'),
WorkflowCriticalityLevel(name='black'),
]
workflow.add_status('st1')
st2 = workflow.add_status('st2')
action = st2.add_action('modify_criticality')
action.mode = MODE_INC
st3 = workflow.add_status('st3')
action = st3.add_action('modify_criticality')
action.mode = MODE_INC
action = st3.add_action('modify_criticality')
action.mode = MODE_INC
workflow.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form-title'
formdef.fields = [
fields.StringField(id='1', label='Test', type='string', display_locations=['listings']),
]
formdef.workflow_roles = {'_receiver': role.id}
formdef.workflow = workflow
formdef.store()
data_class = formdef.data_class()
data_class.wipe()
for i in range(3):
formdata = data_class()
formdata.data = {'1': f'baz{i}'}
formdata.just_created()
formdata.store()
if i == 0:
formdata.jump_status(st2.id)
else:
formdata.jump_status(st3.id)
formdata.perform_workflow()
app = login(get_app(pub))
resp = app.get('/backoffice/management/form-title/')
resp.forms['listing-settings']['filter'] = 'all'
resp.forms['listing-settings']['filter-criticality-level'].checked = True
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz') == 3
resp.forms['listing-settings']['filter-criticality-level-value'] = '0'
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz') == 0
resp.forms['listing-settings']['filter-criticality-level-value'] = '1'
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz') == 1
resp.forms['listing-settings']['filter-criticality-level-value'] = '2'
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz') == 2
resp.forms['listing-settings']['filter-criticality-level-value'] = '3'
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz') == 0
resp.forms['listing-settings']['filter-criticality-level-value'] = ''
resp = resp.forms['listing-settings'].submit()
assert resp.text.count('<td>baz') == 3

View File

@ -1147,6 +1147,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
'submission-agent-id',
'date',
'distance',
'criticality-level',
]
return types
@ -1169,6 +1170,8 @@ class FormPage(Directory, TempfileDirectoryMixin):
FakeField('user-function', 'user-function', _('Current User Function')),
FakeField('submission-agent', 'submission-agent-id', _('Submission Agent'), addable=False),
]
if self.formdef.workflow.criticality_levels:
fake_fields.append(FakeField('criticality-level', 'criticality-level', _('Criticality Level')))
default_filters = self.get_default_filters(mode)
filter_fields = []
@ -1376,6 +1379,19 @@ class FormPage(Directory, TempfileDirectoryMixin):
)
r += render_widget(widget, operators)
elif filter_field.key == 'criticality-level':
options = [('', pgettext_lazy('criticality-level', 'All'), '')] + [
(str(i), x.name, str(i)) for i, x in enumerate(self.formdef.workflow.criticality_levels)
]
widget = SingleSelectWidget(
filter_field_key,
title=filter_field.label,
options=options,
value=filter_field_value,
render_br=False,
)
r += render_widget(widget, operators=[])
elif filter_field.key in ('item', 'items'):
filter_field.required = False
@ -2002,6 +2018,7 @@ class FormPage(Directory, TempfileDirectoryMixin):
FakeField('user-function', 'user-function', _('Current User Function')),
FakeField('submission-agent', 'submission-agent-id', _('Submission Agent')),
FakeField('distance', 'distance', _('Distance')),
FakeField('criticality-level', 'criticality-level', _('Criticality Level')),
]
criterias = []
@ -2066,6 +2083,10 @@ class FormPage(Directory, TempfileDirectoryMixin):
if filter_field.key == 'distance' and filters_dict.get('filter-distance'):
filters_dict['filter-distance-value'] = filters_dict['filter-distance']
if filter_field.key == 'criticality-level' and filters_dict.get('filter-criticality-level'):
if filters_dict['filter-criticality-level'] != 'on':
filters_dict['filter-criticality-level-value'] = filters_dict['filter-criticality-level']
if filter_field.key == 'user-id' and not filters_dict.get('filter-user-function'):
# convert uuid based filter into local id filter.
# do not apply if there's filter-user-function as it indicates the filtering
@ -2306,6 +2327,9 @@ class FormPage(Directory, TempfileDirectoryMixin):
raise RequestError('Distance filter missing a center')
center = misc.normalize_geolocation({'lat': center_lat, 'lon': center_lon})
criterias.append(Distance(center, float(filter_field_value)))
elif filter_field.key == 'criticality-level':
level = 100 + int(filter_field_value)
criterias.append(Equal('criticality_level', level))
elif filter_field.key in ('item', 'items', 'bool', 'string', 'text', 'email', 'date', 'numeric'):
criterias.append(
lazy_manager.get_criteria_from_operator(