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 = 'code' 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)