From 564c15b917e562bc647a3b3bd56461d95129d17b Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Thu, 24 Sep 2015 13:42:13 +0200 Subject: [PATCH] csv: handle case insensitive text search (#8344) --- passerelle/apps/csvdatasource/models.py | 13 +++++++++---- passerelle/apps/csvdatasource/views.py | 4 +++- tests/test_csv_datasource.py | 12 ++++++++++++ 3 files changed, 24 insertions(+), 5 deletions(-) diff --git a/passerelle/apps/csvdatasource/models.py b/passerelle/apps/csvdatasource/models.py index 740e53a..51ac59c 100644 --- a/passerelle/apps/csvdatasource/models.py +++ b/passerelle/apps/csvdatasource/models.py @@ -39,14 +39,18 @@ class CsvDataSource(BaseResource): def get_absolute_url(self): return reverse('csvdatasource-detail', kwargs={'slug': self.slug}) - def get_data(self, filter_criteria=None): + def get_data(self, filter_criteria=None, case_insensitive=False): - def filter_row(row, titles, filter_criteria): + def filter_row(row, titles, filter_criteria, case_insensitive): if 'text' in titles: col = titles.index('text') + text = unicode(row[col], 'utf-8') if not isinstance(filter_criteria, unicode): filter_criteria = unicode(filter_criteria, 'utf-8') - if filter_criteria not in unicode(row[col], 'utf-8'): + if case_insensitive: + text = text.lower() + filter_criteria = filter_criteria.lower() + if filter_criteria not in text: return False return True @@ -66,7 +70,8 @@ class CsvDataSource(BaseResource): data = [] for row in reader: - if filter_criteria and not filter_row(row, titles, filter_criteria): + if filter_criteria and not filter_row(row, titles, filter_criteria, + case_insensitive): continue try: line = [row[i] for i in indexes] diff --git a/passerelle/apps/csvdatasource/views.py b/passerelle/apps/csvdatasource/views.py index 9d4a083..8155d40 100644 --- a/passerelle/apps/csvdatasource/views.py +++ b/passerelle/apps/csvdatasource/views.py @@ -42,4 +42,6 @@ class CsvDataView(View, SingleObjectMixin): @utils.to_json('api') def get(self, request, *args, **kwargs): obj = self.get_object() - return obj.get_data(request.GET.get('q')) + case_insensitive = 'case-insensitive' in request.GET + return obj.get_data(filter_criteria=request.GET.get('q'), + case_sensitive=case_insensitive) diff --git a/tests/test_csv_datasource.py b/tests/test_csv_datasource.py index fb6b8ed..cf5930a 100644 --- a/tests/test_csv_datasource.py +++ b/tests/test_csv_datasource.py @@ -105,3 +105,15 @@ def test_str_filter_data(): assert 'id' in item assert 'text' in item assert filter_criteria in item['text'] + +def test_case_insensitive_data(): + csv = CsvDataSource.objects.create(csv_file=File(StringIO(data), 'data.csv'), + columns_keynames=',id,,text,') + filter_criteria = 'AĆ«lle' + result = csv.get_data(filter_criteria=filter_criteria, + case_insensitive=True) + assert len(result) + for item in result: + assert 'id' in item + assert 'text' in item + assert filter_criteria.lower() in item['text'].lower() -- 2.5.3