0001-jsondatastore-add-a-search-endpoint-29889.patch
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 |
- |