from __future__ import annotations from typing import Any from sqlalchemy import ForeignKey, Index, String, UniqueConstraint from sqlalchemy.types import JSON from sqlalchemy.orm import Mapped, mapped_column, relationship from app.models.base import BaseModel, ID_TYPE, TimestampMixin class OptionItem(BaseModel, TimestampMixin): __tablename__ = "option_items" __table_args__ = ( UniqueConstraint("option_group", "option_code", name="uk_option_items_group_code"), UniqueConstraint( "option_group", "parent_id", "option_label", name="uk_option_items_group_parent_label", ), Index( "idx_option_items_group_enabled_sort", "option_group", "is_enabled", "sort_order", ), Index("idx_option_items_parent_id", "parent_id"), ) id: Mapped[int] = mapped_column(ID_TYPE, primary_key=True) option_group: Mapped[str] = mapped_column(String(32), nullable=False) option_code: Mapped[str] = mapped_column(String(64), nullable=False) option_label: Mapped[str] = mapped_column(String(64), nullable=False) parent_id: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("option_items.id", ondelete="RESTRICT"), nullable=True, ) sort_order: Mapped[int] = mapped_column(nullable=False, default=0) is_enabled: Mapped[bool] = mapped_column(nullable=False, default=True) is_system: Mapped[bool] = mapped_column(nullable=False, default=False) extra_json: Mapped[dict[str, object] | list[object] | None] = mapped_column(JSON, nullable=True) created_by: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("accounts.id", ondelete="SET NULL"), nullable=True, ) updated_by: Mapped[int | None] = mapped_column( ID_TYPE, ForeignKey("accounts.id", ondelete="SET NULL"), nullable=True, ) parent: Mapped[Any] = relationship( "OptionItem", remote_side="OptionItem.id", back_populates="children", ) children: Mapped[list[Any]] = relationship("OptionItem", back_populates="parent") created_by_account: Mapped[Any] = relationship( "Account", foreign_keys=[created_by], back_populates="created_option_items", ) updated_by_account: Mapped[Any] = relationship( "Account", foreign_keys=[updated_by], back_populates="updated_option_items", ) households_as_relation_category: Mapped[list[Any]] = relationship( "Household", foreign_keys="Household.relation_category_option_id", back_populates="relation_category_option", ) households_as_relation_detail: Mapped[list[Any]] = relationship( "Household", foreign_keys="Household.relation_detail_option_id", back_populates="relation_detail_option", ) households_as_gift_method: Mapped[list[Any]] = relationship( "Household", foreign_keys="Household.gift_method_option_id", back_populates="gift_method_option", ) households_as_gift_scene: Mapped[list[Any]] = relationship( "Household", foreign_keys="Household.gift_scene_option_id", back_populates="gift_scene_option", ) gift_records_as_method: Mapped[list[Any]] = relationship( "GiftRecord", foreign_keys="GiftRecord.method_option_id", back_populates="method_option", ) gift_records_as_scene: Mapped[list[Any]] = relationship( "GiftRecord", foreign_keys="GiftRecord.scene_option_id", back_populates="scene_option", )