0001-csvdatasource-allow-normalized-search-for-unicode-va.patch
passerelle/apps/csvdatasource/models.py | ||
---|---|---|
18 | 18 |
import re |
19 | 19 |
import csv |
20 | 20 |
import itertools |
21 |
import unicodedata |
|
21 | 22 |
from collections import OrderedDict |
22 | 23 |
from pyexcel_ods import get_data as get_data_ods |
23 | 24 |
from pyexcel_xls import get_data as get_data_xls |
... | ... | |
50 | 51 |
code_cache[expr] = compile(expr, '<inline>', 'eval') |
51 | 52 |
return code_cache[expr] |
52 | 53 | |
54 |
def normalize(value): |
|
55 |
return unicodedata.normalize('NFKD', value).encode('ascii', 'ignore') |
|
56 | ||
53 | 57 | |
54 | 58 |
class Query(models.Model): |
55 | 59 |
resource = models.ForeignKey('CsvDataSource') |
... | ... | |
279 | 283 |
row_vars['query'] = kwargs |
280 | 284 |
for i, (code, expr) in enumerate(codes): |
281 | 285 |
try: |
282 |
result = eval(code, {}, row_vars) |
|
286 |
result = eval(code, {'normalize': normalize}, row_vars)
|
|
283 | 287 |
except Exception as e: |
284 | 288 |
data = { |
285 | 289 |
'expr': expr, |
... | ... | |
348 | 352 |
# filtering is done there afater projection because we need a projection named text for |
349 | 353 |
# retro-compatibility with previous use of the csvdatasource with select2 |
350 | 354 |
if 'q' in request.GET: |
351 |
filters = ["%s in text.lower()" % repr(request.GET['q'].lower())]
|
|
355 |
filters = ["%s in normalize(text.lower())" % repr(normalize(request.GET['q'].lower()))]
|
|
352 | 356 |
data = [row for new_row, row in stream_expressions(filters, data, kind='filters') |
353 | 357 |
if new_row[0]] |
354 | 358 |
tests/test_csv_datasource.py | ||
---|---|---|
219 | 219 |
assert result[0]['text'] == 'Eliot' |
220 | 220 |
assert len(result) == 1 |
221 | 221 | |
222 |
def test_query_insensitive(client, setup, filetype): |
|
222 |
def test_query_insensitive_and_unicode(client, setup, filetype):
|
|
223 | 223 |
csvdata, url = setup('fam,id,, text,sexe ', filename=filetype, data=get_file_content(filetype)) |
224 | 224 |
filters = {'q':'elIo', 'case-insensitive':''} |
225 | 225 |
resp = client.get(url, filters) |
226 | 226 |
result = parse_response(resp) |
227 | 227 |
assert result[0]['text'] == 'Eliot' |
228 | 228 |
assert len(result) == 1 |
229 |
filters['q'] = 'élIo' |
|
230 |
resp = client.get(url, filters) |
|
231 |
result = parse_response(resp) |
|
232 |
assert result[0]['text'] == 'Eliot' |
|
233 |
assert len(result) == 1 |
|
229 | 234 | |
230 | 235 |
def test_query_insensitive_and_filter(client, setup, filetype): |
231 | 236 |
csvdata, url = setup('fam,id,,text,sexe', filename=filetype, data=get_file_content(filetype)) |
232 |
- |