misc: allow downloading file from workflow options (#74271) #593

Merged
fpeters merged 1 commits from wip/74271-workflow-file-option into main 2023-09-04 12:14:47 +02:00
5 changed files with 55 additions and 6 deletions

View File

@ -1023,6 +1023,50 @@ def test_form_workflow_table_variables(pub):
assert resp.form['f2'].value == 'foobar'
def test_form_workflow_file_variable(pub):
create_superuser(pub)
create_role(pub)
FormDef.wipe()
Workflow.wipe()
workflow = Workflow(name='Workflow One')
workflow.variables_formdef = WorkflowVariablesFieldsFormDef(workflow=workflow)
workflow.variables_formdef.fields = [fields.FileField(id='1', varname='test', label='Test')]
workflow.store()
formdef = FormDef()
formdef.name = 'form title'
formdef.fields = []
formdef.store()
formdef.workflow_id = workflow.id
formdef.store()
app = login(get_app(pub))
resp = app.get('/backoffice/forms/1/workflow-variables')
resp.forms[0]['f1$file'] = Upload('test.txt', b'foobar', 'text/plain')
resp = resp.forms[0].submit('submit')
formdef.refresh_from_storage()
assert formdef.workflow_options['test'].get_content() == b'foobar'
# simulate ajax upload
resp = app.get('/backoffice/forms/1/workflow-variables')
resp.forms[0]['f1$file'] = Upload('test.txt', b'barfoo', 'text/plain')
upload_url = resp.form['f1$file'].attrs['data-url']
upload_resp = app.post(upload_url, params=resp.form.submit_fields())
resp.form['f1$file'] = None
resp.form['f1$token'] = upload_resp.json[0]['token']
resp = resp.forms[0].submit('submit')
formdef.refresh_from_storage()
assert formdef.workflow_options['test'].get_content() == b'barfoo'
# check file can be downloaded
resp = app.get('/backoffice/forms/1/workflow-variables')
assert resp.click('test.txt').body == b'barfoo'
def test_form_workflow_invalid_file_variable(pub):
create_superuser(pub)
create_role(pub)

View File

@ -35,6 +35,7 @@ from wcs.formdef import (
FormdefImportRecoverableError,
UpdateDigestAfterJob,
)
from wcs.forms.common import TempfileDirectoryMixin
from wcs.forms.root import qrcode
from wcs.qommon import _, force_str, misc, pgettext_lazy, template
from wcs.qommon.afterjobs import AfterJob
@ -576,7 +577,7 @@ class WorkflowRoleDirectory(Directory):
return redirect('..')
class FormDefPage(Directory):
class FormDefPage(Directory, TempfileDirectoryMixin):
do_not_call_in_templates = True
_q_exports = [
'',
@ -598,6 +599,7 @@ class FormDefPage(Directory):
'qrcode',
'information',
'inspect',
'tempfile',
'tests',
('public-url', 'public_url'),
('backoffice-submission-roles', 'backoffice_submission_roles'),

View File

@ -42,7 +42,7 @@ from wcs.conditions import Condition
from wcs.formdata import FormData, NoContentSnapshotAt
from wcs.formdef import FormDef, UpdateDigestAfterJob
from wcs.forms.backoffice import FormDefUI
from wcs.forms.common import FormdefDirectoryBase, FormStatusPage
from wcs.forms.common import FormStatusPage, TempfileDirectoryMixin
from wcs.roles import get_user_roles, logged_users_role
from wcs.sql_criterias import (
And,
@ -759,7 +759,7 @@ class ManagementDirectory(Directory):
return FormPage(component)
class FormPage(FormdefDirectoryBase):
class FormPage(Directory, TempfileDirectoryMixin):
do_not_call_in_templates = True
_q_exports = [
'',

View File

@ -1014,9 +1014,12 @@ class FormStatusPage(Directory, FormTemplateMixin):
raise errors.AccessForbiddenError()
class FormdefDirectoryBase(Directory):
class TempfileDirectoryMixin:
user = None
def check_access(self):
pass
def tempfile(self):
get_request().ignore_session = True
self.check_access()

View File

@ -37,7 +37,7 @@ from wcs.categories import Category
from wcs.fields import MissingBlockFieldError, SetValueError
from wcs.formdata import Evolution, FormData
from wcs.formdef import FormDef
from wcs.forms.common import FormdefDirectoryBase, FormStatusPage, FormTemplateMixin
from wcs.forms.common import FormStatusPage, FormTemplateMixin, TempfileDirectoryMixin
from wcs.qommon.admin.texts import TextsDirectory
from wcs.qommon.storage import NothingToUpdate
from wcs.roles import logged_users_role
@ -253,7 +253,7 @@ class TrackingCodesDirectory(Directory):
return TrackingCodeDirectory(component, self.formdef)
class FormPage(FormdefDirectoryBase, FormTemplateMixin):
class FormPage(Directory, TempfileDirectoryMixin, FormTemplateMixin):
_q_exports = [
'',
'tempfile',