uncloud/uncloud_django_based/uncloud/uncloud_auth/views.py

51 lines
2.0 KiB
Python

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)