DFiP_Budget_planing/api/src/db/models/form4_project.py

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