Spaces:
Sleeping
Sleeping
| 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}" | |