Projet

Général

Profil

0001-jsondatastore-add-a-search-endpoint-29889.patch

Nicolas Roche, 20 novembre 2019 18:48

Télécharger (4,18 ko)

Voir les différences:

Subject: [PATCH] jsondatastore: add a search endpoint (#29889)

 passerelle/apps/jsondatastore/models.py | 26 +++++++++++++++++++++
 tests/test_jsondatastore.py             | 31 +++++++++++++++++++++++++
 2 files changed, 57 insertions(+)
passerelle/apps/jsondatastore/models.py
17 17
import json
18 18
import uuid
19 19

  
20
import unidecode
21

  
20 22
from django.db import models
21 23
from django.template import Context, Template
24
from django.utils.encoding import force_text
22 25
from django.utils.translation import ugettext_lazy as _
23 26

  
24 27
from jsonfield import JSONField
......
93 96
            objects = [o for o in objects if o.content.get(key) == value]
94 97
        return {'data': [x.to_json() for x in objects]}
95 98

  
99
    @endpoint(perm='can_access', name='search', pattern=r'$',
100
              description=_('List content'))
101
    def search(self, request, name_id=None, url_field='url', text_field='text',
102
               description_field='description', **kwargs):
103
        objects = JsonData.objects.filter(datastore=self)
104
        if name_id is not None:
105
            objects = objects.filter(name_id=name_id)
106

  
107
        def match(value1, value2):
108
            val1 = unidecode.unidecode(force_text(value1)).upper()
109
            val2 = unidecode.unidecode(force_text(value2)).upper()
110
            return val1 in val2
111

  
112
        for key, value in kwargs.items():
113
            objects = [o for o in objects if match(value, o.content.get(key))]
114
        data = []
115
        for obj in objects:
116
            data.append({
117
                'url': obj.content.get(url_field),
118
                'text': obj.content.get(text_field),
119
                'description': obj.content.get(description_field)})
120
        return {'err': 0, 'data': data}
121

  
96 122
    @endpoint(perm='can_access', methods=['post'], name='data',
97 123
              pattern=r'create$',
98 124
              example_pattern='create',
tests/test_jsondatastore.py
1
# -*- coding: utf-8 -*-
1 2
import pytest
2 3

  
3 4
from django.contrib.contenttypes.models import ContentType
......
221 222
    resp = app.get('/jsondatastore/foobar/data/',
222 223
                   params={'key3': ''})
223 224
    assert [d['id'] for d in resp.json['data']] == []
225

  
226

  
227
def test_jsondatastore_search(app, jsondatastore):
228
    resp = app.post_json('/jsondatastore/foobar/data/create?name_id=name1',
229
                         params={'me': 1, 'text': 'val1', 'url': 'foÖ'})
230
    resp = app.post_json('/jsondatastore/foobar/data/create?name_id=name2',
231
                         params={'me': 2, 'text': 'val1', 'url': 'val2'})
232
    resp = app.post_json('/jsondatastore/foobar/data/create?name_id=name1',
233
                         params={'me': 3, 'text': 'val1', 'url': 'val3'})
234

  
235
    # JSON conformes with combo/apps/search/README
236
    resp = app.get('/jsondatastore/foobar/search/',
237
                   params={'me': 2})
238
    assert resp.json['data'] == [{'text': 'val1', 'url': 'val2', 'description': None}]
239

  
240
    resp = app.get('/jsondatastore/foobar/search/',
241
                   params={'me': 2, 'description_field': 'me'})
242
    assert resp.json['data'] == [{'text': 'val1', 'url': 'val2', 'description': 2}]
243

  
244
    resp = app.get('/jsondatastore/foobar/search/',
245
                   params={'text': 'val1', 'url': 'val'})
246
    assert sorted([d['url'] for d in resp.json['data']]) == ['val2', 'val3']
247

  
248
    resp = app.get('/jsondatastore/foobar/search/?name_id=name1',
249
                   params={'url': 'Oö', 'url_field': 'me'})
250
    assert [d['url'] for d in resp.json['data']] == [1]
251

  
252
    resp = app.get('/jsondatastore/foobar/search/',
253
                   params={'key3': 'another value'})
254
    assert [d['url'] for d in resp.json['data']] == []
224
-