workflows: send correct file when multiple ones share the same name (#8453)

This commit is contained in:
Frédéric Péters 2015-10-01 10:39:50 +02:00
parent 8f76953579
commit 68e26d3997
2 changed files with 80 additions and 2 deletions

View File

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

View File

@ -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()