You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

147 lines
5.2 KiB

from __future__ import annotations
from datetime import datetime
from decimal import Decimal
from typing import Any
from sqlalchemy import DateTime, ForeignKey, Index, Integer, Numeric, String, Text, UniqueConstraint, text
from sqlalchemy.types import JSON
from sqlalchemy.orm import Mapped, mapped_column, relationship
from app.models.base import BaseModel, ID_TYPE, TimestampMixin
class Household(BaseModel, TimestampMixin):
__tablename__ = "households"
__table_args__ = (
UniqueConstraint("household_code", name="uk_households_household_code"),
Index(
"uk_households_head_name_active",
"head_name",
unique=True,
sqlite_where=text("deleted_at IS NULL"),
),
Index("idx_households_head_name", "head_name"),
Index("idx_households_phone", "phone"),
Index(
"idx_households_side_relation_category",
"side",
"relation_category_option_id",
),
Index("idx_households_attendance_status", "attendance_status"),
Index("idx_households_updated_at", "updated_at"),
Index("idx_households_deleted_at", "deleted_at"),
)
id: Mapped[int] = mapped_column(ID_TYPE, primary_key=True)
household_code: Mapped[str] = mapped_column(String(32), nullable=False)
head_name: Mapped[str] = mapped_column(String(64), nullable=False)
phone: Mapped[str | None] = mapped_column(String(32), nullable=True)
side: Mapped[str] = mapped_column(String(32), nullable=False, default="groom_side")
relation_category_option_id: Mapped[int | None] = mapped_column(
ID_TYPE,
ForeignKey("option_items.id", ondelete="RESTRICT"),
nullable=True,
)
relation_detail_option_id: Mapped[int | None] = mapped_column(
ID_TYPE,
ForeignKey("option_items.id", ondelete="RESTRICT"),
nullable=True,
)
tag_option_ids_json: Mapped[list[int] | None] = mapped_column(JSON, nullable=True)
invite_status: Mapped[str] = mapped_column(
String(32),
nullable=False,
default="not_invited",
)
attendance_status: Mapped[str] = mapped_column(
String(32),
nullable=False,
default="pending",
)
expected_attendee_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
actual_attendee_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
child_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
red_packet_child_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)
total_gift_amount: Mapped[Decimal] = mapped_column(
Numeric(12, 2),
nullable=False,
default=Decimal("0.00"),
)
gift_method_option_id: Mapped[int | None] = mapped_column(
ID_TYPE,
ForeignKey("option_items.id", ondelete="RESTRICT"),
nullable=True,
)
gift_scene_option_id: Mapped[int | None] = mapped_column(
ID_TYPE,
ForeignKey("option_items.id", ondelete="RESTRICT"),
nullable=True,
)
favor_status: Mapped[str] = mapped_column(
String(32),
nullable=False,
default="not_given",
)
candy_status: Mapped[str] = mapped_column(
String(32),
nullable=False,
default="not_given",
)
child_red_packet_status: Mapped[str] = mapped_column(
String(32),
nullable=False,
default="not_given",
)
note: Mapped[str | None] = mapped_column(Text, 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,
)
deleted_at: Mapped[datetime | None] = mapped_column(DateTime, nullable=True)
version: Mapped[int] = mapped_column(Integer, nullable=False, default=1)
created_by_account: Mapped[Any] = relationship(
"Account",
foreign_keys=[created_by],
back_populates="created_households",
)
updated_by_account: Mapped[Any] = relationship(
"Account",
foreign_keys=[updated_by],
back_populates="updated_households",
)
relation_category_option: Mapped[Any] = relationship(
"OptionItem",
foreign_keys=[relation_category_option_id],
back_populates="households_as_relation_category",
)
relation_detail_option: Mapped[Any] = relationship(
"OptionItem",
foreign_keys=[relation_detail_option_id],
back_populates="households_as_relation_detail",
)
gift_method_option: Mapped[Any] = relationship(
"OptionItem",
foreign_keys=[gift_method_option_id],
back_populates="households_as_gift_method",
)
gift_scene_option: Mapped[Any] = relationship(
"OptionItem",
foreign_keys=[gift_scene_option_id],
back_populates="households_as_gift_scene",
)
members: Mapped[list[Any]] = relationship(
"HouseholdMember",
back_populates="household",
)
gift_records: Mapped[list[Any]] = relationship(
"GiftRecord",
back_populates="household",
)