Projet

Général

Profil

0001-api-search-on-empty-string-should-not-return-all-obj.patch

Nicolas Roche, 30 janvier 2020 11:20

Télécharger (2,53 ko)

Voir les différences:

Subject: [PATCH] api: search on empty string should not return all objects
 (#38877)

 src/authentic2/api_views.py | 14 +++++++++++++-
 tests/test_api.py           | 10 ++++++++++
 2 files changed, 23 insertions(+), 1 deletion(-)
src/authentic2/api_views.py
49 49
from rest_framework.settings import api_settings
50 50

  
51 51
from django_filters.rest_framework import FilterSet
52
from django_filters.filters import IsoDateTimeFilter
52
from django_filters.filters import CharFilter, IsoDateTimeFilter
53 53
from django_filters.fields import IsoDateTimeField
54 54
from django_filters.utils import handle_timezone
55 55

  
......
601 601
        return super(IsoDateTimeFilter, self).filter(qs, value)
602 602

  
603 603

  
604
class CharFilter(CharFilter):
605
    def filter(self, qs, value):
606
        if value != '':
607
            return super(CharFilter, self).filter(qs, value)
608

  
609
        qs = self.get_method(qs)(**{'%s__%s' % (self.field_name, self.lookup_expr): ""})
610
        return qs.distinct() if self.distinct else qs        
611

  
612

  
604 613
class UsersFilter(FilterSet):
605 614
    class Meta:
606 615
        model = get_user_model()
......
644 653
        filter_overrides = {
645 654
            models.DateTimeField: {
646 655
                'filter_class': IsoDateTimeFilter,
656
            },
657
            models.CharField: {
658
                'filter_class': CharFilter,
647 659
            }
648 660
        }
649 661

  
tests/test_api.py
167 167
    assert resp.json['next'] is None
168 168

  
169 169

  
170
def test_api_users_search_empty_value(app, superuser):
171
    app.authorization = ('Basic', (superuser.username, superuser.username))
172
    User = get_user_model()
173
    User.objects.create(username='someuser')
174
    assert User.objects.filter(username__iexact='').count() == 0
175
    resp = app.get('/api/users/?username__iexact=')
176
    results = resp.json['results']
177
    assert len(results) == 0
178

  
179

  
170 180
def test_api_users_update_with_email_verified(settings, app, admin, simple_user):
171 181
    from django.contrib.auth import get_user_model
172 182
    simple_user.email_verified = True
173
-