Projet

Général

Profil

0001-misc-allow-downloading-file-while-submitting-66460.patch

Frédéric Péters, 26 juin 2022 09:21

Télécharger (7,66 ko)

Voir les différences:

Subject: [PATCH] misc: allow downloading file while submitting (#66460)

 tests/form_pages/test_all.py                        |  7 ++++++-
 tests/form_pages/test_file_field.py                 |  2 +-
 wcs/forms/common.py                                 | 10 ++++++++--
 wcs/forms/root.py                                   |  4 ++--
 wcs/qommon/static/js/qommon.fileupload.js           |  7 ++++++-
 wcs/qommon/templates/qommon/forms/widgets/file.html |  5 ++++-
 wcs/root.py                                         |  1 +
 7 files changed, 28 insertions(+), 8 deletions(-)
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
-