From 2ba45999762fafff5f56eb90ce1ff7c7a0d5db5f Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 14 Sep 2016 16:15:42 +0200 Subject: [PATCH 2/2] add new version to /api/user/form API (fixes #13184) If api_version query parameter is > 0, response are formatted as '{'err': x, 'data': y}. If the user is unknown a proper error is returned. --- tests/test_api.py | 51 +++++++++++++++++++++++++++++++++++++++++++++++++++ wcs/api.py | 26 ++++++++++++++++---------- 2 files changed, 67 insertions(+), 10 deletions(-) diff --git a/tests/test_api.py b/tests/test_api.py index 23ca492..e4c2f85 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -1020,6 +1020,57 @@ def test_user_forms(pub, local_user): resp = get_app(pub).get(sign_uri('/api/user/forms', user=local_user)) assert len(resp.json) == 1 + resp = get_app(pub).get(sign_uri('/api/user/forms?NameID=xxx'), status=403) + + +def test_user_forms_v1(pub, local_user): + FormDef.wipe() + formdef = FormDef() + formdef.name = 'test' + formdef.fields = [ + fields.StringField(id='0', label='foobar', varname='foobar'), + fields.StringField(id='1', label='foobar2'),] + formdef.keywords = 'hello, world' + formdef.store() + formdef.data_class().wipe() + + resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1', user=local_user)) + assert resp.json['err'] == 0 + assert len(resp.json['data']) == 0 + + formdata = formdef.data_class()() + formdata.data = {'0': 'foo@localhost', '1': 'xxx'} + formdata.user_id = local_user.id + formdata.just_created() + formdata.jump_status('new') + formdata.store() + + resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1', user=local_user)) + resp2 = get_app(pub).get(sign_uri('/myspace/forms?api_version=1', user=local_user)) + resp3 = get_app(pub).get(sign_uri('/api/users/%s/forms?api_version=1' % local_user.id)) + assert resp.json['err'] == 0 + assert len(resp.json['data']) == 1 + assert resp.json['data'][0]['form_name'] == 'test' + assert resp.json['data'][0]['form_slug'] == 'test' + assert resp.json['data'][0]['form_status'] == 'New' + assert resp.json['data'][0]['keywords'] == ['hello', 'world'] + assert resp.json == resp2.json == resp3.json + + resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1&full=on', user=local_user)) + assert resp.json['err'] == 0 + assert resp.json['data'][0]['fields']['foobar'] == 'foo@localhost' + assert resp.json['data'][0]['keywords'] == ['hello', 'world'] + + formdef.disabled = True + formdef.store() + resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1', user=local_user)) + assert resp.json['err'] == 0 + assert len(resp.json['data']) == 1 + + resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1&NameID=xxx')) + assert resp.json == {'err': 1, 'err_desc': 'unknown user', 'data': []} + + def test_user_drafts(pub, local_user): FormDef.wipe() formdef = FormDef() diff --git a/wcs/api.py b/wcs/api.py index db83469..cd5f469 100644 --- a/wcs/api.py +++ b/wcs/api.py @@ -462,10 +462,16 @@ class ApiUserDirectory(Directory): encoding=get_publisher().site_charset) def forms(self): + api_version = get_request().get_api_version() get_response().set_content_type('application/json') - user = self.user or get_user_from_api_query_string() or get_request().user + try: + user = self.user or get_user_from_api_query_string() or get_request().user + except UnknownNameIdAccessForbiddenError: + user = None if not user: - raise AccessForbiddenError('no user specified') + if api_version < 1: + raise AccessForbiddenError('no user specified') + return json.dumps({'err': 1, 'err_desc': 'unknown user', 'data': []}) forms = [] for form in self.get_user_forms(user): if form.is_draft(): @@ -478,12 +484,13 @@ class ApiUserDirectory(Directory): id = form.get_display_id() status = visible_status.name title = _('%(name)s #%(id)s (%(status)s)') % { - 'name': name, - 'id': id, - 'status': status + 'name': name, + 'id': id, + 'status': status } url = form.get_url() - d = {'title': title, + d = { + 'title': title, 'name': form.formdef.name, 'url': url, 'datetime': misc.strftime.strftime('%Y-%m-%d %H:%M:%S', form.receipt_time), @@ -494,10 +501,9 @@ class ApiUserDirectory(Directory): if get_request().form.get('full') == 'on': d.update(form.get_json_export_dict(include_files=False)) forms.append(d) - - return json.dumps(forms, - cls=misc.JSONEncoder, - encoding=get_publisher().site_charset) + if api_version > 0: + forms = {'err': 0, 'data': forms} + return json.dumps(forms, cls=misc.JSONEncoder, encoding=get_publisher().site_charset) class ApiUsersDirectory(Directory): -- 2.1.4