HEX
Server: Apache/2.4.52 (Ubuntu)
System: Linux spn-python 5.15.0-89-generic #99-Ubuntu SMP Mon Oct 30 20:42:41 UTC 2023 x86_64
User: arjun (1000)
PHP: 8.1.2-1ubuntu2.20
Disabled: NONE
Upload Files
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)