From 8c51c5105f36123a670a910b1712e2f7b664e946 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 5 Jan 2018 14:34:45 +0100 Subject: [PATCH] jsondatastore: add a new get_by_attribute endpoint (#20705) --- passerelle/apps/jsondatastore/models.py | 19 ++++++++++++++++++- tests/test_jsondatastore.py | 29 +++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/passerelle/apps/jsondatastore/models.py b/passerelle/apps/jsondatastore/models.py index ae6e380..dd8f23f 100644 --- a/passerelle/apps/jsondatastore/models.py +++ b/passerelle/apps/jsondatastore/models.py @@ -24,7 +24,7 @@ from django.utils.translation import ugettext_lazy as _ from jsonfield import JSONField from passerelle.base.models import BaseResource -from passerelle.utils.api import endpoint +from passerelle.utils.api import endpoint, APIError def get_hex_uuid(): @@ -116,3 +116,20 @@ class JsonDataStore(BaseResource): # delete() would collide with Model.delete() self.get_data_object(uuid, name_id).delete() return {} + + @endpoint(perm='can_access', name='data', + pattern=r'by/(?P[\w-]+)/$', + example_pattern='by/{attribute}/', + description=_('Get a single object by attribute'), + parameters={'attribute': {'description': _('Attribute name'), 'example_value': 'code'}, + 'value': {'description': _('Attribute value'), 'example_value': '12345'}, + }, + ) + def get_by_attribute(self, request, attribute, value, name_id=None): + objects = JsonData.objects.filter(datastore=self) + if name_id: + objects = objects.filter(name_id=name_id) + for data in objects: + if data.content and data.content.get(attribute) == value: + return {'id': data.uuid, 'text': data.text, 'content': data.content} + raise APIError('no such object') diff --git a/tests/test_jsondatastore.py b/tests/test_jsondatastore.py index c3b08c7..a233df9 100644 --- a/tests/test_jsondatastore.py +++ b/tests/test_jsondatastore.py @@ -105,3 +105,32 @@ def test_jsondatastore_template(app, jsondatastore): resp = app.get('/jsondatastore/foobar/data/') assert len(resp.json['data']) == 1 assert resp.json['data'][0]['text'] == 'bar' + +def test_jsondatastore_get_by_attribute(app, jsondatastore): + resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'}) + uuid = resp.json['id'] + resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar2'}) + uuid2 = resp.json['id'] + + resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar'}) + assert resp.json['id'] == uuid + + resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar2'}) + assert resp.json['id'] == uuid2 + + resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3'}) + assert resp.json['err'] == 1 + + resp = app.post_json('/jsondatastore/foobar/data/create?name_id=xxx', params={'foo': 'bar3'}) + uuid = resp.json['id'] + resp = app.post_json('/jsondatastore/foobar/data/create?name_id=yyy', params={'foo': 'bar3'}) + uuid2 = resp.json['id'] + + resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3', 'name_id': 'xxx'}) + assert resp.json['id'] == uuid + + resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3', 'name_id': 'yyy'}) + assert resp.json['id'] == uuid2 + + resp = app.get('/jsondatastore/foobar/data/by/foo/', params={'value': 'bar3', 'name_id': 'zzz'}) + assert resp.json['err'] == 1 -- 2.15.1