misc: prevent jumps on submit on "create document" button clicks (#25705) #965

Merged
fpeters merged 1 commits from wip/25705-do-not-jump-on-submit-for-create-doc into main 2024-01-12 15:08:13 +01:00
4 changed files with 50 additions and 4 deletions

View File

@ -36,7 +36,7 @@ from wcs.qommon.upload_storage import PicklableUpload
from wcs.wf.export_to_model import ExportToModel, UploadValidationError, transform_to_pdf
from wcs.workflows import Workflow, WorkflowBackofficeFieldsFormDef
from ..utilities import clean_temporary_pub, create_temporary_pub
from ..utilities import clean_temporary_pub, create_temporary_pub, get_app
def setup_module(module):
@ -460,3 +460,48 @@ def test_export_to_model_form_details_section(pub, filename):
with zipfile.ZipFile(fd) as zout:
new_styles = force_str(zout.read('styles.xml'))
assert 'Field_20_Label' in new_styles
def test_interactive_create_doc_and_jump_on_submit(pub):
wf = Workflow(name='create doc and jump on submit')
st0 = wf.add_status('Status0')
st1 = wf.add_status('Status1')
st2 = wf.add_status('Status2')
button = st0.add_action('choice')
button.by = ['_submitter', '_receiver']
button.label = 'jump'
button.status = st1.id
jump = st1.add_action('jumponsubmit', id='_jump')
jump.status = st2.id
export_to_model = st1.add_action('export_to_model', id='_export_to_model')
export_to_model.by = ['_submitter', '_receiver']
export_to_model.method = 'interactive'
export_to_model.convert_to_pdf = False
template_filename = os.path.join(os.path.dirname(__file__), '..', 'template.odt')
with open(template_filename, 'rb') as fd:
template = fd.read()
upload = QuixoteUpload('/foo/template.odt', content_type='application/octet-stream')
upload.fp = io.BytesIO()
upload.fp.write(template)
upload.fp.seek(0)
export_to_model.model_file = UploadedFile(pub.app_dir, None, upload)
wf.store()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = [StringField(id='1', label='string', varname='toto')]
formdef.workflow_id = wf.id
formdef.store()
resp = get_app(pub).get(formdef.get_url())
resp.form['f1'] = 'test'
resp = resp.form.submit('submit')
resp = resp.form.submit('submit').follow()
resp = resp.form.submit(f'button{button.id}').follow()
assert formdef.data_class().select()[0].status == f'wf-{st1.id}'
resp = resp.form.submit(f'button{export_to_model.id}').follow().follow()
assert resp.content_type != 'text/html'
assert resp.body.startswith(b'PK') # odt
assert formdef.data_class().select()[0].status == f'wf-{st1.id}' # no change

View File

@ -65,7 +65,7 @@ class EditableWorkflowStatusItem(WorkflowStatusItem):
widget = form.add_submit('button%s' % self.id, label)
widget.backoffice_info_text = self.backoffice_info_text
widget.ignore_form_errors = True
widget.is_edit_action = True
widget.prevent_jump_on_submit = True
widget.attrs['formnovalidate'] = 'formnovalidate'
def submit_form(self, form, formdata, user, evo):

View File

@ -311,6 +311,7 @@ class ExportToModel(WorkflowStatusItem):
form.add_submit('button%s' % self.id, label, **{'class': 'download'})
widget = form.get_widget('button%s' % self.id)
widget.backoffice_info_text = self.backoffice_info_text
widget.prevent_jump_on_submit = True
def submit_form(self, form, formdata, user, evo):
if self.method != 'interactive':

View File

@ -38,8 +38,8 @@ class JumpOnSubmitWorkflowStatusItem(WorkflowStatusJumpItem):
def submit_form(self, form, formdata, user, evo):
if form.is_submitted() and not form.has_errors():
button = form.get_widget(form.get_submit())
if hasattr(button, 'is_edit_action'):
# do not jump on submit on clicks on edit button
if hasattr(button, 'prevent_jump_on_submit'):
# do not jump on submit on clicks on edit/create doc buttons
return
wf_status = self.get_target_status(formdata)
if wf_status: