File: //home/arjun/projects/aigenerator/AI-LG-backend/Ai_logo_generation/authorization/views/signup.py
import random
from rest_framework.decorators import api_view
from rest_framework.response import Response
from drf_yasg.utils import swagger_auto_schema
from rest_framework import status
from ..serializers import UserSignupSerializer
from ..models import VerificationMailRequest
from django.utils import timezone
from datetime import timedelta
from utils.email import email_service
from user_notification.models import NotificationToken
@swagger_auto_schema(method='post',security=[], request_body=UserSignupSerializer, tags=['Auth'])
@api_view(['POST'])
def signup(request):
serializer = UserSignupSerializer(data=request.data)
if serializer.is_valid():
user = serializer.save()
otp = random.randint(100000, 999999)
non_creatable = timezone.now() - timedelta(minutes=10)
sended_otp = VerificationMailRequest.objects.filter(created_at__gte=non_creatable, otp=otp)
if sended_otp.exists():
otp = random.randint(100000, 999999)
VerificationMailRequest.objects.create(user=user, otp=otp)
# reset notification_token for every user and assign to current signup
# if notification_token is guest then it will be deleted.
notification_token_data = serializer.validated_data.get("notification_token")
notification_token = None
if notification_token_data:
for user_notification in NotificationToken.objects.filter(token=notification_token_data):
if user_notification.user is not None:
user_notification.token = None
user_notification.save()
else:
user_notification.delete()
notification_token = NotificationToken.objects.create(
user=user,
device_type=serializer.validated_data.get("device_type"),
token=notification_token_data,
)
try:
service = email_service.EmailService(user.id)
service.send_signup_confirmation()
service.send_login_confirmation(otp)
except:
return Response({'error': 'Failed to send activation email'}, status=status.HTTP_400_BAD_REQUEST)
response_data = {
"data": {
"id": user.uuid,
"first_name": user.first_name,
"last_name": user.last_name,
"email": user.email,
"notification": notification_token.id if notification_token else None,
},
"success": True,
"message": "Signup successful. Please check your email for verification code.",
"statusCode": 201,
}
return Response(response_data, status=status.HTTP_201_CREATED)
# Handle errors
return Response({
"success": False,
"message": "Signup failed",
"error": serializer.errors,
"statusCode": 400,
}, status=status.HTTP_400_BAD_REQUEST)