Skip to content

Commit 1e0970e

Browse files
committed
feat: add custom views
1 parent 86f555e commit 1e0970e

File tree

1 file changed

+88
-2
lines changed

1 file changed

+88
-2
lines changed

app/user/views.py

Lines changed: 88 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,89 @@
1-
from django.shortcuts import render
1+
from django.contrib.auth import get_user_model
2+
from django_filters.rest_framework import DjangoFilterBackend
3+
from drf_spectacular.utils import extend_schema, inline_serializer
4+
from rest_framework import filters, serializers, status, viewsets
5+
from rest_framework.authtoken.views import ObtainAuthToken
6+
from rest_framework.decorators import action
7+
from rest_framework.permissions import AllowAny, IsAuthenticated
8+
from rest_framework.response import Response
9+
from rest_framework.settings import api_settings
10+
from rest_framework_simplejwt.views import TokenObtainPairView
211

3-
# Create your views here.
12+
from .enums import TokenEnum
13+
from .filters import UserFilter
14+
from .models import Token, User
15+
from .serializers import (AuthTokenSerializer,OnboardUserSerializer,
16+
CreatePasswordFromResetOTPSerializer,
17+
CustomObtainTokenPairSerializer, EmailSerializer,
18+
ListUserSerializer, PasswordChangeSerializer,
19+
AccountVerificationSerializer,InitiatePasswordResetSerializer,
20+
UpdateUserSerializer)
21+
from .utils import IsAdmin, is_admin_user
22+
23+
24+
class CustomObtainTokenPairView(TokenObtainPairView):
25+
"""Authentice with phone number and password"""
26+
serializer_class = CustomObtainTokenPairSerializer
27+
28+
class AuthViewsets(viewsets.GenericViewSet):
29+
"""Auth viewsets"""
30+
serializer_class = EmailSerializer
31+
permission_classes = [IsAuthenticated]
32+
33+
def get_permissions(self):
34+
permission_classes = self.permission_classes
35+
if self.action in ["initiate_password_reset", "create_password", "verify_account"]:
36+
permission_classes = [AllowAny]
37+
return [permission() for permission in permission_classes]
38+
39+
@action(
40+
methods=["POST"],
41+
detail=False,
42+
serializer_class=InitiatePasswordResetSerializer,
43+
url_path="initiate-password-reset",
44+
)
45+
def initiate_password_reset(self, request, pk=None):
46+
"""Send temporary OTP to user phone to be used for password reset"""
47+
serializer = self.get_serializer(data=request.data)
48+
serializer.is_valid(raise_exception=True)
49+
serializer.save()
50+
return Response({"success": True,
51+
"message": "Temporary password sent to your mobile!"}, status=200)
52+
53+
@action(methods=['POST'], detail=False, serializer_class=CreatePasswordFromResetOTPSerializer, url_path='create-password')
54+
def create_password(self, request, pk=None):
55+
"""Create a new password given the reset OTP sent to user phone number"""
56+
serializer = self.get_serializer(data=request.data)
57+
serializer.is_valid(raise_exception=True)
58+
token: Token = Token.objects.filter(
59+
token=request.data['otp'], token_type=TokenEnum.PASSWORD_RESET).first()
60+
if not token or not token.is_valid():
61+
return Response({'success': False, 'errors': 'Invalid password reset otp'}, status=400)
62+
token.reset_user_password(request.data['new_password'])
63+
token.delete()
64+
return Response({'success': True, 'message': 'Password successfully reset'}, status=status.HTTP_200_OK)
65+
66+
@extend_schema(
67+
responses={
68+
200: inline_serializer(
69+
name='AccountVerificationStatus',
70+
fields={
71+
"success": serializers.BooleanField(default=True),
72+
"message": serializers.CharField(default="Acount Verification Successful")
73+
}
74+
),
75+
},
76+
)
77+
@action(
78+
methods=["POST"],
79+
detail=False,
80+
serializer_class=AccountVerificationSerializer,
81+
url_path="verify-account",
82+
)
83+
def verify_account(self, request, pk=None):
84+
"""Activate a user acount using the verification(OTP) sent to the user phone"""
85+
serializer = self.get_serializer(data=request.data)
86+
serializer.is_valid(raise_exception=True)
87+
serializer.save()
88+
return Response({"success": True, "message": "Acount Verification Successful"}, status=200)
89+

0 commit comments

Comments
 (0)