From fb2295232bf9eb6165e0ae9c492bcce7b835af64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Mon, 18 Jul 2016 19:03:19 +0200 Subject: [PATCH 2/2] workflows: allow setting backoffice file field from a dict (#12629) --- tests/test_workflows.py | 19 +++++++++++++++++++ wcs/wf/backoffice_fields.py | 12 ++++++++++++ 2 files changed, 31 insertions(+) diff --git a/tests/test_workflows.py b/tests/test_workflows.py index 0867d9f..48a2c34 100644 --- a/tests/test_workflows.py +++ b/tests/test_workflows.py @@ -1734,6 +1734,25 @@ def test_set_backoffice_field_file(pub): formdata = formdef.data_class().get(formdata.id) assert formdata.data['bo1'].base_filename == 'xxx.xml' + # check storing a file from an assembled dictionary + item = SetBackofficeFieldsWorkflowStatusItem() + item.fields = [{'field_id': 'bo1', + 'value': '={"content": "hello world", "filename": "hello.txt"}'}] + item.perform(formdata) + + formdata = formdef.data_class().get(formdata.id) + assert formdata.data['bo1'].base_filename == 'hello.txt' + assert formdata.data['bo1'].get_content() == 'hello world' + + item = SetBackofficeFieldsWorkflowStatusItem() + item.fields = [{'field_id': 'bo1', + 'value': '={"b64_content": "SEVMTE8gV09STEQ=", "filename": "hello.txt"}'}] + item.perform(formdata) + + formdata = formdef.data_class().get(formdata.id) + assert formdata.data['bo1'].base_filename == 'hello.txt' + assert formdata.data['bo1'].get_content() == 'HELLO WORLD' + # check wrong value del formdata.data['bo1'] formdata.store() diff --git a/wcs/wf/backoffice_fields.py b/wcs/wf/backoffice_fields.py index 30bf06e..4c1874b 100644 --- a/wcs/wf/backoffice_fields.py +++ b/wcs/wf/backoffice_fields.py @@ -93,6 +93,18 @@ class SetBackofficeFieldsWorkflowStatusItem(WorkflowStatusItem): upload.receive([new_value.content]) return upload + if isinstance(new_value, dict): + # if value is a dictionary we expect it to have a content or + # b64_content key and a filename keys and an optional + # content_type key. + if 'b64_content' in new_value: + new_value['content'] = base64.decodestring(new_value['b64_content']) + if 'filename' in new_value and 'content' in new_value: + upload = PicklableUpload(new_value['filename'], + new_value.get('content_type') or 'application/octet-stream') + upload.receive(new_value['content']) + return upload + raise ValueError('invalid data for file type (%r)' % new_value) def perform(self, formdata): -- 2.8.1