from django.db import models from django.contrib.auth.models import AbstractBaseUser, BaseUserManager, PermissionsMixin from django.utils import timezone # ---------------- CUSTOM USER MANAGER ---------------- class CustomUserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError("The Email field must be set") email = self.normalize_email(email) user = self.model(email=email, **extra_fields) user.set_password(password) user.save(using=self._db) return user def create_superuser(self, email, password=None, **extra_fields): extra_fields.setdefault("is_staff", True) extra_fields.setdefault("is_superuser", True) if extra_fields.get("is_staff") is not True: raise ValueError("Superuser must have is_staff=True.") if extra_fields.get("is_superuser") is not True: raise ValueError("Superuser must have is_superuser=True.") return self.create_user(email, password, **extra_fields) # ---------------- CUSTOM USER MODEL ---------------- class User(AbstractBaseUser, PermissionsMixin): email = models.EmailField(unique=True, max_length=255) first_name = models.CharField(max_length=50, blank=True, null=True) last_name = models.CharField(max_length=50, blank=True, null=True) is_active = models.BooleanField(default=True) is_staff = models.BooleanField(default=False) date_joined = models.DateTimeField(default=timezone.now) objects = CustomUserManager() USERNAME_FIELD = "email" REQUIRED_FIELDS = [] def __str__(self): return self.email # ---------------- USER PROFILE MODEL ---------------- class Profile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="profile") phone = models.CharField(max_length=15, blank=True, null=True) address = models.TextField(blank=True, null=True) wallet_balance = models.DecimalField(max_digits=10, decimal_places=2, default=0.00) preferences = models.JSONField(blank=True, null=True) def __str__(self): return f"Profile - {self.user.email}"