Fix regex lookup

Note: Renames filter fields:
 - source_regex to source__iregex
 - destination_regex to destination__iregex
This commit is contained in:
Nikolai R Kristiansen committed 2017-11-01 23:29:57 +01:00
1 parent 2a037fbe8f
commit f0a7858811
4 files changed
+24 -20

No files matched your search

+9 -14
View File
@@ -1,23 +1,18 @@
import django_filters
from rest_framework.filters import BaseFilterBackend
from dpdapi.models import Alias
from django_filters import filters
filters.LOOKUP_TYPES = ['iregex', 'exact', 'iexact']
class AliasFilter(django_filters.FilterSet):
# TODO: These do not work
# Ref: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#iregex
source_regex = django_filters.CharFilter(name='source')
destination_regex = django_filters.CharFilter(name='destination')
class AliasRegexFilter(django_filters.FilterSet):
class Meta:
model = Alias
fields = {
'domain': ['exact'],
'domain__name': ['iexact'],
'source_regex': ['iregex', 'regex'],
'destination_regex': ['iregex', 'regex']
'source': ['iregex', 'regex'],
'destination': ['iregex', 'regex']
}
class AliasRegexFilterBackend(BaseFilterBackend):
def filter_queryset(self, request, queryset, view):
return AliasRegexFilter(request.query_params, queryset=queryset).qs
+8 -2
View File
@@ -1,4 +1,5 @@
from django.contrib.auth.models import User
from django.test import override_settings
from django.urls import reverse
from rest_framework.test import APITestCase
@@ -12,7 +13,7 @@ class RegexTestCase(APITestCase):
user = User.objects.create(username='yolo')
d = Domain.objects.create(name='example.com')
for a in self.aliases:
Alias.objects.create(source=a, destination='@example.com', domain=d)
Alias.objects.create(source=a, destination='ninja@example.com', domain=d)
self.client.force_login(user)
def test_get_all(self):
@@ -24,7 +25,12 @@ class RegexTestCase(APITestCase):
res = self.client.get(reverse('alias-list'), data=params)
self.assertEqual(len(res.data), len(self.aliases))
def test_domain_filter_no_hits(self):
params = {'domain__name': 'zexample.com'}
res = self.client.get(reverse('alias-list'), data=params)
self.assertEqual(len(res.data), 0)
def test_regex_filter(self):
params = {'source_regex': '^ops-|^ops@'}
params = {'source__regex': '^ops-|^ops@'}
res = self.client.get(reverse('alias-list'), data=params)
self.assertEqual(len(res.data), 1)
+6 -4
View File
@@ -6,24 +6,26 @@ from functools import reduce
from django.db.models import Q
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.decorators import list_route
from rest_framework.mixins import ListModelMixin
from rest_framework.permissions import IsAuthenticated
from rest_framework.response import Response
from rest_framework import status, viewsets
from rest_framework.viewsets import GenericViewSet
from dpdapi.filters import AliasFilter
from dpdapi.filters import AliasRegexFilterBackend
from dpdapi.models import Alias, Domain, User
from dpdapi.serializers import AliasSerializer, AliasDeleteSerializer, DomainSerializer, UserSerializer
logger = logging.getLogger(__name__)
class AliasViewSet(viewsets.ModelViewSet):
class AliasViewSet(ListModelMixin, GenericViewSet):
""" Aliases """
queryset = Alias.objects.all()
serializer_class = AliasSerializer
permission_classes = [IsAuthenticated]
filter_backends = (DjangoFilterBackend,)
filter_class = AliasFilter
filter_backends = (DjangoFilterBackend, AliasRegexFilterBackend)
filter_fields = ('domain', 'domain__name',)
@list_route(methods=['post'])
def create_bulk(self, request):
+1
View File
@@ -58,6 +58,7 @@ INSTALLED_APPS = (
)
INSTALLED_APPS += (
'django_extensions',
'rest_framework',
'django_filters',
'dpdapi',