from sqlalchemy import Column, String, Text, Boolean, DateTime, Date, Numeric, Enum, ForeignKey from sqlalchemy.orm import relationship from sqlalchemy.sql import func from app.core.database import Base import enum class SecurityLevel(str, enum.Enum): PUBLIC = "public" DEPARTMENT = "department" CONFIDENTIAL = "confidential" class Project(Base): __tablename__ = "pjctrl_projects" id = Column(String(36), primary_key=True) space_id = Column(String(36), ForeignKey("pjctrl_spaces.id", ondelete="CASCADE"), nullable=False) title = Column(String(200), nullable=False) description = Column(Text, nullable=True) owner_id = Column(String(36), ForeignKey("pjctrl_users.id"), nullable=False) budget = Column(Numeric(15, 2), nullable=True) start_date = Column(Date, nullable=True) end_date = Column(Date, nullable=True) security_level = Column( Enum("public", "department", "confidential", name="security_level_enum"), default="department", nullable=False ) status = Column(String(50), default="active", nullable=False) is_active = Column(Boolean, default=True, nullable=False) department_id = Column(String(36), ForeignKey("pjctrl_departments.id"), nullable=True) created_at = Column(DateTime, server_default=func.now(), nullable=False) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False) # Relationships space = relationship("Space", back_populates="projects") owner = relationship("User", foreign_keys=[owner_id], back_populates="owned_projects") department = relationship("Department", back_populates="projects") task_statuses = relationship("TaskStatus", back_populates="project", cascade="all, delete-orphan") tasks = relationship("Task", back_populates="project", cascade="all, delete-orphan") triggers = relationship("Trigger", back_populates="project", cascade="all, delete-orphan") health = relationship("ProjectHealth", back_populates="project", uselist=False, cascade="all, delete-orphan") custom_fields = relationship("CustomField", back_populates="project", cascade="all, delete-orphan")