from django.contrib.auth.base_user import BaseUserManager from django.contrib.auth.models import AbstractUser from django.db import models from django.utils.text import slugify class UserManager(BaseUserManager): use_in_migrations = True 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) extra_fields.setdefault("is_active", 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) class User(AbstractUser): username = None email = models.EmailField(unique=True) phone_number = models.CharField(max_length=32, blank=True) is_vendor = models.BooleanField(default=False) is_customer = models.BooleanField(default=True) USERNAME_FIELD = "email" REQUIRED_FIELDS: list[str] = [] objects = UserManager() def __str__(self) -> str: return self.email class VendorProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="vendor_profile") business_name = models.CharField(max_length=255) slug = models.SlugField(max_length=255, unique=True, blank=True) description = models.TextField(blank=True) contact_phone = models.CharField(max_length=32, blank=True) contact_email = models.EmailField(blank=True) address_line1 = models.CharField(max_length=255, blank=True) address_line2 = models.CharField(max_length=255, blank=True) city = models.CharField(max_length=100, blank=True) state = models.CharField(max_length=100, blank=True) postal_code = models.CharField(max_length=32, blank=True) country = models.CharField(max_length=100, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def save(self, *args, **kwargs): if not self.slug: self.slug = slugify(self.business_name) super().save(*args, **kwargs) def __str__(self) -> str: return self.business_name class CustomerProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name="customer_profile") preferred_contact_method = models.CharField(max_length=32, blank=True) emergency_contact_name = models.CharField(max_length=255, blank=True) emergency_contact_phone = models.CharField(max_length=32, blank=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) def __str__(self) -> str: return f"Customer profile: {self.user.email}"