backoffice: clean context after submission, before workflow (#35768)
This commit is contained in:
parent
2d4d577048
commit
a4f2fa1158
|
@ -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)
|
||||
|
|
|
@ -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:
|
||||
|
|
|
@ -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()
|
||||
|
|
Loading…
Reference in New Issue