0001-csv-handle-case-insensitive-text-search-8344.patch
passerelle/apps/csvdatasource/models.py | ||
---|---|---|
39 | 39 |
def get_absolute_url(self): |
40 | 40 |
return reverse('csvdatasource-detail', kwargs={'slug': self.slug}) |
41 | 41 | |
42 |
def get_data(self, filter_criteria=None): |
|
42 |
def get_data(self, filter_criteria=None, case_insensitive=False):
|
|
43 | 43 | |
44 |
def filter_row(row, titles, filter_criteria): |
|
44 |
def filter_row(row, titles, filter_criteria, case_insensitive):
|
|
45 | 45 |
if 'text' in titles: |
46 | 46 |
col = titles.index('text') |
47 |
text = unicode(row[col], 'utf-8') |
|
47 | 48 |
if not isinstance(filter_criteria, unicode): |
48 | 49 |
filter_criteria = unicode(filter_criteria, 'utf-8') |
49 |
if filter_criteria not in unicode(row[col], 'utf-8'): |
|
50 |
if case_insensitive: |
|
51 |
text = text.lower() |
|
52 |
filter_criteria = filter_criteria.lower() |
|
53 |
if filter_criteria not in text: |
|
50 | 54 |
return False |
51 | 55 |
return True |
52 | 56 | |
... | ... | |
66 | 70 |
data = [] |
67 | 71 | |
68 | 72 |
for row in reader: |
69 |
if filter_criteria and not filter_row(row, titles, filter_criteria): |
|
73 |
if filter_criteria and not filter_row(row, titles, filter_criteria, |
|
74 |
case_insensitive): |
|
70 | 75 |
continue |
71 | 76 |
try: |
72 | 77 |
line = [row[i] for i in indexes] |
passerelle/apps/csvdatasource/views.py | ||
---|---|---|
42 | 42 |
@utils.to_json('api') |
43 | 43 |
def get(self, request, *args, **kwargs): |
44 | 44 |
obj = self.get_object() |
45 |
return obj.get_data(request.GET.get('q')) |
|
45 |
case_insensitive = 'case-insensitive' in request.GET |
|
46 |
return obj.get_data(filter_criteria=request.GET.get('q'), |
|
47 |
case_sensitive=case_insensitive) |
tests/test_csv_datasource.py | ||
---|---|---|
105 | 105 |
assert 'id' in item |
106 | 106 |
assert 'text' in item |
107 | 107 |
assert filter_criteria in item['text'] |
108 | ||
109 |
def test_case_insensitive_data(): |
|
110 |
csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'), |
|
111 |
columns_keynames=',id,,text,') |
|
112 |
filter_criteria = 'Aëlle' |
|
113 |
result = csv.get_data(filter_criteria=filter_criteria, |
|
114 |
case_insensitive=True) |
|
115 |
assert len(result) |
|
116 |
for item in result: |
|
117 |
assert 'id' in item |
|
118 |
assert 'text' in item |
|
119 |
assert filter_criteria.lower() in item['text'].lower() |
|
108 |
- |