Projet

Général

Profil

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

Frédéric Péters, 23 juin 2017 18:45

Télécharger (5,18 ko)

Voir les différences:

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
passerelle/apps/jsondatastore/migrations/0002_auto_20170623_1844.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', '0001_initial'),
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_key_template',
22
            field=models.CharField(max_length=256, verbose_name='Template for text key', 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
......
36 37
            default=get_hex_uuid, editable=False, unique=True)
37 38
    name_id = models.CharField(max_length=256, blank=True)
38 39
    content = JSONField(_('Content'))
40
    text = models.CharField(max_length=256, blank=True)
39 41

  
40 42
    creation_datetime = models.DateTimeField(auto_now_add=True)
41 43
    last_update_datetime = models.DateTimeField(auto_now=True)
......
43 45

  
44 46
class JsonDataStore(BaseResource):
45 47
    category = _('Data Sources')
48
    text_key_template = models.CharField(_('Template for text key'),
49
            max_length=256, blank=True)
46 50

  
47 51
    class Meta:
48 52
        verbose_name = _('JSON Data Store')
49 53

  
54
    def update_text(self, data):
55
        if not self.text_key_template:
56
            return
57
        template = Template(self.text_key_template)
58
        context = Context({'data': data})
59
        data.text = template.render(context).strip()
60
        data.save()
61

  
50 62
    @endpoint(perm='can_access', name='data', pattern=r'$')
51 63
    def list(self, request, name_id=None, **kwargs):
52 64
        objects = JsonData.objects.all()
53 65
        if name_id:
54 66
            objects = objects.filter(name_id=name_id)
55
        return {'data': [{'id': x.uuid, 'content': x.content} for x in objects]}
67
        return {'data': [{'id': x.uuid, 'text': x.text, 'content': x.content} for x in objects]}
56 68

  
57 69
    @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'create$')
58 70
    def create(self, request, name_id=None, **kwargs):
......
60 72
        if name_id:
61 73
            attrs['name_id'] = name_id
62 74
        data = JsonData(**attrs)
75
        self.update_text(data)
63 76
        data.save()
64
        return {'id': data.uuid}
77
        return {'id': data.uuid, 'text': data.text}
65 78

  
66 79
    @endpoint(perm='can_access', methods=['get', 'post'], name='data', pattern=r'(?P<uuid>\w+)/$',)
67 80
    def get_or_replace(self, request, uuid):
68 81
        data = get_object_or_404(JsonData, uuid=uuid)
69 82
        if request.method == 'POST':
70 83
            data.content = json.loads(request.body)
84
            self.update_text(data)
71 85
            data.save()
72
        return {'id': data.uuid, 'content': data.content}
86
        return {'id': data.uuid, 'text': data.text, 'content': data.content}
73 87

  
74 88
    @endpoint(perm='can_access', methods=['post'], name='data', pattern=r'(?P<uuid>\w+)/delete$')
75 89
    def delete(self, request, uuid):
tests/test_jsondatastore.py
68 68
    assert len(resp.json['data']) == 2
69 69
    resp = app.get('/jsondatastore/foobar/data/?name_id=yyy')
70 70
    assert len(resp.json['data']) == 1
71

  
72
def test_jsondatastore_template(app, jsondatastore):
73
    jsondatastore.text_key_template = '{{data.content.foo}}'
74
    jsondatastore.save()
75
    resp = app.post_json('/jsondatastore/foobar/data/create', params={'foo': 'bar'})
76
    uuid = resp.json['id']
77
    resp = app.get('/jsondatastore/foobar/data/')
78
    assert len(resp.json['data']) == 1
79
    assert resp.json['data'][0]['text'] == 'bar'
71
-