Projet

Général

Profil

0001-csv-handle-case-insensitive-text-search-8344.patch

Serghei Mihai (congés, retour 15/05), 24 septembre 2015 13:45

Télécharger (3,46 ko)

Voir les différences:

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(-)
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
-