From 9a518faa6322f0d75fb310be060b7131103929b2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Wed, 4 May 2016 14:48:49 +0200 Subject: [PATCH] api: encode files that may exist in workflow_data (#10769) --- tests/test_api.py | 37 +++++++++++++++++++++++++++++++++++++ wcs/qommon/misc.py | 9 +++++++++ 2 files changed, 46 insertions(+) diff --git a/tests/test_api.py b/tests/test_api.py index 7ce5a62..e76b248 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -846,6 +846,43 @@ def test_formdata_edit(pub, local_user): assert formdef.data_class().select()[0].data['0'] == 'bar2@localhost' assert formdef.data_class().select()[0].status == 'wf-rejected' +def test_formdata_with_workflow_data(pub, local_user): + Role.wipe() + role = Role(name='test') + role.id = '123' + role.store() + + local_user.roles = [role.id] + local_user.store() + + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [] + workflow = Workflow.get_default_workflow() + workflow.id = '2' + workflow.store() + formdef.workflow_id = workflow.id + formdef.workflow_roles = {'_receiver': role.id} + formdef.store() + + formdef.data_class().wipe() + formdata = formdef.data_class()() + formdata.just_created() + formdata.status = 'wf-new' + formdata.evolution[-1].status = 'wf-new' + + upload = PicklableUpload('test.txt', 'text/plain', 'ascii') + upload.receive(['test']) + formdata.workflow_data = {'blah': upload, 'xxx': 23} + formdata.store() + + resp = get_app(pub).get( + sign_uri('/api/forms/test/%s/' % formdata.id, user=local_user)) + assert resp.json['workflow']['data']['xxx'] == 23 + assert resp.json['workflow']['data']['blah']['filename'] == 'test.txt' + assert resp.json['workflow']['data']['blah']['content_type'] == 'text/plain' + assert base64.decodestring(resp.json['workflow']['data']['blah']['content']) == 'test' def test_user_by_nameid(pub, local_user): resp = get_app(pub).get(sign_uri('/api/users/xyz/', user=local_user), diff --git a/wcs/qommon/misc.py b/wcs/qommon/misc.py index 30c282c..0ff18d3 100644 --- a/wcs/qommon/misc.py +++ b/wcs/qommon/misc.py @@ -427,6 +427,15 @@ class JSONEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, time.struct_time): return datetime.datetime.utcfromtimestamp(time.mktime(obj)).isoformat() + 'Z' + + from .form import PicklableUpload + if isinstance(obj, PicklableUpload): + return { + 'filename': obj.base_filename, + 'content_type': obj.content_type or 'application/octet-stream', + 'content': base64.b64encode(obj.get_content()), + } + # Let the base class default method raise the TypeError return json.JSONEncoder.default(self, obj) -- 2.8.1