from uuid import UUID, uuid4 from typing import Optional from fastapi_filter.contrib.sqlalchemy import Filter from sqlmodel import Field, SQLModel, select, Relationship from pydantic import Field as PydField from account.models import Account, AccountRead class PayeeBase(SQLModel): name: str = Field(index=True) default_account_id: UUID | None = Field(default=None, foreign_key="account.id") class PayeeBaseId(PayeeBase): id: UUID | None = Field(default_factory=uuid4, primary_key=True) class Payee(PayeeBaseId, table=True): default_account: Account | None = Relationship() @classmethod def create(cls, payee, session): payee_db = cls.model_validate(payee) session.add(payee_db) session.commit() session.refresh(payee_db) return payee_db @classmethod def list(cls, filters): return filters.filter(select(cls)).join(Account) @classmethod def get(cls, session, payee_id): return session.get(Payee, payee_id) @classmethod def update(cls, session, payee_db, payee_data): payee_db.sqlmodel_update(payee_data) session.add(payee_db) session.commit() session.refresh(payee_db) return payee_db @classmethod def delete(cls, session, payee): session.delete(payee) session.commit() class PayeeRead(PayeeBaseId): default_account: AccountRead class PayeeWrite(PayeeBase): default_account_id: UUID = PydField(default=None, json_schema_extra={ "foreign_key": { "reference": { "resource": "accounts", "schema": "AccountRead", "label": "name" } } }) class PayeeCreate(PayeeWrite): pass class PayeeUpdate(PayeeWrite): pass class PayeeFilters(Filter): name__like: Optional[str] = None class Constants(Filter.Constants): model = Payee search_model_fields = ["name"]