Projet

Général

Profil

0001-jsondatastore-add-possibility-of-a-template-to-creat.patch

Frédéric Péters, 23 juin 2017 19:25

Télécharger (5,1 ko)

Voir les différences:

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
passerelle/apps/jsondatastore/migrations/0003_auto_20170623_1923.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('jsondatastore', '0002_jsondata_datastore'),
11
    ]
12

  
13
    operations = [
14
        migrations.AddField(
15
            model_name='jsondata',
16
            name='text',
17
            field=models.CharField(max_length=256, blank=True),
18
        ),
19
        migrations.AddField(
20
            model_name='jsondatastore',
21
            name='text_value_template',
22
            field=models.CharField(max_length=256, verbose_name='Template for "text" key value', blank=True),
23
        ),
24
    ]
passerelle/apps/jsondatastore/models.py
19 19

  
20 20
from django.db import models
21 21
from django.shortcuts import get_object_or_404
22
from django.template import Context, Template
22 23
from django.utils.translation import ugettext_lazy as _
23 24

  
24 25
from jsonfield import JSONField
......
38 39
            default=get_hex_uuid, editable=False, unique=True)
39 40
    name_id = models.CharField(max_length=256, blank=True)
40 41
    content = JSONField(_('Content'))
42
    text = models.CharField(max_length=256, blank=True)
41 43

  
42 44
    creation_datetime = models.DateTimeField(auto_now_add=True)
43 45
    last_update_datetime = models.DateTimeField(auto_now=True)
44 46

  
47
    def save(self, *args, **kwargs):
48
        text_value_template = self.datastore.text_value_template
49
        if text_value_template:
50
            template = Template(text_value_template)
51
            context = Context(self.content)
52
            self.text = template.render(context).strip()
53
        return super(JsonData, self).save(*args, **kwargs)
54

  
45 55

  
46 56
class JsonDataStore(BaseResource):
47 57
    category = _('Data Sources')
58
    text_value_template = models.CharField(_('Template for "text" key value'),
59
            max_length=256, blank=True)
48 60

  
49 61
    class Meta:
50 62
        verbose_name = _('JSON Data Store')
......
54 66
        objects = JsonData.objects.filter(datastore=self)
55 67
        if name_id:
56 68
            objects = objects.filter(name_id=name_id)
57
        return {'data': [{'id': x.uuid, 'content': x.content} for x in objects]}
69
        return {'data': [{'id': x.uuid, 'text': x.text, 'content': x.content} for x in objects]}
58 70

  
59 71
    @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'create$')
60 72
    def create(self, request, name_id=None, **kwargs):
......
66 78
            attrs['name_id'] = name_id
67 79
        data = JsonData(**attrs)
68 80
        data.save()
69
        return {'id': data.uuid}
81
        return {'id': data.uuid, 'text': data.text}
70 82

  
71 83
    @endpoint(perm='can_access', methods=['get', 'post'], name='data', pattern=r'(?P<uuid>\w+)/$',)
72 84
    def get_or_replace(self, request, uuid):
......
74 86
        if request.method == 'POST':
75 87
            data.content = json.loads(request.body)
76 88
            data.save()
77
        return {'id': data.uuid, 'content': data.content}
89
        return {'id': data.uuid, 'text': data.text, 'content': data.content}
78 90

  
79 91
    @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'(?P<uuid>\w+)/delete$')
80 92
    def delete(self, request, uuid):
tests/test_jsondatastore.py
83 83
    assert len(resp.json['data']) == 2
84 84
    resp = app.get('/jsondatastore/foobar/data/?name_id=yyy')
85 85
    assert len(resp.json['data']) == 1
86

  
87
def test_jsondatastore_template(app, jsondatastore):
88
    jsondatastore.text_value_template = '{{foo}}'
89
    jsondatastore.save()
90
    resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
91
    uuid = resp.json['id']
92
    resp = app.get('/jsondatastore/foobar/data/')
93
    assert len(resp.json['data']) == 1
94
    assert resp.json['data'][0]['text'] == 'bar'
86
-