diff --git a/dpdapi/filters.py b/dpdapi/filters.py index 320b5bd..ec63073 100644 --- a/dpdapi/filters.py +++ b/dpdapi/filters.py @@ -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 diff --git a/dpdapi/tests.py b/dpdapi/tests.py index b9e1804..de8bc75 100644 --- a/dpdapi/tests.py +++ b/dpdapi/tests.py @@ -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) diff --git a/dpdapi/views.py b/dpdapi/views.py index b8e370d..385acab 100644 --- a/dpdapi/views.py +++ b/dpdapi/views.py @@ -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): diff --git a/dpdapisite/settings.py b/dpdapisite/settings.py index 4da1f5c..9ee7dc1 100644 --- a/dpdapisite/settings.py +++ b/dpdapisite/settings.py @@ -58,6 +58,7 @@ INSTALLED_APPS = ( ) INSTALLED_APPS += ( + 'django_extensions', 'rest_framework', 'django_filters', 'dpdapi',