42 lines
1.1 KiB
Python
42 lines
1.1 KiB
Python
from sqlalchemy import Column, ForeignKey, String
|
|
from sqlalchemy.orm import relationship
|
|
|
|
from atst.models import Base
|
|
from atst.models.types import Id
|
|
from atst.models.mixins import TimestampsMixin
|
|
from atst.models.workspace_user import WorkspaceUser
|
|
from atst.utils import first_or_none
|
|
|
|
|
|
class Workspace(Base, TimestampsMixin):
|
|
__tablename__ = "workspaces"
|
|
|
|
id = Id()
|
|
name = Column(String, unique=True)
|
|
request_id = Column(ForeignKey("requests.id"), nullable=False)
|
|
projects = relationship("Project", back_populates="workspace")
|
|
roles = relationship("WorkspaceRole")
|
|
|
|
@property
|
|
def owner(self):
|
|
def _is_workspace_owner(workspace_role):
|
|
return workspace_role.role.name == "owner"
|
|
|
|
return first_or_none(_is_workspace_owner, self.roles)
|
|
|
|
@property
|
|
def users(self):
|
|
return set(role.user for role in self.roles)
|
|
|
|
@property
|
|
def user_count(self):
|
|
return len(self.users)
|
|
|
|
@property
|
|
def task_order(self):
|
|
return {"number": "task-order-number"}
|
|
|
|
@property
|
|
def members(self):
|
|
return [WorkspaceUser(role.user, role) for role in self.roles]
|