initial commit

This commit is contained in:
2026-03-11 17:12:28 +08:00
commit 5d1e1cb7cb
61 changed files with 2971 additions and 0 deletions

77
apps/workspaces/models.py Normal file
View File

@@ -0,0 +1,77 @@
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}"