import uuid from django.contrib.auth.models import AbstractUser, UserManager as BaseUserManager from django.db import models class UserManager(BaseUserManager): def create_user(self, email, password=None, **extra_fields): if not email: raise ValueError("Email is required") 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) return self.create_user(email, password, **extra_fields) class User(AbstractUser): class Roles(models.TextChoices): BUYER = "buyer", "Buyer" OPS = "ops", "Operations" ADMIN = "admin", "Administrator" id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False) email = models.EmailField(unique=True) full_name = models.CharField(max_length=255, blank=True) company_name = models.CharField(max_length=255, blank=True) role = models.CharField(max_length=20, choices=Roles.choices, default=Roles.BUYER) stripe_customer_id = models.CharField(max_length=255, blank=True, null=True) keycloak_id = models.CharField(max_length=255, unique=True, null=True, blank=True) is_active = models.BooleanField(default=True) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) username = None first_name = None last_name = None objects = UserManager() USERNAME_FIELD = "email" REQUIRED_FIELDS = [] def __str__(self): return self.full_name or self.email class Meta: db_table = "users" verbose_name = "User" verbose_name_plural = "Users" ordering = ["-created_at"]