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 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) def create(self, request): """ Modify existing user data """ user = request.user serializer = self.get_serializer(user, context = {'request': request}, data=request.data) serializer.is_valid(raise_exception=True) serializer.save() return Response(serializer.data) 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)