backoffice: clean context after submission, before workflow (#35768)

This commit is contained in:
Frédéric Péters 2019-09-07 12:14:09 +02:00
parent 2d4d577048
commit a4f2fa1158
3 changed files with 71 additions and 4 deletions

View File

@ -34,6 +34,7 @@ from wcs.workflows import (Workflow, CommentableWorkflowStatusItem,
DisplayMessageWorkflowStatusItem,
JumpOnSubmitWorkflowStatusItem, WorkflowCriticalityLevel,
WorkflowBackofficeFieldsFormDef)
from wcs.wf.backoffice_fields import SetBackofficeFieldsWorkflowStatusItem
from wcs.wf.dispatch import DispatchWorkflowStatusItem
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef
from wcs.wf.jump import JumpWorkflowStatusItem
@ -2045,6 +2046,69 @@ def test_backoffice_submission_live_condition(pub):
assert '<span class="label">Bar</span>' in resp.body
assert '<span class="label">Foo</span>' not in resp.body
def test_backoffice_submission_conditional_jump_based_on_bo_field(pub):
user = create_superuser(pub)
Workflow.wipe()
workflow = Workflow(name='form-title')
workflow.backoffice_fields_formdef = WorkflowBackofficeFieldsFormDef(workflow)
workflow.backoffice_fields_formdef.fields = [
fields.StringField(
id='bo0', varname='foo_bovar', type='string', label='bo variable'),
]
st1 = workflow.add_status('Status1', 'st1')
st2 = workflow.add_status('Status2', 'st2')
setbo = SetBackofficeFieldsWorkflowStatusItem()
setbo.parent = st1
setbo.fields = [{'field_id': 'bo0', 'value': 'go'}]
st1.items.append(setbo)
jump = JumpWorkflowStatusItem()
jump.condition = {'type': 'django', 'value': "form_var_foo_bovar == 'go'"}
jump.status = 'st2'
st1.items.append(jump)
jump.parent = st1
workflow.store()
FormDef.wipe()
formdef = FormDef()
formdef.name = 'form-title'
formdef.fields = [
fields.TextField(id='1', varname='foo', type='text', label='fo variable'),
fields.TextField(id='2', varname='var3', type='text', label='n/a',
condition={'type': 'django', 'value': 'True'}),
]
formdef.workflow_id = workflow.id
formdef.backoffice_submission_roles = user.roles[:]
formdef.store()
formdef.data_class().wipe()
# check jump condition being True
app = login(get_app(pub))
resp = app.get('/backoffice/submission/form-title/')
resp.form['f1'] = 'foo'
resp.form['f2'] = 'bar'
resp = resp.form.submit('submit') # -> confirmation page
resp = resp.form.submit('submit').follow()
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].status == 'wf-st2'
# check jump condition being False
setbo.fields = [{'field_id': 'bo0', 'value': 'nogo'}]
workflow.store()
formdef.data_class().wipe()
resp = app.get('/backoffice/submission/form-title/')
resp.form['f1'] = 'foo'
resp.form['f2'] = 'bar'
resp = resp.form.submit('submit') # -> confirmation page
resp = resp.form.submit('submit').follow()
assert formdef.data_class().count() == 1
assert formdef.data_class().select()[0].status == 'wf-st1'
def test_backoffice_submission_sections(pub):
user = create_user(pub)
create_environment(pub)

View File

@ -217,6 +217,7 @@ class FormFillPage(PublicFormFillPage):
self.set_tracking_code(filled)
get_session().remove_magictoken(get_request().form.get('magictoken'))
self.clean_submission_context()
url = filled.perform_workflow()
if url:

View File

@ -1101,6 +1101,10 @@ class FormPage(Directory, FormTemplateMixin):
formdata.data.update(self.formdef.get_data(form))
return FormStatusPage.live_process_fields(form, formdata, displayed_fields)
def clean_submission_context(self):
get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
def submitted(self, form, existing_formdata = None):
if existing_formdata: # modifying
filled = existing_formdata
@ -1132,8 +1136,7 @@ class FormPage(Directory, FormTemplateMixin):
get_logger().info('form %s - done (id: %s)' % (self.formdef.name, filled.id))
url = None
if existing_formdata is None:
get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
self.clean_submission_context()
url = filled.perform_workflow()
if not filled.user_id:
@ -1167,8 +1170,7 @@ class FormPage(Directory, FormTemplateMixin):
self.edited_data.data = new_data
self.edited_data.store()
# remove previous vars and formdata from substitution variables
get_publisher().substitutions.unfeed(lambda x: x.__class__.__name__ == 'ConditionVars')
get_publisher().substitutions.unfeed(lambda x: isinstance(x, FormData))
self.clean_submission_context()
# and add new one
get_publisher().substitutions.feed(self.edited_data)
wf_status = self.edited_data.get_status()