From 9bbeea34c894b341186cdfbf7caa14b387bd2c6f Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 14 Sep 2016 16:15:42 +0200 Subject: [PATCH] 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. --- help/fr/api-user.page | 75 +++++++++++++++++++++++++++++++++++++++++++++++++-- tests/test_api.py | 51 +++++++++++++++++++++++++++++++++++ wcs/api.py | 26 +++++++++++------- 3 files changed, 140 insertions(+), 12 deletions(-) diff --git a/help/fr/api-user.page b/help/fr/api-user.page index 10c6bc4..776b57f 100644 --- a/help/fr/api-user.page +++ b/help/fr/api-user.page @@ -58,12 +58,82 @@ l'adresse /user.

La liste des formulaires transmis par un utilisateur est accessible à l'URL - /api/user/forms, elle reprend un ensemble minimal + /api/user/forms?api_version=1, elle reprend un ensemble minimal d'informations concernant chacun de ceux-ci.

$ curl https://www.example.net/api/user/forms -[ +{ + "err": 0, + "data": [ + { + "category_id": "1", + "category_name": "Divers", + "datetime": "2014-03-28 15:36:52", + "form_name": "Demande d'inscription", + "form_slug": "demande-d-inscription", + "form_number": "123", + "form_number_raw": "123", + "form_receipt_date": "28/03/2014", + "form_receipt_time": "15:36", + "form_status": "Nouveau", + "form_status_is_endpoint": false, + "form_uri": "demande-d-inscription/123/", + "form_url": "http://www.example.net/demande-d-inscription/123/", + "form_url_backoffice": "http://www.example.net/backoffice/demande-d-inscription/123/", + "name": "Demande d'inscription", + "status": "Nouveau", + "title": "Demande d'inscription #123 (Nouveau)", + "url": "http://www.example.net/demande-d-inscription/123/", + }, + { + "category_id": "2", + "category_name": "Prise de rendez-vous", + "datetime": "2014-03-17 10:39:52", + "form_name": "Rendez-vous avec le service B", + "form_slug": "rendez-vous-service-b", + "form_number": "456", + "form_number_raw": "456", + "form_receipt_date": "17/03/2014", + "form_receipt_time": "10:39", + "form_status": "En cours", + "form_status_is_endpoint": false, + "form_uri": "rendez-vous-service-b/456/", + "form_url": "http://www.example.net/rendez-vous-service-b/456/", + "form_url_backoffice": "http://www.example.net/backoffice/rendez-vous-service-b/456/", + "name": "Rendez-vous avec le service B"", + "status": "Nouveau", + "title": "Rendez-vous avec le service B #456 (En cours)", + "url": "http://www.example.net/rendez-vous-service-b/456/", + }, + { + "category_id": "3", + "category_name": "Modification de vos coordonn\u00e9es", + "datetime": "2014-03-17 10:42:17", + "form_name": "Changement d'adresse", + "form_slug": "changement-d-adresse", + "form_number": "424", + "form_number_raw": "424", + "form_receipt_date": "17/03/2014", + "form_receipt_time": "10:42", + "form_status": "Traitement de la demande termin\u00e9", + "form_status_is_endpoint": true, + "form_uri": "changement-d-adresse/424/", + "form_url": "http://www.example.net/changement-d-adresse/424/", + "form_url_backoffice": "http://www.example.net/backoffice/changement-d-adresse/424/", + "name": "Changement d'adresse", + "status": "Traitement de la demande termin\u00e9", + "title": "Changement d'adresse #424 (Traitement de la demande termin\u00e9)", + "url": "http://www.example.net/changement-d-adresse/424/", + } + ] +} + + +

Cette API a évoluée, l'ancien format est toujours disponible en enlevant le paramètre +?api_version=1. +

+[ { "category_id": "1", "category_name": "Divers", @@ -125,6 +195,7 @@ l'adresse /user. "url": "http://www.example.net/changement-d-adresse/424/", } ] +

Il est possible de recevoir un ensemble plus complet de données en passant un 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