From 1123c73e1f47841a3fb6a7cdb603e68ed47a9166 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/0003_auto_20170623_1923.py | 24 ++++++++++++++++++++++ passerelle/apps/jsondatastore/models.py | 18 +++++++++++++--- tests/test_jsondatastore.py | 9 ++++++++ 3 files changed, 48 insertions(+), 3 deletions(-) create mode 100644 passerelle/apps/jsondatastore/migrations/0003_auto_20170623_1923.py diff --git a/passerelle/apps/jsondatastore/migrations/0003_auto_20170623_1923.py b/passerelle/apps/jsondatastore/migrations/0003_auto_20170623_1923.py new file mode 100644 index 0000000..bf9c1e6 --- /dev/null +++ b/passerelle/apps/jsondatastore/migrations/0003_auto_20170623_1923.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', '0002_jsondata_datastore'), + ] + + operations = [ + migrations.AddField( + model_name='jsondata', + name='text', + field=models.CharField(max_length=256, blank=True), + ), + migrations.AddField( + model_name='jsondatastore', + name='text_value_template', + field=models.CharField(max_length=256, verbose_name='Template for "text" key value', blank=True), + ), + ] diff --git a/passerelle/apps/jsondatastore/models.py b/passerelle/apps/jsondatastore/models.py index c521e96..ff21bc3 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 @@ -38,13 +39,24 @@ 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) + def save(self, *args, **kwargs): + text_value_template = self.datastore.text_value_template + if text_value_template: + template = Template(text_value_template) + context = Context(self.content) + self.text = template.render(context).strip() + return super(JsonData, self).save(*args, **kwargs) + class JsonDataStore(BaseResource): category = _('Data Sources') + text_value_template = models.CharField(_('Template for "text" key value'), + max_length=256, blank=True) class Meta: verbose_name = _('JSON Data Store') @@ -54,7 +66,7 @@ class JsonDataStore(BaseResource): objects = JsonData.objects.filter(datastore=self) 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): @@ -66,7 +78,7 @@ class JsonDataStore(BaseResource): attrs['name_id'] = name_id data = JsonData(**attrs) 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): @@ -74,7 +86,7 @@ class JsonDataStore(BaseResource): if request.method == 'POST': data.content = json.loads(request.body) 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 c935daa..499a6c9 100644 --- a/tests/test_jsondatastore.py +++ b/tests/test_jsondatastore.py @@ -83,3 +83,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_value_template = '{{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