from rest_framework import viewsets, permissions, status from .serializers import * from django_auth_ldap.backend import LDAPBackend from rest_framework.decorators import action from rest_framework.response import Response from rest_framework.generics import get_object_or_404 from rest_framework import mixins from .models import * class SelfViewSet(mixins.ListModelMixin, viewsets.GenericViewSet): permission_classes = [permissions.IsAuthenticated] serializer_class = UserSerializer def list(self, request, format=None): # This is a bit stupid: we have a user, we create a queryset by # matching on the username. But I don't know a "nicer" way. # Nico, 2020-03-18 user = get_user_model().objects.get( username=self.request.user.username) serializer = self.get_serializer(user, context = {'request': request}) return Response(serializer.data) class UserViewSet(viewsets.ReadOnlyModelViewSet): permission_classes = [permissions.IsAdminUser] def get_serializer_class(self): if self.action == 'import_from_ldap': return ImportUserSerializer else: return UserSerializer def get_queryset(self): return User.objects.all() # Override default implementation to search by username instead of ID. def retrieve(self, request, pk): queryset = self.filter_queryset(self.get_queryset()) instance = get_object_or_404(queryset, username=pk) serializer = self.get_serializer(instance) return Response(serializer.data) @action(detail=False, methods=['post'], url_path='import_from_ldap') def import_from_ldap(self, request, pk=None): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) ldap_username = serializer.validated_data.pop("username") user = LDAPBackend().populate_user(ldap_username) return Response(UserSerializer(user, context = {'request': request}).data)