from django.contrib.auth import get_user_model from django.db import models from core.models.base import BaseModel User = get_user_model() class Workspace(BaseModel): name = models.CharField(max_length=255) description = models.TextField(blank=True) owner = models.ForeignKey( User, on_delete=models.PROTECT, related_name="owned_workspaces", ) class Meta: db_table = "workspace" ordering = ("-updated_at", "-created_at") indexes = [ models.Index(fields=["owner"], name="workspace_owner_idx"), ] def __str__(self): return self.name @property def members(self): return User.objects.filter( workspace_memberships__workspace=self, workspace_memberships__is_active=True, ) class WorkspaceMembership(BaseModel): class Role(models.TextChoices): OWNER = "owner", "Owner" ADMIN = "admin", "Admin" MEMBER = "member", "Member" GUEST = "guest", "Guest" workspace = models.ForeignKey( Workspace, on_delete=models.CASCADE, related_name="memberships", ) user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="workspace_memberships", ) role = models.CharField( max_length=20, choices=Role.choices, default=Role.MEMBER, ) is_active = models.BooleanField(default=True) joined_at = models.DateTimeField(auto_now_add=True) class Meta: db_table = "workspace_membership" ordering = ("-created_at",) indexes = [ models.Index(fields=["workspace"], name="membership_workspace_idx"), models.Index(fields=["user"], name="membership_user_idx"), ] constraints = [ models.UniqueConstraint( fields=["workspace", "user"], name="unique_workspace_membership", condition=models.Q(is_deleted=False), ) ] def __str__(self): return f"{self.user} @ {self.workspace}"