From 0a9ba667cf1694bb9d3284ebe5c37ca8a259fb31 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Sat, 24 Sep 2022 20:33:04 +0200 Subject: [PATCH] forms: allow prefilling of file fields (#46929) --- tests/form_pages/test_file_field.py | 23 +++++++++++++++++++++++ wcs/fields.py | 3 +++ 2 files changed, 26 insertions(+) diff --git a/tests/form_pages/test_file_field.py b/tests/form_pages/test_file_field.py index 9be4a6a61..ef01a99ee 100644 --- a/tests/form_pages/test_file_field.py +++ b/tests/form_pages/test_file_field.py @@ -396,3 +396,26 @@ def test_form_file_field_with_wrong_value(pub): assert logged_error.summary == 'Failed to set value on field "file"' assert logged_error.exception_class == 'AttributeError' assert logged_error.exception_message == "'str' object has no attribute 'time'" + + +def test_form_file_field_prefill(pub): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [ + fields.FileField( + id='0', + label='file', + prefill={'type': 'string', 'value': '{{ "test"|qrcode }}'}, + ) + ] + formdef.store() + + resp = get_app(pub).get('/test/') + assert resp.form['f0$token'] + assert resp.click('qrcode.png').content_type == 'image/png' + resp = resp.form.submit('submit') # -> validation + resp = resp.form.submit('submit') # -> submit + formdata = formdef.data_class().select()[0] + assert formdata.data['0'].base_filename == 'qrcode.png' + assert formdata.data['0'].get_content().startswith(b'\x89PNG') diff --git a/wcs/fields.py b/wcs/fields.py index 9bc9a20ff..6ab5d7e63 100644 --- a/wcs/fields.py +++ b/wcs/fields.py @@ -1672,6 +1672,9 @@ class FileField(WidgetField): def get_view_short_value(self, value, max_len=30, **kwargs): return self.get_view_value(value, include_image_thumbnail=False, max_len=max_len, **kwargs) + def get_prefill_value(self, user=None, force_string=True): + return super().get_prefill_value(user=user, force_string=False) + def get_download_query_string(self, **kwargs): if kwargs.get('file_value'): return 'hash=%s' % kwargs.get('file_value').file_digest()