Files
budget-forecast/api/app/payee/models.py

77 lines
1.9 KiB
Python

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"]