workflows: send correct file when multiple ones share the same name (#8453)
This commit is contained in:
parent
8f76953579
commit
68e26d3997
|
@ -2,11 +2,14 @@ import pytest
|
|||
import hashlib
|
||||
import os
|
||||
import re
|
||||
import StringIO
|
||||
from webtest import Upload
|
||||
|
||||
from quixote.http_request import Upload as QuixoteUpload
|
||||
from wcs.qommon.form import UploadedFile
|
||||
from wcs.qommon.ident.password_accounts import PasswordAccount
|
||||
from wcs.formdef import FormDef
|
||||
from wcs.workflows import Workflow, EditableWorkflowStatusItem
|
||||
from wcs.workflows import Workflow, EditableWorkflowStatusItem, ExportToModel
|
||||
from wcs.wf.jump import JumpWorkflowStatusItem
|
||||
from wcs.wf.attachment import AddAttachmentWorkflowStatusItem
|
||||
from wcs.wf.form import FormWorkflowStatusItem, WorkflowFormFieldsFormDef
|
||||
|
@ -1125,6 +1128,73 @@ def test_formdata_attachment_download(pub):
|
|||
assert resp.content_type == 'text/plain'
|
||||
assert resp.body == 'foobar'
|
||||
|
||||
def test_formdata_generated_document_download(pub):
|
||||
create_user(pub)
|
||||
wf = Workflow(name='status')
|
||||
st1 = wf.add_status('Status1', 'st1')
|
||||
export_to = ExportToModel()
|
||||
export_to.label = 'create doc'
|
||||
upload = QuixoteUpload('/foo/test.rtf', content_type='text/rtf')
|
||||
upload.fp = StringIO.StringIO()
|
||||
upload.fp.write('HELLO WORLD')
|
||||
upload.fp.seek(0)
|
||||
export_to.model_file = UploadedFile(pub.app_dir, None, upload)
|
||||
export_to.id = '_export_to'
|
||||
export_to.by = ['_submitter']
|
||||
st1.items.append(export_to)
|
||||
export_to.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
|
||||
form_location = resp.location
|
||||
resp = resp.follow()
|
||||
assert 'The form has been recorded' in resp.body
|
||||
|
||||
resp = resp.form.submit('button_export_to')
|
||||
|
||||
resp = resp.follow() # $form/$id/create_doc
|
||||
resp = resp.follow() # $form/$id/create_doc/
|
||||
assert resp.body == 'HELLO WORLD'
|
||||
|
||||
export_to.attach_to_history = True
|
||||
wf.store()
|
||||
|
||||
resp = login(get_app(pub), username='foo', password='foo').get(form_location)
|
||||
resp = resp.form.submit('button_export_to')
|
||||
assert resp.location == form_location
|
||||
resp = resp.follow() # back to form page
|
||||
|
||||
resp = resp.click('test.rtf')
|
||||
assert resp.location.endswith('/test.rtf')
|
||||
resp = resp.follow()
|
||||
assert resp.content_type == 'text/rtf'
|
||||
assert resp.body == 'HELLO WORLD'
|
||||
|
||||
# change file content, same name
|
||||
upload = QuixoteUpload('/foo/test.rtf', content_type='text/rtf')
|
||||
upload.fp = StringIO.StringIO()
|
||||
upload.fp.write('HELLO NEW WORLD')
|
||||
upload.fp.seek(0)
|
||||
export_to.model_file = UploadedFile(pub.app_dir, None, upload)
|
||||
wf.store()
|
||||
|
||||
resp = login(get_app(pub), username='foo', password='foo').get(form_location)
|
||||
resp = resp.form.submit('button_export_to')
|
||||
assert resp.location == form_location
|
||||
resp = resp.follow() # back to form page
|
||||
|
||||
assert resp.click('test.rtf', index=0).follow().body == 'HELLO WORLD'
|
||||
assert resp.click('test.rtf', index=1).follow().body == 'HELLO NEW WORLD'
|
||||
|
||||
def test_formdata_form_file_download(pub):
|
||||
create_user(pub)
|
||||
|
|
|
@ -24,14 +24,21 @@ from wcs.forms.common import FormStatusPage, FileDirectory
|
|||
|
||||
def lookup_wf_attachment(self, filename):
|
||||
# supports for URLs such as /$formdata/$id/files/attachment/test.txt
|
||||
# and /$formdata/$id/files/attachment-$file-reference/test.txt
|
||||
if self.reference.split('-')[0] != 'attachment':
|
||||
return
|
||||
if '-' in self.reference:
|
||||
file_reference = self.reference.split('-', 1)[1]
|
||||
else:
|
||||
file_reference = None
|
||||
|
||||
for evo in self.formdata.evolution:
|
||||
if evo.parts:
|
||||
for p in evo.parts:
|
||||
if not isinstance(p, AttachmentEvolutionPart):
|
||||
continue
|
||||
if file_reference and os.path.basename(p.filename) != file_reference:
|
||||
continue
|
||||
if p.base_filename == filename:
|
||||
return p
|
||||
|
||||
|
@ -50,7 +57,8 @@ def form_attachment(self):
|
|||
if not isinstance(p, AttachmentEvolutionPart):
|
||||
continue
|
||||
if os.path.basename(p.filename) == fn:
|
||||
return redirect(self.filled.get_url() + 'files/attachment/' + p.base_filename)
|
||||
return redirect( '%sfiles/attachment-%s/%s' % (
|
||||
self.filled.get_url(), fn, p.base_filename))
|
||||
|
||||
raise TraversalError()
|
||||
|
||||
|
|
Loading…
Reference in New Issue