from django.contrib.auth.models import AbstractUser from django.db import models class CustomUser(AbstractUser): class Role(models.TextChoices): ADMIN = "admin", "Admin" CLIENT = "client", "Client" MEMBER = "member", "Team Member" role = models.CharField(max_length=20, choices=Role.choices, default=Role.MEMBER) class Meta: ordering = ["username"] verbose_name_plural = "users" def is_admin(self): return self.role == self.Role.ADMIN or self.is_superuser def is_client(self): return self.role == self.Role.CLIENT def is_member(self): return self.role == self.Role.MEMBER class ProjectMembership(models.Model): user = models.ForeignKey(CustomUser, on_delete=models.CASCADE, related_name="memberships") project = models.ForeignKey("projects.Project", on_delete=models.CASCADE, related_name="memberships") joined_at = models.DateTimeField(auto_now_add=True) class Meta: unique_together = ("user", "project") def __str__(self): return f"{self.user} -> {self.project}"