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/unlimited-leads/Unlimited-Leads-Be/authorization/models.py
import uuid
import pyotp
from datetime import timedelta

from django.contrib.auth.models import AbstractUser
from django.db.models import (
    EmailField,
    UUIDField,
    CharField,
    IntegerField,
    BooleanField,
    DateTimeField,
    Model,
    CASCADE,
    ForeignKey,
)
from django.utils import timezone

from .managers import UnlimitedLeadUserManager


# Create your models here.
class UnlimitedLeadUser(AbstractUser):
    id = UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    email = EmailField(unique=True)
    phone_number = CharField(max_length=15, blank=True, null=True)
    profile_image = CharField(max_length=255, blank=True, null=True)
    stripe_id = CharField(max_length=255, blank=True, null=True)
    is_deleted = BooleanField(default=False)
    is_verified = BooleanField(default=False)
    email_sent_for_3d_cards = BooleanField(default=False)
    deleted_at = DateTimeField(null=True, blank=True)
    blocked_at = DateTimeField(null=True, blank=True)
    credit_limit=IntegerField(null=True, blank=True, default=0)

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    objects = UnlimitedLeadUserManager()

    def __str__(self):
        return self.email


class VerificationMailRequest(Model):
    user = ForeignKey(UnlimitedLeadUser, on_delete=CASCADE)
    otp = CharField(max_length=6, null=True, blank=True)
    created_at = DateTimeField(auto_now=True)

    def generate_otp(self):
        totp = pyotp.TOTP(pyotp.random_base32(), interval=300)
        self.otp = totp.now()
        self.save()
        return self.otp

    def verify_otp(self, otp):
        return self.otp == otp

    def is_expired(self):
        return (timezone.now() - self.created_at) > timedelta(minutes=5)


class ForgetPassowordRequest(Model):
    user = ForeignKey(UnlimitedLeadUser, on_delete=CASCADE)
    token = CharField(max_length=255)
    created_at = DateTimeField(auto_now=True)

    def is_expired(self):
        return (timezone.now() - self.created_at) > timedelta(minutes=5)


class LoginUserDevice(Model):
    BROWSER = "browser"
    ANDROID = "android"
    IPHONE = "iphone"
    OTHER = "other"

    DEVICE_CHOICES = [
        (BROWSER, "Browser"),
        (ANDROID, "Android"),
        (IPHONE, "iPhone"),
        (OTHER, "Other"),
    ]

    id = UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = ForeignKey(UnlimitedLeadUser, on_delete=CASCADE)
    device_type = CharField(
        max_length=100,
        choices=DEVICE_CHOICES,
        default=BROWSER,
    )
    login_at = DateTimeField()
    expiration_period = IntegerField(default=0)
    is_remember = BooleanField(default=False)

    def __str__(self):
        return f"{self.user.email} - {self.device_type}"