api: add API to check for tracking code existence (#12435)

This commit is contained in:
Frédéric Péters 2016-07-08 20:14:11 +02:00
parent 45d86788b3
commit 53f7bc9d06
3 changed files with 71 additions and 1 deletions

View File

@ -347,5 +347,25 @@ n'est pas nécessaire de préciser l'identifiant d'un utilisateur.
</section>
<section id="tracking-code">
<title>Code de suivi</title>
<p>
Une API existe pour déterminer l'existence d'un code de suivi et, le cas
échéant, découvrir la demande associée.
</p>
<screen>
<output style="prompt">$ </output><input>curl -H "Accept: application/json" \
https://www.example.net/api/code/QRFPTSLR</input>
<output>{"url": "http://www.example.net/demarche/23", "err": 0}</output>
</screen>
<p>
En cas d'inexistence du code de suivi donné, une réponse avec un code de retour
404 est retourné.
</p>
</section>
</page>

View File

@ -1353,6 +1353,38 @@ def test_workflow_trigger(pub, local_user):
resp = get_app(pub).post(sign_uri(formdata.get_url() + 'jump/trigger/XXX'),
status=403)
def test_tracking_code(pub):
FormDef.wipe()
formdef = FormDef()
formdef.name = 'test'
formdef.fields = []
formdef.enable_tracking_codes = True
formdef.store()
data_class = formdef.data_class()
formdata = data_class()
formdata.store()
code = get_publisher().tracking_code_class()
code.formdata = formdata
code.store()
resp = get_app(pub).get('/api/code/foobar', status=404)
assert resp.json['err'] == 1
resp = get_app(pub).get('/api/code/%s' % code.id, status=200)
assert resp.json['err'] == 0
assert resp.json['url'] == 'http://example.net/test/%s' % formdata.id
formdef.enable_tracking_codes = False
formdef.store()
resp = get_app(pub).get('/api/code/%s' % code.id, status=404)
formdef.enable_tracking_codes = True
formdef.store()
formdata.remove_self()
resp = get_app(pub).get('/api/code/%s' % code.id, status=404)
@pytest.fixture(params=['sql', 'pickle'])
def no_request_pub(request):
pub = create_temporary_pub(sql_mode=bool(request.param == 'sql'))

View File

@ -552,15 +552,33 @@ class ApiUsersDirectory(Directory):
return ApiUserDirectory(user)
class ApiTrackingCodeDirectory(Directory):
def _q_lookup(self, component):
get_response().set_content_type('application/json')
try:
tracking_code = get_publisher().tracking_code_class.get(component)
except KeyError:
raise TraversalError()
try:
formdata = tracking_code.formdata
except KeyError:
raise TraversalError()
if formdata.formdef.enable_tracking_codes is False:
raise TraversalError()
data = {'err': 0, 'url': formdata.get_url().rstrip('/')}
return json.dumps(data)
class ApiDirectory(Directory):
_q_exports = ['forms', 'roles', ('reverse-geocoding', 'reverse_geocoding'),
'formdefs', 'categories', 'user', 'users']
'formdefs', 'categories', 'user', 'users', 'code']
forms = ApiFormsDirectory()
formdefs = ApiFormdefsDirectory()
categories = ApiCategoriesDirectory()
user = ApiUserDirectory()
users = ApiUsersDirectory()
code = ApiTrackingCodeDirectory()
def reverse_geocoding(self):
try: