Files
PROJECT-CONTORL/backend/app/models/project.py
2026-01-11 08:37:21 +08:00

51 lines
2.4 KiB
Python

from sqlalchemy import Column, String, Text, Boolean, DateTime, Date, Numeric, Enum, ForeignKey
from sqlalchemy.orm import relationship, synonym
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")
# Project membership for cross-department collaboration
members = relationship("ProjectMember", back_populates="project", cascade="all, delete-orphan")
# Backward-compatible alias for older code/tests that use name instead of title
name = synonym("title")