From 0ef7dd16730d6fdaf3cd949387c1a423174a2ce5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Thu, 20 Aug 2015 11:38:23 +0200 Subject: [PATCH 3/4] workflows: publish files uploaded using workflow forms (#8031) --- tests/test_form_pages.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ wcs/wf/form.py | 21 +++++++++++++++++++++ 2 files changed, 65 insertions(+) diff --git a/tests/test_form_pages.py b/tests/test_form_pages.py index ba8f6d9..92dc972 100644 --- a/tests/test_form_pages.py +++ b/tests/test_form_pages.py @@ -8,6 +8,7 @@ from wcs.formdef import FormDef from wcs.workflows import Workflow, EditableWorkflowStatusItem from wcs.wf.jump import JumpWorkflowStatusItem from wcs.wf.attachment import AddAttachmentWorkflowStatusItem +from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef from wcs.categories import Category from wcs.roles import Role, logged_users_role from wcs.tracking_code import TrackingCode @@ -1037,3 +1038,46 @@ def test_formdata_attachment_download(pub): resp = resp.follow() assert resp.content_type == 'text/plain' assert resp.body == 'foobar' + + +def test_formdata_form_file_download(pub): + create_user(pub) + wf = Workflow(name='status') + st1 = wf.add_status('Status1', 'st1') + + display_form = FormWorkflowStatusItem() + display_form.id = '_x' + display_form.by = ['_submitter'] + display_form.varname = 'xxx' + display_form.formdef = WorkflowFormFieldsFormDef(item=display_form) + display_form.formdef.fields.append(fields.FileField(id='1', label='File', + type='file', varname='yyy')) + st1.items.append(display_form) + display_form.parent = st1 + + wf.store() + + formdef = create_formdef() + formdef.workflow_id = wf.id + formdef.fields = [] + formdef.store() + formdef.data_class().wipe() + + resp = login(get_app(pub), username='foo', password='foo').get('/test/') + resp = resp.forms[0].submit('submit') + assert 'Check values then click submit.' in resp.body + resp = resp.forms[0].submit('submit') + assert resp.status_int == 302 + resp = resp.follow() + assert 'The form has been recorded' in resp.body + + resp.forms[0]['f1$file'] = Upload('test.txt', 'foobar', 'text/plain') + resp = resp.forms[0].submit('submit') + + assert formdef.data_class().count() == 1 + formdata = formdef.data_class().select()[0] + assert 'xxx_var_yyy_raw' in formdata.workflow_data + + resp = resp.test_app.get(resp.location + 'files/form-xxx-yyy/test.txt') + assert resp.content_type == 'text/plain' + assert resp.body == 'foobar' diff --git a/wcs/wf/form.py b/wcs/wf/form.py index 3191e3e..2b4dbe5 100644 --- a/wcs/wf/form.py +++ b/wcs/wf/form.py @@ -24,6 +24,21 @@ from wcs.formdef import FormDef, lax_int from wcs.admin.fields import FieldDefPage, FieldsDirectory from wcs.formdata import get_dict_with_varnames +from wcs.forms.common import FileDirectory + +def lookup_wf_form_file(self, filename): + # supports for URLs such as /$formdata/$id/files/form-$formvar-$fieldvar/test.txt + try: + literal, formvar, fieldvar = self.reference.split('-') + except ValueError: + return + if literal != 'form': + return + try: + return self.formdata.workflow_data['%s_var_%s_raw' % (formvar, fieldvar)] + except KeyError: + return + class WorkflowFormFieldsFormDef(FormDef): def __init__(self, item): @@ -53,6 +68,12 @@ class FormWorkflowStatusItem(WorkflowStatusItem): formdef = None varname = None + @classmethod + def init(cls): + if not 'lookup_wf_form_file' in FileDirectory._lookup_methods: + 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): if 'by' in parameters: form.add(WidgetList, '%sby' % prefix, title = _('To'), element_type = SingleSelectWidget, -- 2.5.0