From d46a0c4a505cd9c93061d197ef6a874a70f675d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 22 Mar 2018 17:46:04 +0100 Subject: [PATCH] workflows: ensure variables are reevaluated for new backoffice fields (#22748) --- tests/test_workflows.py | 58 +++++++++++++++++++++++++++++++++++++++++++++ wcs/wf/backoffice_fields.py | 4 +++- 2 files changed, 61 insertions(+), 1 deletion(-) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index b46c3f20..f579f85c 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -3238,6 +3238,64 @@ def test_set_backoffice_field_date(two_pubs): formdata = formdef.data_class().get(formdata.id) assert formdata.data['bo1'] is None +def test_set_backoffice_field_immediate_use(http_requests, two_pubs): + Workflow.wipe() + FormDef.wipe() + wf = Workflow(name='xxx') + wf.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(wf) + wf.backoffice_fields_formdef.fields = [ + StringField(id='bo1', label='1st backoffice field', + type='string', varname='backoffice_blah'), + StringField(id='bo2', label='2nd backoffice field', + type='string', varname='backoffice_barr'), + ] + st1 = wf.add_status('Status1') + wf.store() + + formdef = FormDef() + formdef.name = 'baz' + formdef.fields = [ + StringField(id='00', label='String', type='string', varname='string'), + ] + formdef.workflow_id = wf.id + formdef.store() + + formdata = formdef.data_class()() + formdata.data = {'00': 'HELLO'} + formdata.just_created() + formdata.store() + item = SetBackofficeFieldsWorkflowStatusItem() + item.parent = st1 + + item.fields = [ + {'field_id': 'bo1', 'value': '{{form_var_string}}'}, + ] + two_pubs.substitutions.reset() + two_pubs.substitutions.feed(formdata) + item.perform(formdata) + formdata = formdef.data_class().get(formdata.id) + assert formdata.data.get('bo1') == 'HELLO' + + item.fields = [ + {'field_id': 'bo1', 'value': 'WORLD'}, + ] + two_pubs.substitutions.reset() + two_pubs.substitutions.feed(formdata) + item.perform(formdata) + formdata = formdef.data_class().get(formdata.id) + assert formdata.data.get('bo1') == 'WORLD' + + item.fields = [ + {'field_id': 'bo1', 'value': 'X{{form_var_string}}X'}, + {'field_id': 'bo2', 'value': "Y{{form_var_backoffice_blah}}Y"}, + ] + two_pubs.substitutions.reset() + two_pubs.substitutions.feed(formdata) + item.perform(formdata) + formdata = formdef.data_class().get(formdata.id) + assert formdata.data.get('bo1') == 'XHELLOX' + assert formdata.data.get('bo2') == 'YXHELLOXY' + def test_redirect_to_url(pub): formdef = FormDef() formdef.name = 'baz' diff --git a/wcs/wf/backoffice_fields.py b/wcs/wf/backoffice_fields.py index 0be7dbe0..6653edb6 100644 --- a/wcs/wf/backoffice_fields.py +++ b/wcs/wf/backoffice_fields.py @@ -116,7 +116,9 @@ class SetBackofficeFieldsWorkflowStatusItem(WorkflowStatusItem): elif formdata.data.has_key('%s_display' % formdef_field.id): del formdata.data['%s_display' % formdef_field.id] - formdata.store() + # store formdata everytime so substitution cache is invalidated, + # and backoffice field values can be used in subsequent fields. + formdata.store() def fields_export_to_xml(self, item, charset, include_id=False): if not self.fields: -- 2.16.2