0001-misc-allow-downloading-file-while-submitting-66460.patch
tests/form_pages/test_all.py | ||
---|---|---|
2528 | 2528 |
assert resp.location.startswith('http://example.net/test/?mt=') |
2529 | 2529 |
resp = resp.follow() |
2530 | 2530 |
resp = resp.forms[1].submit('previous') |
2531 |
assert '<span class="filename">test.txt</span>' in resp.text |
|
2531 |
assert resp.pyquery('.filename').text() == 'test.txt' |
|
2532 |
# check file is downloadable |
|
2533 |
r2 = resp.click('test.txt') |
|
2534 |
assert r2.content_type == 'text/plain' |
|
2535 |
assert r2.text == 'foobar' |
|
2532 | 2536 | |
2533 | 2537 |
# check submitted form keeps the file |
2534 | 2538 |
resp = resp.forms[1].submit('submit') # -> confirmation page |
... | ... | |
8757 | 8761 |
resp = resp.follow() |
8758 | 8762 |
resp = resp.follow() |
8759 | 8763 |
assert 'zob' in resp |
8764 |
assert resp.click('test.txt').text == 'foobar' |
|
8760 | 8765 |
resp = resp.forms[1].submit('submit') # -> validation |
8761 | 8766 |
resp = resp.forms[1].submit('submit') # -> submission |
8762 | 8767 |
assert create_formdata['target_formdef'].data_class().count() == 1 |
tests/form_pages/test_file_field.py | ||
---|---|---|
215 | 215 |
resp = resp.forms[0].submit('submit') |
216 | 216 |
assert 'Check values then click submit.' in resp.text |
217 | 217 |
assert '<img alt="" src="tempfile?' in resp.text |
218 |
tempfile_id = resp.text[resp.text.index('tempfile?') :].split('&', 1)[0].split('=')[1]
|
|
218 |
tempfile_id = resp.pyquery('.fileinfo .filename a').attr.href.split('=')[1]
|
|
219 | 219 | |
220 | 220 |
resp_tempfile = app.get('/test/tempfile?t=%s' % tempfile_id) |
221 | 221 |
assert resp_tempfile.body == image_content |
wcs/forms/common.py | ||
---|---|---|
133 | 133 | |
134 | 134 | |
135 | 135 |
class FormStatusPage(Directory, FormTemplateMixin): |
136 |
_q_exports_orig = ['', 'download', 'json', 'action', 'live'] |
|
136 |
_q_exports_orig = ['', 'download', 'json', 'action', 'live', 'tempfile']
|
|
137 | 137 |
_q_extra_exports = [] |
138 | 138 |
form_page_class = None |
139 | 139 | |
... | ... | |
144 | 144 |
def html_top(self, title=None): |
145 | 145 |
template.html_top(title=title, default_org=_('Forms')) |
146 | 146 | |
147 |
def __init__(self, formdef, filled, register_workflow_subdirs=True, custom_view=None): |
|
147 |
def __init__(self, formdef, filled, register_workflow_subdirs=True, custom_view=None, parent_view=None):
|
|
148 | 148 |
get_publisher().substitutions.feed(filled) |
149 | 149 |
self.formdef = formdef |
150 | 150 |
self.formdata = filled |
151 | 151 |
self.filled = filled |
152 | 152 |
self.custom_view = custom_view |
153 |
self.parent_view = parent_view |
|
153 | 154 |
self._q_exports = self._q_exports_orig[:] |
154 | 155 |
for q in self._q_extra_exports: |
155 | 156 |
if q not in self._q_exports: |
... | ... | |
205 | 206 |
anonymise=anonymise, include_files=get_query_flag('include-files-content', default=True) |
206 | 207 |
) |
207 | 208 | |
209 |
def tempfile(self): |
|
210 |
# allow for file uploaded via a file widget in a workflow form |
|
211 |
# to be downloaded back from widget |
|
212 |
return self.parent_view.tempfile() |
|
213 | ||
208 | 214 |
def workflow_messages(self, position='top'): |
209 | 215 |
if self.formdef.workflow: |
210 | 216 |
workflow_messages = self.filled.get_workflow_messages(position=position, user=get_request().user) |
wcs/forms/root.py | ||
---|---|---|
1785 | 1785 |
except KeyError: |
1786 | 1786 |
raise errors.TraversalError() |
1787 | 1787 | |
1788 |
return self.get_status_page_class()(self.formdef, filled) |
|
1788 |
return self.get_status_page_class()(self.formdef, filled, parent_view=self)
|
|
1789 | 1789 | |
1790 | 1790 | |
1791 | 1791 |
class RootDirectory(AccessControlled, Directory): |
... | ... | |
2131 | 2131 | |
2132 | 2132 | |
2133 | 2133 |
class PublicFormStatusPage(FormStatusPage): |
2134 |
_q_exports_orig = ['', 'download', 'status', 'live'] |
|
2134 |
_q_exports_orig = ['', 'download', 'status', 'live', 'tempfile']
|
|
2135 | 2135 |
form_page_class = FormPage |
2136 | 2136 |
history_templates = ['wcs/front/formdata_history.html', 'wcs/formdata_history.html'] |
2137 | 2137 |
status_templates = ['wcs/front/formdata_status.html', 'wcs/formdata_status.html'] |
wcs/qommon/static/js/qommon.fileupload.js | ||
---|---|---|
316 | 316 |
return; |
317 | 317 |
} |
318 | 318 |
$(base_widget).find('.fileprogress').hide(); |
319 |
$(base_widget).find('.filename').text(data.result[0].name); |
|
319 |
if (data.result[0].url) { |
|
320 |
$(base_widget).find('.filename').empty().append( |
|
321 |
$('<a>', {href: data.result[0].url, download: data.result[0].name, text: data.result[0].name})); |
|
322 |
} else { |
|
323 |
$(base_widget).find('.filename').text(data.result[0].name); |
|
324 |
} |
|
320 | 325 |
$(base_widget).find('.fileinfo').show(); |
321 | 326 |
$(base_widget).find('input[type=hidden]').val(data.result[0].token); |
322 | 327 |
$(base_widget).parents('form').find('div.buttons button').prop('disabled', false); |
wcs/qommon/templates/qommon/forms/widgets/file.html | ||
---|---|---|
24 | 24 |
data-error="{% trans "Error during upload." %}"></div> |
25 | 25 |
</div> |
26 | 26 |
<div class="fileinfo {% if widget.readonly and widget.has_tempfile_image %}thumbnail{% endif %}"> |
27 |
<span class="filename">{{ widget.tempfile.base_filename }}</span> |
|
27 |
<span class="filename">{% if widget.tempfile %}<a |
|
28 |
href="tempfile?t={{ widget.tempfile.token }}" |
|
29 |
download="{{widget.tempfile.base_filename}}" |
|
30 |
>{{ widget.tempfile.base_filename }}</a>{% endif %}</span> |
|
28 | 31 |
{% if not widget.readonly %} |
29 | 32 |
<a href="#" role="button" class="remove" title="{% trans 'Remove this file' %}">{% trans "remove" %}</a> |
30 | 33 |
{% elif widget.has_tempfile_image %} |
wcs/root.py | ||
---|---|---|
328 | 328 |
'type': tempfile.get('content_type'), |
329 | 329 |
'size': tempfile.get('size'), |
330 | 330 |
'token': tempfile.get('token'), |
331 |
'url': 'tempfile?t=%s' % tempfile.get('token'), |
|
331 | 332 |
} |
332 | 333 |
) |
333 | 334 |
except UploadStorageError as e: |
334 |
- |