50 lines
2.3 KiB
Python
50 lines
2.3 KiB
Python
from __future__ import annotations
|
|
|
|
from sqlalchemy import CheckConstraint, ForeignKey, Index, Integer, Numeric, String, text
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from src.db.base import Base
|
|
|
|
|
|
class Project(Base):
|
|
__tablename__ = "project"
|
|
__table_args__ = (
|
|
CheckConstraint("level IN ('program', 'project')", name="project_level_check"),
|
|
CheckConstraint(
|
|
"placement_type IS NULL OR placement_type IN ('own', 'rent', 'other')",
|
|
name="project_placement_type_check",
|
|
),
|
|
CheckConstraint(
|
|
"project_type IS NULL OR project_type IN ('current', 'development')",
|
|
name="project_project_type_check",
|
|
),
|
|
CheckConstraint(
|
|
"vsp_format IS NULL OR vsp_format IN ('office', 'standalone', 'atm', 'other')",
|
|
name="project_vsp_format_check",
|
|
),
|
|
CheckConstraint(
|
|
text("name IS NOT NULL AND name <> ''"),
|
|
name="chk_v3_project_name",
|
|
),
|
|
Index("ix_v3_project_ssp", "org_unit_id"),
|
|
{"schema": "v3"},
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
name: Mapped[str | None] = mapped_column(String)
|
|
level: Mapped[str | None] = mapped_column(String)
|
|
parent_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("v3.project.id"))
|
|
project_type: Mapped[str | None] = mapped_column(String)
|
|
vsp_format: Mapped[str | None] = mapped_column(String)
|
|
placement_type: Mapped[str | None] = mapped_column(String)
|
|
object_address: Mapped[str | None] = mapped_column(String)
|
|
staff_count: Mapped[int | None] = mapped_column(Integer)
|
|
total_area: Mapped[float | None] = mapped_column(Numeric)
|
|
org_unit_id: Mapped[int | None] = mapped_column(Integer, ForeignKey("v3.org_unit.id"))
|
|
|
|
# parent = relationship("Project", remote_side="Project.id", back_populates="children")
|
|
# children: Mapped[list["Project"]] = relationship("Project", back_populates="parent") # type: ignore
|
|
# org_unit = relationship("OrgUnit", back_populates="projects")
|
|
# budget_lines: Mapped[list["BudgetLine"]] = relationship("BudgetLine", back_populates="project") # type: ignore
|
|
rf_project_reports: Mapped[list["RfProjectReport"]] = relationship("RfProjectReport", back_populates="project") # type: ignore
|