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}" class PriceUnit(BaseModel): code = models.CharField(max_length=8, unique=True) name = models.CharField(max_length=64) local_name = models.CharField(max_length=64, blank=True) symbol = models.CharField(max_length=16, blank=True) class Meta: db_table = "price_unit" ordering = ("code",) indexes = [ models.Index(fields=["code"], name="price_unit_code_idx"), ] def __str__(self): return self.code class WorkspaceUserRate(BaseModel): workspace = models.ForeignKey( Workspace, on_delete=models.CASCADE, related_name="user_rates", ) user = models.ForeignKey( User, on_delete=models.CASCADE, related_name="workspace_rates", ) hourly_rate = models.DecimalField( max_digits=10, decimal_places=2, ) currency = models.CharField( max_length=3, default="USD", ) effective_from = models.DateTimeField() class Meta: db_table = "workspace_user_rate" ordering = ("-effective_from",) constraints = [ models.UniqueConstraint( fields=["workspace", "user"], name="unique_workspace_user_rate", condition=models.Q(is_deleted=False), ) ] indexes = [ models.Index(fields=["workspace"], name="wur_workspace_idx"), models.Index(fields=["user"], name="wur_user_idx"), ]