55 lines
1.9 KiB
Python
55 lines
1.9 KiB
Python
from __future__ import annotations
|
|
|
|
import enum
|
|
|
|
from sqlalchemy import CheckConstraint, ForeignKey, Index, Integer, String, text
|
|
from sqlalchemy.orm import Mapped, mapped_column, relationship
|
|
|
|
from src.db.base import Base
|
|
|
|
|
|
class Form4ProjectLevelEnum(str, enum.Enum):
|
|
PROGRAM = "program"
|
|
PROJECT = "project"
|
|
|
|
|
|
class Form4Project(Base):
|
|
__tablename__ = "form4_project"
|
|
__table_args__ = (
|
|
CheckConstraint(
|
|
"level IN ('program', 'project')", name="chk_form4_project_level"
|
|
),
|
|
CheckConstraint(
|
|
"(level = 'program' AND parent_id IS NULL) OR (level = 'project')",
|
|
name="chk_form4_project_parent",
|
|
),
|
|
CheckConstraint(
|
|
"(level = 'program') = (section_code IS NOT NULL)",
|
|
name="chk_form4_project_section_code",
|
|
),
|
|
Index(
|
|
"ix_form4_project_section_code",
|
|
"section_code",
|
|
postgresql_where=text("level = 'program'"),
|
|
),
|
|
Index("ix_v3_form4_project_parent", "parent_id"),
|
|
Index("ix_v3_form4_project_form", "form_id"),
|
|
{"schema": "v3"},
|
|
)
|
|
|
|
id: Mapped[int] = mapped_column(primary_key=True)
|
|
name: Mapped[str] = mapped_column(String)
|
|
level: Mapped[Form4ProjectLevelEnum] = mapped_column(String) # type: ignore
|
|
section_code: Mapped[str | None] = mapped_column(String)
|
|
parent_id: Mapped[int | None] = mapped_column(
|
|
Integer, ForeignKey("v3.form4_project.id")
|
|
)
|
|
form_id: Mapped[int] = mapped_column(
|
|
Integer, ForeignKey("v3.budget_form.id")
|
|
)
|
|
|
|
# parent = relationship("Form4Project", remote_side="Form4Project.id", back_populates="children")
|
|
# children: Mapped[list["Form4Project"]] = relationship("Form4Project", back_populates="parent") # type: ignore
|
|
# budget_form = relationship("BudgetForm")
|
|
# budget_lines: Mapped[list["BudgetLine"]] = relationship("BudgetLine", back_populates="form4_project") # type: ignore
|