Projet

Général

Profil

0001-add-new-version-to-api-user-form-API-fixes-13184.patch

Benjamin Dauvergne, 30 septembre 2016 09:18

Télécharger (9,28 ko)

Voir les différences:

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(-)
help/fr/api-user.page
58 58

  
59 59
    <p>
60 60
    La liste des formulaires transmis par un utilisateur est accessible à l'URL
61
    <code>/api/user/forms</code>, elle reprend un ensemble minimal
61
    <code>/api/user/forms?api_version=1</code>, elle reprend un ensemble minimal
62 62
    d'informations concernant chacun de ceux-ci.
63 63
    </p>
64 64
<screen>
65 65
<output style="prompt">$ </output><input>curl https://www.example.net/api/user/forms</input>
66
<output>[
66
<output>{
67
    "err": 0,
68
    "data": [
69
        {
70
            "category_id": "1",
71
            "category_name": "Divers",
72
            "datetime": "2014-03-28 15:36:52",
73
            "form_name": "Demande d'inscription",
74
            "form_slug": "demande-d-inscription",
75
            "form_number": "123",
76
            "form_number_raw": "123",
77
            "form_receipt_date": "28/03/2014",
78
            "form_receipt_time": "15:36",
79
            "form_status": "Nouveau",
80
            "form_status_is_endpoint": false,
81
            "form_uri": "demande-d-inscription/123/",
82
            "form_url": "http://www.example.net/demande-d-inscription/123/",
83
            "form_url_backoffice": "http://www.example.net/backoffice/demande-d-inscription/123/",
84
            "name": "Demande d'inscription",
85
            "status": "Nouveau",
86
            "title": "Demande d'inscription #123 (Nouveau)",
87
            "url": "http://www.example.net/demande-d-inscription/123/",
88
        },
89
        {
90
            "category_id": "2",
91
            "category_name": "Prise de rendez-vous",
92
            "datetime": "2014-03-17 10:39:52",
93
            "form_name": "Rendez-vous avec le service B",
94
            "form_slug": "rendez-vous-service-b",
95
            "form_number": "456",
96
            "form_number_raw": "456",
97
            "form_receipt_date": "17/03/2014",
98
            "form_receipt_time": "10:39",
99
            "form_status": "En cours",
100
            "form_status_is_endpoint": false,
101
            "form_uri": "rendez-vous-service-b/456/",
102
            "form_url": "http://www.example.net/rendez-vous-service-b/456/",
103
            "form_url_backoffice": "http://www.example.net/backoffice/rendez-vous-service-b/456/",
104
            "name": "Rendez-vous avec le service B"",
105
            "status": "Nouveau",
106
            "title": "Rendez-vous avec le service B #456 (En cours)",
107
            "url": "http://www.example.net/rendez-vous-service-b/456/",
108
        },
109
        {
110
            "category_id": "3",
111
            "category_name": "Modification de vos coordonn\u00e9es",
112
            "datetime": "2014-03-17 10:42:17",
113
            "form_name": "Changement d'adresse",
114
            "form_slug": "changement-d-adresse",
115
            "form_number": "424",
116
            "form_number_raw": "424",
117
            "form_receipt_date": "17/03/2014",
118
            "form_receipt_time": "10:42",
119
            "form_status": "Traitement de la demande termin\u00e9",
120
            "form_status_is_endpoint": true,
121
            "form_uri": "changement-d-adresse/424/",
122
            "form_url": "http://www.example.net/changement-d-adresse/424/",
123
            "form_url_backoffice": "http://www.example.net/backoffice/changement-d-adresse/424/",
124
            "name": "Changement d'adresse",
125
            "status": "Traitement de la demande termin\u00e9",
126
            "title": "Changement d'adresse #424 (Traitement de la demande termin\u00e9)",
127
            "url": "http://www.example.net/changement-d-adresse/424/",
128
        }
129
    ]
130
}</output></screen>
131

  
132
<note>
133
<p>Cette API a évoluée, l'ancien format est toujours disponible en enlevant le paramètre
134
<code>?api_version=1</code>.
135
</p>
136
<screen><output>[
67 137
    {
68 138
        "category_id": "1",
69 139
        "category_name": "Divers",
......
125 195
        "url": "http://www.example.net/changement-d-adresse/424/",
126 196
    }
127 197
]</output></screen>
198
</note>
128 199

  
129 200
<p>
130 201
Il est possible de recevoir un ensemble plus complet de données en passant un
tests/test_api.py
1020 1020
    resp = get_app(pub).get(sign_uri('/api/user/forms', user=local_user))
1021 1021
    assert len(resp.json) == 1
1022 1022

  
1023
    resp = get_app(pub).get(sign_uri('/api/user/forms?NameID=xxx'), status=403)
1024

  
1025

  
1026
def test_user_forms_v1(pub, local_user):
1027
    FormDef.wipe()
1028
    formdef = FormDef()
1029
    formdef.name = 'test'
1030
    formdef.fields = [
1031
        fields.StringField(id='0', label='foobar', varname='foobar'),
1032
        fields.StringField(id='1', label='foobar2'),]
1033
    formdef.keywords = 'hello, world'
1034
    formdef.store()
1035
    formdef.data_class().wipe()
1036

  
1037
    resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1', user=local_user))
1038
    assert resp.json['err'] == 0
1039
    assert len(resp.json['data']) == 0
1040

  
1041
    formdata = formdef.data_class()()
1042
    formdata.data = {'0': 'foo@localhost', '1': 'xxx'}
1043
    formdata.user_id = local_user.id
1044
    formdata.just_created()
1045
    formdata.jump_status('new')
1046
    formdata.store()
1047

  
1048
    resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1', user=local_user))
1049
    resp2 = get_app(pub).get(sign_uri('/myspace/forms?api_version=1', user=local_user))
1050
    resp3 = get_app(pub).get(sign_uri('/api/users/%s/forms?api_version=1' % local_user.id))
1051
    assert resp.json['err'] == 0
1052
    assert len(resp.json['data']) == 1
1053
    assert resp.json['data'][0]['form_name'] == 'test'
1054
    assert resp.json['data'][0]['form_slug'] == 'test'
1055
    assert resp.json['data'][0]['form_status'] == 'New'
1056
    assert resp.json['data'][0]['keywords'] == ['hello', 'world']
1057
    assert resp.json == resp2.json == resp3.json
1058

  
1059
    resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1&full=on', user=local_user))
1060
    assert resp.json['err'] == 0
1061
    assert resp.json['data'][0]['fields']['foobar'] == 'foo@localhost'
1062
    assert resp.json['data'][0]['keywords'] == ['hello', 'world']
1063

  
1064
    formdef.disabled = True
1065
    formdef.store()
1066
    resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1', user=local_user))
1067
    assert resp.json['err'] == 0
1068
    assert len(resp.json['data']) == 1
1069

  
1070
    resp = get_app(pub).get(sign_uri('/api/user/forms?api_version=1&NameID=xxx'))
1071
    assert resp.json == {'err': 1, 'err_desc': 'unknown user', 'data': []}
1072

  
1073

  
1023 1074
def test_user_drafts(pub, local_user):
1024 1075
    FormDef.wipe()
1025 1076
    formdef = FormDef()
wcs/api.py
462 462
                encoding=get_publisher().site_charset)
463 463

  
464 464
    def forms(self):
465
        api_version = get_request().get_api_version()
465 466
        get_response().set_content_type('application/json')
466
        user = self.user or get_user_from_api_query_string() or get_request().user
467
        try:
468
            user = self.user or get_user_from_api_query_string() or get_request().user
469
        except UnknownNameIdAccessForbiddenError:
470
            user = None
467 471
        if not user:
468
            raise AccessForbiddenError('no user specified')
472
            if api_version < 1:
473
                raise AccessForbiddenError('no user specified')
474
            return json.dumps({'err': 1, 'err_desc': 'unknown user', 'data': []})
469 475
        forms = []
470 476
        for form in self.get_user_forms(user):
471 477
            if form.is_draft():
......
478 484
            id = form.get_display_id()
479 485
            status = visible_status.name
480 486
            title = _('%(name)s #%(id)s (%(status)s)') % {
481
                    'name': name,
482
                    'id': id,
483
                    'status': status
487
                'name': name,
488
                'id': id,
489
                'status': status
484 490
            }
485 491
            url = form.get_url()
486
            d = {'title': title,
492
            d = {
493
                'title': title,
487 494
                'name': form.formdef.name,
488 495
                'url': url,
489 496
                'datetime': misc.strftime.strftime('%Y-%m-%d %H:%M:%S', form.receipt_time),
......
494 501
            if get_request().form.get('full') == 'on':
495 502
                d.update(form.get_json_export_dict(include_files=False))
496 503
            forms.append(d)
497

  
498
        return json.dumps(forms,
499
                cls=misc.JSONEncoder,
500
                encoding=get_publisher().site_charset)
504
        if api_version > 0:
505
            forms = {'err': 0, 'data': forms}
506
        return json.dumps(forms, cls=misc.JSONEncoder, encoding=get_publisher().site_charset)
501 507

  
502 508

  
503 509
class ApiUsersDirectory(Directory):
504
-