69 lines
2.6 KiB
Python
69 lines
2.6 KiB
Python
from django.utils import timezone
|
|
from oauth2_provider.contrib.rest_framework import TokenHasReadWriteScope, TokenHasScope, IsAuthenticatedOrTokenHasScope
|
|
from rest_framework import generics, permissions, status
|
|
from rest_framework.response import Response
|
|
|
|
from apps.users.models import User
|
|
from apps.users.serializers import PublicUserSerializer, AccountSerializer, RequestOTPSerializer, ChangePasswordSerializer
|
|
|
|
|
|
class UserListView(generics.ListAPIView):
|
|
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
|
|
queryset = User.objects.all()
|
|
serializer_class = PublicUserSerializer
|
|
required_scopes = []
|
|
|
|
|
|
class UserDetailView(generics.RetrieveAPIView):
|
|
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
|
|
queryset = User.objects.all()
|
|
serializer_class = PublicUserSerializer
|
|
lookup_field = 'uuid'
|
|
required_scopes = []
|
|
|
|
|
|
class AccountView(generics.RetrieveUpdateAPIView):
|
|
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
|
|
serializer_class = AccountSerializer
|
|
required_scopes = []
|
|
|
|
def get_object(self):
|
|
return self.request.user
|
|
|
|
def perform_update(self, serializer):
|
|
serializer.save(last_update=timezone.now())
|
|
|
|
|
|
class RequestOTPView(generics.CreateAPIView):
|
|
permission_classes = []
|
|
serializer_class = RequestOTPSerializer
|
|
required_scopes = []
|
|
|
|
|
|
class ChangePasswordView(generics.UpdateAPIView):
|
|
permission_classes = [permissions.IsAuthenticated, IsAuthenticatedOrTokenHasScope]
|
|
serializer_class = ChangePasswordSerializer
|
|
required_scopes = []
|
|
model = User
|
|
|
|
def get_object(self, queryset=None):
|
|
obj = self.request.user
|
|
return obj
|
|
|
|
def update(self, request, *args, **kwargs):
|
|
self.object = self.get_object()
|
|
serializer = self.get_serializer(data=request.data)
|
|
|
|
if serializer.is_valid():
|
|
gateway = serializer.data.get("old_password_gateway")
|
|
old_password = serializer.data.get("old_password")
|
|
new_password = serializer.data.get("new_password")
|
|
if not self.object.check_auth(gateway, old_password):
|
|
return Response({"old_password": ["Wrong password/otp."]}, status=status.HTTP_400_BAD_REQUEST)
|
|
|
|
self.object.set_password(new_password)
|
|
self.object.last_update = timezone.now()
|
|
self.object.save()
|
|
return Response({"state": 'success'}, status=status.HTTP_200_OK)
|
|
|
|
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
|