From 119ccc148759b15c75513ab64aeb101b1b22116b 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:44:54 +0200 Subject: [PATCH] jsondatastore: add possibility of a template to create a "text" key (#17162) --- .../migrations/0002_auto_20170623_1844.py | 24 ++++++++++++++++++++++ passerelle/apps/jsondatastore/models.py | 20 +++++++++++++++--- tests/test_jsondatastore.py | 9 ++++++++ 3 files changed, 50 insertions(+), 3 deletions(-) create mode 100644 passerelle/apps/jsondatastore/migrations/0002_auto_20170623_1844.py diff --git a/passerelle/apps/jsondatastore/migrations/0002_auto_20170623_1844.py b/passerelle/apps/jsondatastore/migrations/0002_auto_20170623_1844.py new file mode 100644 index 0000000..35af9ab --- /dev/null +++ b/passerelle/apps/jsondatastore/migrations/0002_auto_20170623_1844.py @@ -0,0 +1,24 @@ +# -*- coding: utf-8 -*- +from __future__ import unicode_literals + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('jsondatastore', '0001_initial'), + ] + + operations = [ + migrations.AddField( + model_name='jsondata', + name='text', + field=models.CharField(max_length=256, blank=True), + ), + migrations.AddField( + model_name='jsondatastore', + name='text_key_template', + field=models.CharField(max_length=256, verbose_name='Template for text key', blank=True), + ), + ] diff --git a/passerelle/apps/jsondatastore/models.py b/passerelle/apps/jsondatastore/models.py index 6103d6a..5ca1ff8 100644 --- a/passerelle/apps/jsondatastore/models.py +++ b/passerelle/apps/jsondatastore/models.py @@ -19,6 +19,7 @@ import uuid from django.db import models from django.shortcuts import get_object_or_404 +from django.template import Context, Template from django.utils.translation import ugettext_lazy as _ from jsonfield import JSONField @@ -36,6 +37,7 @@ class JsonData(models.Model): default=get_hex_uuid, editable=False, unique=True) name_id = models.CharField(max_length=256, blank=True) content = JSONField(_('Content')) + text = models.CharField(max_length=256, blank=True) creation_datetime = models.DateTimeField(auto_now_add=True) last_update_datetime = models.DateTimeField(auto_now=True) @@ -43,16 +45,26 @@ class JsonData(models.Model): class JsonDataStore(BaseResource): category = _('Data Sources') + text_key_template = models.CharField(_('Template for text key'), + max_length=256, blank=True) class Meta: verbose_name = _('JSON Data Store') + def update_text(self, data): + if not self.text_key_template: + return + template = Template(self.text_key_template) + context = Context({'data': data}) + data.text = template.render(context).strip() + data.save() + @endpoint(perm='can_access', name='data', pattern=r'$') def list(self, request, name_id=None, **kwargs): objects = JsonData.objects.all() if name_id: objects = objects.filter(name_id=name_id) - return {'data': [{'id': x.uuid, 'content': x.content} for x in objects]} + 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): @@ -60,16 +72,18 @@ class JsonDataStore(BaseResource): if name_id: attrs['name_id'] = name_id data = JsonData(**attrs) + self.update_text(data) data.save() - return {'id': data.uuid} + return {'id': data.uuid, 'text': data.text} @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) if request.method == 'POST': data.content = json.loads(request.body) + self.update_text(data) data.save() - return {'id': data.uuid, 'content': data.content} + return {'id': data.uuid, 'text': data.text, 'content': data.content} @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'(?P\w+)/delete$') def delete(self, request, uuid): diff --git a/tests/test_jsondatastore.py b/tests/test_jsondatastore.py index 1a838ec..9be0c25 100644 --- a/tests/test_jsondatastore.py +++ b/tests/test_jsondatastore.py @@ -68,3 +68,12 @@ def test_jsondatastore_name_id(app, jsondatastore): assert len(resp.json['data']) == 2 resp = app.get('/jsondatastore/foobar/data/?name_id=yyy') assert len(resp.json['data']) == 1 + +def test_jsondatastore_template(app, jsondatastore): + jsondatastore.text_key_template = '{{data.content.foo}}' + jsondatastore.save() + resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'}) + uuid = resp.json['id'] + resp = app.get('/jsondatastore/foobar/data/') + assert len(resp.json['data']) == 1 + assert resp.json['data'][0]['text'] == 'bar' -- 2.13.1