backoffice: add criticality level filter (#67776) #1216
|
@ -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
|
||||
|
|
|
@ -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(
|
||||
|
|
Loading…
Reference in New Issue