Projet

Général

Profil

0003-workflows-publish-files-uploaded-using-workflow-form.patch

Frédéric Péters, 20 août 2015 11:56

Télécharger (4,01 ko)

Voir les différences:

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(+)
tests/test_form_pages.py
8 8
from wcs.workflows import Workflow, EditableWorkflowStatusItem
9 9
from wcs.wf.jump import JumpWorkflowStatusItem
10 10
from wcs.wf.attachment import AddAttachmentWorkflowStatusItem
11
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef
11 12
from wcs.categories import Category
12 13
from wcs.roles import Role, logged_users_role
13 14
from wcs.tracking_code import TrackingCode
......
1037 1038
    resp = resp.follow()
1038 1039
    assert resp.content_type == 'text/plain'
1039 1040
    assert resp.body == 'foobar'
1041

  
1042

  
1043
def test_formdata_form_file_download(pub):
1044
    create_user(pub)
1045
    wf = Workflow(name='status')
1046
    st1 = wf.add_status('Status1', 'st1')
1047

  
1048
    display_form = FormWorkflowStatusItem()
1049
    display_form.id = '_x'
1050
    display_form.by = ['_submitter']
1051
    display_form.varname = 'xxx'
1052
    display_form.formdef = WorkflowFormFieldsFormDef(item=display_form)
1053
    display_form.formdef.fields.append(fields.FileField(id='1', label='File',
1054
        type='file', varname='yyy'))
1055
    st1.items.append(display_form)
1056
    display_form.parent = st1
1057

  
1058
    wf.store()
1059

  
1060
    formdef = create_formdef()
1061
    formdef.workflow_id = wf.id
1062
    formdef.fields = []
1063
    formdef.store()
1064
    formdef.data_class().wipe()
1065

  
1066
    resp = login(get_app(pub), username='foo', password='foo').get('/test/')
1067
    resp = resp.forms[0].submit('submit')
1068
    assert 'Check values then click submit.' in resp.body
1069
    resp = resp.forms[0].submit('submit')
1070
    assert resp.status_int == 302
1071
    resp = resp.follow()
1072
    assert 'The form has been recorded' in resp.body
1073

  
1074
    resp.forms[0]['f1$file'] = Upload('test.txt', 'foobar', 'text/plain')
1075
    resp = resp.forms[0].submit('submit')
1076

  
1077
    assert formdef.data_class().count() == 1
1078
    formdata = formdef.data_class().select()[0]
1079
    assert 'xxx_var_yyy_raw' in formdata.workflow_data
1080

  
1081
    resp = resp.test_app.get(resp.location + 'files/form-xxx-yyy/test.txt')
1082
    assert resp.content_type == 'text/plain'
1083
    assert resp.body == 'foobar'
wcs/wf/form.py
24 24
from wcs.admin.fields import FieldDefPage, FieldsDirectory
25 25
from wcs.formdata import get_dict_with_varnames
26 26

  
27
from wcs.forms.common import FileDirectory
28

  
29
def lookup_wf_form_file(self, filename):
30
    # supports for URLs such as /$formdata/$id/files/form-$formvar-$fieldvar/test.txt
31
    try:
32
        literal, formvar, fieldvar = self.reference.split('-')
33
    except ValueError:
34
        return
35
    if literal != 'form':
36
        return
37
    try:
38
        return self.formdata.workflow_data['%s_var_%s_raw' % (formvar, fieldvar)]
39
    except KeyError:
40
        return
41

  
27 42

  
28 43
class WorkflowFormFieldsFormDef(FormDef):
29 44
    def __init__(self, item):
......
53 68
    formdef = None
54 69
    varname = None
55 70

  
71
    @classmethod
72
    def init(cls):
73
        if not 'lookup_wf_form_file' in FileDirectory._lookup_methods:
74
            FileDirectory._lookup_methods.append('lookup_wf_form_file')
75
            FileDirectory.lookup_wf_form_file = lookup_wf_form_file
76

  
56 77
    def add_parameters_widgets(self, form, parameters, prefix='', formdef=None):
57 78
        if 'by' in parameters:
58 79
            form.add(WidgetList, '%sby' % prefix, title = _('To'), element_type = SingleSelectWidget,
59
-