workflows: publish files uploaded using workflow forms (#8031)

This commit is contained in:
Frédéric Péters 2015-08-20 11:38:23 +02:00
parent 20d98208f0
commit d2ad37617f
2 changed files with 65 additions and 0 deletions

View File

@ -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'

View File

@ -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,