diff --git a/dpdapi/filters.py b/dpdapi/filters.py new file mode 100644 index 0000000..8ab1cae --- /dev/null +++ b/dpdapi/filters.py @@ -0,0 +1,12 @@ +import django_filters + +from dpdapi.models import Alias + + +class AliasRegexFilter(django_filters.FilterSet): + # Ref: https://docs.djangoproject.com/en/1.7/ref/models/querysets/#iregex + source_regexp = django_filters.CharFilter(name="source", lookup_type='iregex') + + class Meta: + model = Alias + fields = ['source_regexp'] \ No newline at end of file diff --git a/dpdapi/views.py b/dpdapi/views.py index 19ab147..412f137 100644 --- a/dpdapi/views.py +++ b/dpdapi/views.py @@ -1,11 +1,16 @@ from __future__ import unicode_literals +import logging from rest_framework.decorators import list_route from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework import status, filters, viewsets -from .models import Alias, Domain, User -from .serializers import AliasSerializer, AliasIdSerializer, DomainSerializer, UserSerializer +from dpdapi.filters import AliasRegexFilter +from dpdapi.models import Alias, Domain, User +from dpdapi.serializers import AliasSerializer, AliasIdSerializer, DomainSerializer, UserSerializer + + +logger = logging.getLogger(__name__) class AliasViewSet(viewsets.ModelViewSet): @@ -13,8 +18,8 @@ class AliasViewSet(viewsets.ModelViewSet): queryset = Alias.objects.all() serializer_class = AliasSerializer permission_classes = [IsAuthenticated] - filter_backends = (filters.DjangoFilterBackend,) - filter_fields = ('domain', 'domain__name') + filter_backends = (filters.DjangoFilterBackend, AliasRegexFilter) + filter_fields = ('domain', 'domain__name', 'regex') @list_route(methods=['post']) def create_bulk(self, request): @@ -26,18 +31,21 @@ class AliasViewSet(viewsets.ModelViewSet): @list_route(methods=['delete']) def delete_bulk(self, request): - # TODO how to lookup instances and delete them by id? + # FIXME, accept [{source: kak@stry.no, destination: lol@lol.com}] instead of IDs serializer = AliasIdSerializer(data=request.data, many=True) if not serializer.is_valid(): return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) - ids = map(lambda x: x['id'], serializer.initial_data) # FIXME this is not how to do it + ids = map(lambda x: x['id'], serializer.initial_data) # FIXME this might not be too great aliases = Alias.objects.filter(id__in=ids) diff = set(ids).difference(set(aliases.values_list('id', flat=True))) + logger.debug('Deleted: {}'.format(','.join(map(unicode, aliases)))) aliases.delete() if diff: - result = "ID's '{}' could not be found and were not deleted.".format(", ".join(map(str, diff))) + res = "ID's '{}' could not be found and were not deleted.".format(", ".join(map(unicode, diff))) + logger.info(res) + result = res return Response({"result": result}, status=status.HTTP_200_OK) return Response(status=status.HTTP_204_NO_CONTENT)