From 78f2c550b0cf968aa7c109cb5135633dba69ee63 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Wed, 15 Mar 2017 10:31:25 +0100 Subject: [PATCH] api: add more filtering possibility to users API (fixes #15620) You can now do incremental synchronization using the modified__gt filter and the last date of synchronization. --- setup.py | 2 +- src/authentic2/api_views.py | 49 ++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 47 insertions(+), 4 deletions(-) diff --git a/setup.py b/setup.py index 540412d..a05fd7a 100755 --- a/setup.py +++ b/setup.py @@ -122,7 +122,7 @@ setup(name="authentic2", 'six>=1', 'Markdown>=2.1', 'python-ldap', - 'django-filter<0.12.0', + 'django-filter', 'pycrypto', 'django-mellon', 'ldaptools', diff --git a/src/authentic2/api_views.py b/src/authentic2/api_views.py index 5ed9ff5..62be607 100644 --- a/src/authentic2/api_views.py +++ b/src/authentic2/api_views.py @@ -12,7 +12,7 @@ from django.shortcuts import get_object_or_404 from django_rbac.utils import get_ou_model, get_role_model -from rest_framework import serializers +from rest_framework import serializers, pagination from rest_framework.views import APIView from rest_framework.viewsets import ModelViewSet from rest_framework.routers import SimpleRouter @@ -22,6 +22,8 @@ from rest_framework import permissions, status from rest_framework.exceptions import PermissionDenied from rest_framework.fields import CreateOnlyDefault +from django_filters.rest_framework import FilterSet + from .custom_user.models import User from . import utils, decorators, attribute_kinds from .models import Attribute, PasswordReset @@ -350,11 +352,52 @@ class BaseUserSerializer(serializers.ModelSerializer): exclude = ('date_joined', 'user_permissions', 'groups', 'last_login') +class UsersFilter(FilterSet): + class Meta: + model = get_user_model() + fields = { + 'username': [ + 'exact', + 'iexact' + ], + 'first_name': [ + 'exact', + 'iexact', + 'icontains', + 'gte', + 'lte', + 'gt', + 'lt', + ], + 'last_name': [ + 'exact', + 'iexact', + 'icontains', + 'gte', + 'lte', + 'gt', + 'lt', + ], + 'modified': [ + 'gte', + 'lte', + 'gt', + 'lt', + ], + 'email': [ + 'exact', + 'iexact', + ], + } + + class UsersAPI(ModelViewSet): - filter_fields = ['username', 'first_name', 'last_name', 'email'] - ordering_fields = ['username', 'first_name', 'last_name'] + ordering_fields = ['username', 'first_name', 'last_name', 'modified', 'date_joined'] lookup_field = 'uuid' serializer_class = BaseUserSerializer + filter_class = UsersFilter + pagination_class = pagination.CursorPagination + ordering = ['modified', 'id'] def get_queryset(self): User = get_user_model() -- 2.1.4