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}"