from django_auth_ldap.backend import LDAPBackend from rest_framework import mixins, permissions, status, viewsets from rest_framework.decorators import action from rest_framework.response import Response from .serializers import * class UserViewSet(viewsets.GenericViewSet): permission_classes = [permissions.IsAuthenticated] serializer_class = UserSerializer def get_queryset(self): return self.request.user 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 = request.user serializer = self.get_serializer(user, context = {'request': request}) return Response(serializer.data) @action(detail=False, methods=['post']) def change_email(self, request): serializer = self.get_serializer( request.user, data=request.data, context={'request': request} ) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data) class AccountManagementViewSet(mixins.CreateModelMixin, viewsets.GenericViewSet): serializer_class = UserRegistrationSerializer def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) serializer.is_valid(raise_exception=True) self.perform_create(serializer) headers = self.get_success_headers(serializer.data) return Response( serializer.data, status=status.HTTP_201_CREATED, headers=headers ) class AdminUserViewSet(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 get_user_model().objects.all() @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)