forked from uncloud/uncloud
75 lines
2.6 KiB
Python
75 lines
2.6 KiB
Python
from django.contrib.auth import views as auth_views
|
|
from django.contrib.auth import logout
|
|
|
|
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 LoginView(auth_views.LoginView):
|
|
template_name = 'uncloud_auth/login.html'
|
|
|
|
class LogoutView(auth_views.LogoutView):
|
|
pass
|
|
|
|
|
|
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)
|