workflows: publish files uploaded using workflow forms (#8031)
This commit is contained in:
parent
20d98208f0
commit
d2ad37617f
|
@ -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'
|
||||
|
|
|
@ -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,
|
||||
|
|
Loading…
Reference in New Issue