11from rest_framework import serializers
22
3- from zserver .models import Session , SignUpOTP , UserProfile
3+ from zserver .models import Session , SignUpOTP , UnverifiedUserProfile , UserProfile , VerifyUserOTP
44
55
66# Serializer class for the UserProfile model
@@ -19,12 +19,6 @@ class Meta:
1919 "password" : {"write_only" : True }, # Make the password field write-only
2020 }
2121
22- def create (self , validated_data : dict ) -> UserProfile :
23- """Create a new user profile and generate OTP."""
24- user = UserProfile .objects .create (** validated_data )
25- user .generate_otp ()
26- return user
27-
2822 def update (self , instance : UserProfile , validated_data : dict ) -> UserProfile :
2923 """Update an existing user profile."""
3024 instance .fullname = validated_data .get ("fullname" , instance .fullname )
@@ -34,14 +28,46 @@ def update(self, instance: UserProfile, validated_data: dict) -> UserProfile:
3428 return instance
3529
3630
37- # Serializer class for the SignUpOTP model
38- class SignUpOTPSerializer (serializers .ModelSerializer ):
31+ # Serializer class for the UnverifiedUserProfile model
32+ class UnverifiedUserProfileSerializer (serializers .ModelSerializer ):
33+ class Meta :
34+ """Meta class to specify the model and fields to be serialized."""
35+
36+ model = UnverifiedUserProfile
37+ fields = [
38+ "fullname" ,
39+ "email" ,
40+ "password" ,
41+ ] # Fields to be included in the serialization
42+ extra_kwargs = {
43+ "password" : {"write_only" : True }, # Make the password field write-only
44+ }
45+
46+ def validate_email (self , value : str ) -> str :
47+ """Validate that the email is not already in use."""
48+ if UserProfile .objects .filter (email = value ).exists ():
49+ raise serializers .ValidationError ("Email is already in use." )
50+ return value
51+
52+ def create (self , validated_data : dict ) -> UnverifiedUserProfile :
53+ """Create a new unverified user profile."""
54+ if UnverifiedUserProfile .objects .filter (email = validated_data ["email" ]).exists ():
55+ UnverifiedUserProfile .objects .filter (email = validated_data ["email" ]).delete ()
56+ # Create a new unverified user profile
57+ # and generate an OTP for verification
58+ user = UnverifiedUserProfile .objects .create (** validated_data )
59+ user .generate_otp ()
60+ return user
61+
62+
63+ # serializer for VerifyUserOTP model
64+ class VerifyUserOTPSerializer (serializers .ModelSerializer ):
3965 email = serializers .EmailField (max_length = 100 )
4066
4167 class Meta :
4268 """Meta class to specify the model and fields to be serialized."""
4369
44- model = SignUpOTP
70+ model = VerifyUserOTP
4571 fields = ["otp" , "email" ]
4672
4773 def validate (self , data : dict ) -> dict :
@@ -50,13 +76,13 @@ def validate(self, data: dict) -> dict:
5076 otp = data .get ("otp" )
5177
5278 try :
53- user = UserProfile .objects .get (email = email )
54- except UserProfile .DoesNotExist as err :
79+ user = UnverifiedUserProfile .objects .get (email = email )
80+ except UnverifiedUserProfile .DoesNotExist as err :
5581 raise serializers .ValidationError ({"email" : "User does not exist." }) from err
5682
5783 try :
58- user_otp = SignUpOTP .objects .get (user = user )
59- except SignUpOTP .DoesNotExist as err :
84+ user_otp = VerifyUserOTP .objects .get (user = user )
85+ except VerifyUserOTP .DoesNotExist as err :
6086 raise serializers .ValidationError ({"otp" : "OTP does not exist." }) from err
6187
6288 if user_otp .otp != otp :
@@ -66,16 +92,18 @@ def validate(self, data: dict) -> dict:
6692 data ["user_otp" ] = user_otp
6793 return data
6894
69- def make_user_active (self ) -> None :
70- """Activate the user ."""
95+ def signup_user (self ) -> None :
96+ """Add user to UserProfile table and delete the OTP ."""
7197 user = self .validated_data ["user" ]
72- user .is_active = True
73- user .save ()
74-
75- def delete_otp (self ) -> None :
76- """Delete the OTP."""
77- user_otp = self .validated_data ["user_otp" ]
78- user_otp .delete ()
98+ user_profile = UserProfile (
99+ fullname = user .fullname ,
100+ email = user .email ,
101+ password = user .password ,
102+ )
103+ user_profile .is_active = True
104+ user_profile .save ()
105+ user .delete ()
106+ self .validated_data ["user_otp" ].delete ()
79107
80108
81109class SessionSerializer (serializers .Serializer ):
0 commit comments