ConceptPortal-public/rsconcept/backend/apps/users/views.py

122 lines
3.8 KiB
Python
Raw Normal View History

2023-12-26 14:23:51 +03:00
''' REST API: User profile and Authorization. '''
2023-07-15 17:46:19 +03:00
from django.contrib.auth import login, logout
2024-05-24 18:31:14 +03:00
from drf_spectacular.utils import extend_schema, extend_schema_view
from rest_framework import generics, permissions
from rest_framework import status as c
2024-05-24 18:31:14 +03:00
from rest_framework import views
2023-07-15 17:46:19 +03:00
from rest_framework.response import Response
from . import models as m
2024-05-24 18:31:14 +03:00
from . import serializers as s
2023-07-15 17:46:19 +03:00
2023-09-21 23:09:51 +03:00
2023-07-15 17:46:19 +03:00
class LoginAPIView(views.APIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: Login via username + password. '''
2023-07-15 17:46:19 +03:00
permission_classes = (permissions.AllowAny,)
@extend_schema(
summary='login user',
tags=['Auth'],
request=s.LoginSerializer,
responses={
c.HTTP_202_ACCEPTED: None,
c.HTTP_400_BAD_REQUEST: s.NonFieldErrorSerializer
}
)
def post(self, request):
serializer = s.LoginSerializer(
2023-07-15 17:46:19 +03:00
data=self.request.data,
context={'request': self.request}
)
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
login(request, user)
return Response(None, status=c.HTTP_202_ACCEPTED)
2023-07-15 17:46:19 +03:00
class LogoutAPIView(views.APIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: Logout. '''
2023-07-15 17:46:19 +03:00
permission_classes = (permissions.IsAuthenticated,)
@extend_schema(
summary='logout current user',
tags=['Auth'],
request=None,
responses={c.HTTP_204_NO_CONTENT: None}
)
def post(self, request):
2023-07-15 17:46:19 +03:00
logout(request)
return Response(None, status=c.HTTP_204_NO_CONTENT)
2023-07-15 17:46:19 +03:00
2023-09-21 23:09:51 +03:00
@extend_schema(tags=['User'])
@extend_schema_view()
2023-07-15 17:46:19 +03:00
class SignupAPIView(generics.CreateAPIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: Register user. '''
2023-07-15 17:46:19 +03:00
permission_classes = (permissions.AllowAny, )
serializer_class = s.SignupSerializer
2023-07-15 17:46:19 +03:00
2023-09-21 23:09:51 +03:00
@extend_schema(tags=['Auth'])
@extend_schema_view()
2023-07-15 17:46:19 +03:00
class AuthAPIView(generics.RetrieveAPIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: Current user info. '''
2023-07-15 17:46:19 +03:00
permission_classes = (permissions.AllowAny,)
serializer_class = s.AuthSerializer
2023-07-15 17:46:19 +03:00
def get_object(self):
return self.request.user
2023-09-21 23:09:51 +03:00
@extend_schema(tags=['User'])
@extend_schema_view()
2023-07-15 17:46:19 +03:00
class ActiveUsersView(generics.ListAPIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: Get list of active users. '''
2023-07-15 17:46:19 +03:00
permission_classes = (permissions.AllowAny,)
serializer_class = s.UserSerializer
2023-07-15 17:46:19 +03:00
def get_queryset(self):
return m.User.objects.filter(is_active=True)
2023-07-15 17:46:19 +03:00
2023-09-21 23:09:51 +03:00
@extend_schema(tags=['User'])
@extend_schema_view()
2023-07-15 17:46:19 +03:00
class UserProfileAPIView(generics.RetrieveUpdateAPIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: User profile. '''
2023-07-15 17:46:19 +03:00
permission_classes = (permissions.IsAuthenticated,)
serializer_class = s.UserSerializer
2023-07-15 17:46:19 +03:00
def get_object(self):
return self.request.user
2023-08-10 13:53:19 +03:00
class UpdatePassword(views.APIView):
2023-08-26 17:26:49 +03:00
''' Endpoint: Change password for current user. '''
2023-08-10 13:53:19 +03:00
permission_classes = (permissions.IsAuthenticated, )
def get_object(self, queryset=None):
return self.request.user
@extend_schema(
description='change current user password',
tags=['Auth'],
request=s.ChangePasswordSerializer,
responses={
c.HTTP_204_NO_CONTENT: None,
c.HTTP_400_BAD_REQUEST: None
}
)
2023-08-10 13:53:19 +03:00
def patch(self, request, *args, **kwargs):
self.object = self.get_object()
serializer = s.ChangePasswordSerializer(data=request.data)
2023-08-10 13:53:19 +03:00
if serializer.is_valid():
old_password = serializer.data.get("old_password")
if not self.object.check_password(old_password):
return Response({"old_password": ["Wrong password."]},
status=c.HTTP_400_BAD_REQUEST)
# Note: set_password also hashes the password that the user will get
2023-08-10 13:53:19 +03:00
self.object.set_password(serializer.data.get("new_password"))
self.object.save()
return Response(status=c.HTTP_204_NO_CONTENT)
return Response(serializer.errors, status=c.HTTP_400_BAD_REQUEST)