workflows: don't run custom form validation code in VariablesWidget (#51657)

This commit is contained in:
Frédéric Péters 2021-03-05 12:09:38 +01:00
parent 20c6163de8
commit 25147100b9
22 changed files with 92 additions and 102 deletions

View File

@ -1277,6 +1277,32 @@ def test_workflows_variables_edit(pub):
assert Workflow.get(1).variables_formdef.fields[0].varname == '1*1*message'
def test_workflows_variables_edit_with_all_action_types(pub):
test_workflows_add_all_actions(pub)
app = login(get_app(pub))
resp = app.get('/backoffice/workflows/1/')
resp = resp.click(href='variables/')
assert resp.location == 'http://example.net/backoffice/workflows/1/variables/fields/'
resp = resp.follow()
# add a simple field
resp.forms[0]['label'] = 'foobar'
resp.forms[0]['type'] = 'string'
resp = resp.forms[0].submit()
assert resp.location == 'http://example.net/backoffice/workflows/1/variables/fields/'
resp = resp.follow()
resp = app.get('/backoffice/workflows/1/variables/fields/')
resp = resp.click('Edit', href='1/')
assert 'varname$select' in resp.forms[0].fields
resp.forms[0]['varname$name'].value = 'xxx'
resp = resp.forms[0].submit('submit')
assert Workflow.get(1).variables_formdef.fields[0].key == 'string'
assert Workflow.get(1).variables_formdef.fields[0].varname == 'xxx'
def test_workflows_variables_with_export_to_model_action(pub):
test_workflows_variables(pub)

View File

@ -941,7 +941,7 @@ class WorkflowVariableWidget(CompositeWidget):
for parameter in parameters:
key = prefix + parameter
fake_form = Form()
item.add_parameters_widgets(fake_form, [parameter])
item.add_parameters_widgets(fake_form, [parameter], orig='variable_widget')
if not fake_form.widgets:
continue
parameter_label = fake_form.widgets[0].title

View File

@ -175,6 +175,7 @@ class Session(QommonSession, CaptchaSession, StorableObject):
def create_form_token(self):
token = super(Session, self).create_form_token()
print('created token:', token)
open(self.get_form_token_filepath(token), 'wb').close()
return token

View File

@ -39,10 +39,8 @@ class AggregationEmailWorkflowStatusItem(WorkflowStatusItem):
else:
return _('not completed')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(AggregationEmailWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'to' in parameters:
form.add(
WidgetList,

View File

@ -178,10 +178,8 @@ class AddAttachmentWorkflowStatusItem(WorkflowStatusItem):
parameters += ('condition',)
return parameters
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(AddAttachmentWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'by' in parameters:
form.add(
WidgetList,

View File

@ -102,10 +102,8 @@ class SetBackofficeFieldsWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('label', 'fields', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(SetBackofficeFieldsWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'label' in parameters:
form.add(StringWidget, '%slabel' % prefix, size=40, title=_('Label'), value=self.label)

View File

@ -240,10 +240,8 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
def formdef(self):
return self._resolve_formdef_slug(self.formdef_slug)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(CreateFormdataWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'formdef_slug' in parameters:
list_forms = [(None, '---', '')]
list_forms += [
@ -338,6 +336,10 @@ class CreateFormdataWorkflowStatusItem(WorkflowStatusItem):
title=_('Include new form in the form history'),
value=self.attach_to_history,
)
if kwargs.get('orig') == 'variable_widget':
return
errors = [w.name for w in form.get_all_widgets() if w.has_error()]
if set(errors) == set(['%smappings' % prefix]):
form.ERROR_NOTICE = _('This action is configured in two steps. See below for details.')

View File

@ -38,10 +38,8 @@ class ModifyCriticalityWorkflowStatusItem(WorkflowStatusItem):
def is_available(cls, workflow=None):
return workflow and workflow.criticality_levels
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(ModifyCriticalityWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'mode' in parameters:
form.add(
SingleSelectWidget,

View File

@ -123,10 +123,8 @@ class DispatchWorkflowStatusItem(WorkflowStatusItem):
return function_label
return None
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(DispatchWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'role_key' in parameters:
if not self.parent.parent.roles:
self.parent.parent.roles = {}

View File

@ -317,8 +317,8 @@ class ExportToModel(WorkflowStatusItem):
parameters += ('method', 'by', 'label', 'backoffice_info_text', 'filename', 'condition')
return parameters
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(ExportToModel, self).add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
methods = collections.OrderedDict(
[('interactive', _('Interactive (button)')), ('non-interactive', _('Non interactive'))]
)

View File

@ -72,8 +72,8 @@ class ExternalWorkflowGlobalAction(WorkflowStatusItem):
if trigger.identifier == trigger_id:
return trigger
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'slug' in parameters:
objects = [(None, '---', '')]
@ -139,6 +139,9 @@ class ExternalWorkflowGlobalAction(WorkflowStatusItem):
options=triggers_names,
)
if kwargs.get('orig') == 'variable_widget':
return
errors = [w.name for w in form.get_all_widgets() if w.has_error()]
if set(errors) == set(['%strigger_id' % prefix]):
form.ERROR_NOTICE = _('This action is configured in two steps. See below for details.')

View File

@ -103,10 +103,8 @@ class FormWorkflowStatusItem(WorkflowStatusItem):
FileDirectory._lookup_methods.append('lookup_wf_form_file')
FileDirectory.lookup_wf_form_file = lookup_wf_form_file
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(FormWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'by' in parameters:
form.add(
WidgetList,

View File

@ -49,10 +49,8 @@ class GeolocateWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('method', 'address_string', 'map_variable', 'photo_variable', 'overwrite', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(GeolocateWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
methods = collections.OrderedDict(
[
('address_string', _('Address String')),

View File

@ -176,8 +176,8 @@ class JumpWorkflowStatusItem(WorkflowStatusJumpItem):
return ('status', 'condition', 'by', 'timeout', 'set_marker_on_status')
return ('status', 'condition', 'trigger', 'by', 'timeout', 'set_marker_on_status')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(JumpWorkflowStatusItem, self).add_parameters_widgets(form, parameters, prefix, formdef)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix, formdef, **kwargs)
if 'condition' in parameters:
form.get_widget('%scondition' % prefix).advanced = False
if 'trigger' in parameters:

View File

@ -72,7 +72,7 @@ class SendNotificationWorkflowStatusItem(WebserviceCallStatusItem):
def get_parameters(self):
return ('title', 'body', 'origin', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
if 'to' in parameters:
# never displayed in the current UI (no 'to' in get_parameters)
form.add(
@ -115,7 +115,9 @@ class SendNotificationWorkflowStatusItem(WebserviceCallStatusItem):
required=False,
advanced=not (self.origin),
)
WorkflowStatusItem.add_parameters_widgets(self, form, parameters, prefix=prefix, formdef=formdef)
WorkflowStatusItem.add_parameters_widgets(
self, form, parameters, prefix=prefix, formdef=formdef, **kwargs
)
def perform(self, formdata):
if not (self.is_available() and self.to and self.title and self.body):

View File

@ -110,10 +110,8 @@ class UpdateUserProfileStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('fields', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(UpdateUserProfileStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'fields' in parameters:
form.add(
ProfileUpdateTableWidget, '%sfields' % prefix, title=_('Profile Update'), value=self.fields

View File

@ -37,10 +37,8 @@ class RedirectToUrlWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('url', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(RedirectToUrlWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'url' in parameters:
widget = form.add(
ComputedExpressionWidget,

View File

@ -86,10 +86,8 @@ class RegisterCommenterWorkflowStatusItem(WorkflowStatusItem):
to = None
attachments = None
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(RegisterCommenterWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'comment' in parameters:
form.add(
TextWidget, '%scomment' % prefix, title=_('Message'), value=self.comment, cols=80, rows=10

View File

@ -118,10 +118,8 @@ class ResubmitWorkflowStatusItem(WorkflowStatusItem):
if formdata.user_id is None and not new_formdata.backoffice_submission:
get_session().mark_anonymous_formdata(new_formdata)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(ResubmitWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'by' in parameters:
form.add(
WidgetList,

View File

@ -55,10 +55,8 @@ class AddRoleWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('role_id', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(AddRoleWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'role_id' in parameters:
form.add(
SingleSelectWidgetWithOther,
@ -135,10 +133,8 @@ class RemoveRoleWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('role_id', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(RemoveRoleWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'role_id' in parameters:
form.add(
SingleSelectWidgetWithOther,

View File

@ -179,10 +179,8 @@ class WebserviceCallStatusItem(WorkflowStatusItem):
'condition',
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(WebserviceCallStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'label' in parameters:
form.add(StringWidget, '%slabel' % prefix, size=40, title=_('Label'), value=self.label)

View File

@ -1936,7 +1936,7 @@ class WorkflowStatusItem(XmlSerialisable):
except RuntimeError:
return False
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
if 'condition' in parameters:
form.add(
ConditionWidget,
@ -2339,10 +2339,8 @@ class WorkflowStatusJumpItem(WorkflowStatusItem):
set_marker_on_status = False
category = 'status-change'
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(WorkflowStatusJumpItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'status' in parameters:
destinations = [(x.id, x.name) for x in self.parent.parent.possible_status]
@ -2499,10 +2497,8 @@ class CommentableWorkflowStatusItem(WorkflowStatusItem):
'condition',
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(CommentableWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'label' in parameters:
if self.label is None:
self.label = _('Comment')
@ -2646,10 +2642,8 @@ class ChoiceWorkflowStatusItem(WorkflowStatusJumpItem):
form.clear_errors()
return True # get out of processing loop
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(ChoiceWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'label' in parameters:
form.add(ComputedExpressionWidget, '%slabel' % prefix, title=_('Label'), value=self.label)
if 'by' in parameters:
@ -2795,10 +2789,8 @@ class SendmailWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('to', 'mail_template', 'subject', 'body', 'attachments', 'custom_from', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(SendmailWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
subject_body_attrs = {}
if 'subject' in parameters or 'body' in parameters:
if get_publisher().has_site_option('mail-templates') and MailTemplate.count():
@ -3054,10 +3046,8 @@ class SendSMSWorkflowStatusItem(WorkflowStatusItem):
def get_parameters(self):
return ('to', 'body', 'condition')
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(SendSMSWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'to' in parameters:
form.add(
WidgetList,
@ -3147,10 +3137,8 @@ class DisplayMessageWorkflowStatusItem(WorkflowStatusItem):
return Template(message, ezt_format=ezt.FORMAT_HTML).render(dict)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(DisplayMessageWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'message' in parameters:
form.add(
TextWidget,
@ -3223,10 +3211,8 @@ class RedirectToStatusWorkflowStatusItem(WorkflowStatusItem):
def perform(self, formdata):
return formdata.get_url(self.backoffice)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(RedirectToStatusWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'backoffice' in parameters:
form.add(
CheckboxWidget,
@ -3273,10 +3259,8 @@ class EditableWorkflowStatusItem(WorkflowStatusItem):
if form.get_submit() == 'button%s' % self.id:
return formdata.get_url(backoffice=get_request().is_in_backoffice()) + 'wfedit-%s' % self.id
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
super(EditableWorkflowStatusItem, self).add_parameters_widgets(
form, parameters, prefix=prefix, formdef=formdef
)
def add_parameters_widgets(self, form, parameters, prefix='', formdef=None, **kwargs):
super().add_parameters_widgets(form, parameters, prefix=prefix, formdef=formdef, **kwargs)
if 'by' in parameters:
form.add(
WidgetList,