From fd2a871543320404f914c88ee3de5fc1d866f703 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fr=C3=A9d=C3=A9ric=20P=C3=A9ters?= Date: Fri, 23 Jun 2017 18:54:00 +0200 Subject: [PATCH] jsondatastore: attach data to store (#17166) --- .../migrations/0003_jsondata_datastore.py | 19 +++++++++++++++++++ passerelle/apps/jsondatastore/models.py | 13 +++++++++---- tests/test_jsondatastore.py | 17 ++++++++++++++++- 3 files changed, 44 insertions(+), 5 deletions(-) create mode 100644 passerelle/apps/jsondatastore/migrations/0003_jsondata_datastore.py diff --git a/passerelle/apps/jsondatastore/migrations/0003_jsondata_datastore.py b/passerelle/apps/jsondatastore/migrations/0003_jsondata_datastore.py new file mode 100644 index 0000000..9003216 --- /dev/null +++ b/passerelle/apps/jsondatastore/migrations/0003_jsondata_datastore.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('jsondatastore', '0002_auto_20170623_1844'), + ] + + operations = [ + migrations.AddField( + model_name='jsondata', + name='datastore', + field=models.ForeignKey(to='jsondatastore.JsonDataStore', null=True), + ), + ] diff --git a/passerelle/apps/jsondatastore/models.py b/passerelle/apps/jsondatastore/models.py index 5ca1ff8..dff7556 100644 --- a/passerelle/apps/jsondatastore/models.py +++ b/passerelle/apps/jsondatastore/models.py @@ -33,6 +33,8 @@ def get_hex_uuid(): class JsonData(models.Model): + datastore = models.ForeignKey('JsonDataStore', null=True) + uuid = models.CharField(_('uuid'), max_length=32, default=get_hex_uuid, editable=False, unique=True) name_id = models.CharField(max_length=256, blank=True) @@ -61,14 +63,17 @@ class JsonDataStore(BaseResource): @endpoint(perm='can_access', name='data', pattern=r'$') def list(self, request, name_id=None, **kwargs): - objects = JsonData.objects.all() + objects = JsonData.objects.filter(datastore=self) if name_id: objects = objects.filter(name_id=name_id) return {'data': [{'id': x.uuid, 'text': x.text, 'content': x.content} for x in objects]} @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'create$') def create(self, request, name_id=None, **kwargs): - attrs = {'content': json.loads(request.body)} + attrs = { + 'content': json.loads(request.body), + 'datastore': self, + } if name_id: attrs['name_id'] = name_id data = JsonData(**attrs) @@ -78,7 +83,7 @@ class JsonDataStore(BaseResource): @endpoint(perm='can_access', methods=['get', 'post'], name='data', pattern=r'(?P\w+)/$',) def get_or_replace(self, request, uuid): - data = get_object_or_404(JsonData, uuid=uuid) + data = get_object_or_404(JsonData, uuid=uuid, datastore=self) if request.method == 'POST': data.content = json.loads(request.body) self.update_text(data) @@ -87,5 +92,5 @@ class JsonDataStore(BaseResource): @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'(?P\w+)/delete$') def delete(self, request, uuid): - get_object_or_404(JsonData, uuid=uuid).delete() + get_object_or_404(JsonData, uuid=uuid, datastore=self).delete() return {'err': 0} diff --git a/tests/test_jsondatastore.py b/tests/test_jsondatastore.py index 9be0c25..2c8b346 100644 --- a/tests/test_jsondatastore.py +++ b/tests/test_jsondatastore.py @@ -15,8 +15,17 @@ def jsondatastore(db): resource_type=obj_type, resource_pk=datastore.pk) return datastore +@pytest.fixture +def jsondatastore2(db): + datastore = JsonDataStore.objects.create(slug='foobar2') + api = ApiUser.objects.create(username='all2', keytype='', key='') + obj_type = ContentType.objects.get_for_model(datastore) + AccessRight.objects.create(codename='can_access', apiuser=api, + resource_type=obj_type, resource_pk=datastore.pk) + return datastore -def test_jsondatastore(app, jsondatastore): + +def test_jsondatastore(app, jsondatastore, jsondatastore2): resp = app.get('/jsondatastore/foobar/data/') assert resp.json == {'data': []} @@ -44,6 +53,12 @@ def test_jsondatastore(app, jsondatastore): resp = app.get('/jsondatastore/foobar/data/') assert len(resp.json['data']) == 0 + resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'}) + uuid = resp.json['id'] + resp = app.get('/jsondatastore/foobar2/data/') + assert len(resp.json['data']) == 0 + + resp = app.post_json('/jsondatastore/foobar2/data/%s/delete' % uuid, status=404) def test_jsondatastore_name_id(app, jsondatastore): resp = app.get('/jsondatastore/foobar/data/') -- 2.13.1