from django.contrib.auth.models import AbstractUser, Group from django.db import models class User(AbstractUser): email = models.EmailField(unique=True) first_name = models.CharField(max_length=30) last_name = models.CharField(max_length=30) is_verified = models.BooleanField(default=False) created_at = models.DateTimeField(auto_now_add=True) updated_at = models.DateTimeField(auto_now=True) USERNAME_FIELD = 'email' REQUIRED_FIELDS = ['username', 'first_name', 'last_name'] class Meta: db_table = 'auth_user' def __str__(self): return self.email @property def full_name(self): return f"{self.first_name} {self.last_name}".strip() def has_role(self, role_name): return self.groups.filter(name=role_name).exists() def assign_role(self, role_name): group, created = Group.objects.get_or_create(name=role_name) self.groups.add(group) def remove_role(self, role_name): try: group = Group.objects.get(name=role_name) self.groups.remove(group) except Group.DoesNotExist: pass class UserProfile(models.Model): user = models.OneToOneField(User, on_delete=models.CASCADE, related_name='profile') bio = models.TextField(max_length=500, blank=True) location = models.CharField(max_length=30, blank=True) birth_date = models.DateField(null=True, blank=True) avatar = models.ImageField(upload_to='avatars/', null=True, blank=True) phone_number = models.CharField(max_length=15, blank=True) def __str__(self): return f"{self.user.email} Profile"