Files
budget-forecast/api/app/account/schemas.py

71 lines
1.9 KiB
Python

from datetime import date
from decimal import Decimal
from typing import Optional
from uuid import UUID, uuid4
from sqlmodel import Field, SQLModel
from pydantic import Field as PydField
from pydantic.json_schema import SkipJsonSchema
from account.enums import Asset, Liability, CategoryFamily
from core.types import MonetaryAmount
class AccountBase(SQLModel):
name: str = Field(index=True)
parent_account_id: Optional[UUID] = Field(default=None, foreign_key="account.id")
class AccountBaseId(AccountBase):
id: UUID | None = Field(default_factory=uuid4, primary_key=True)
family: str = Field(index=True)
type: str = Field(index=True)
path: str = Field(index=True)
class AccountRead(AccountBaseId):
pass#opening_date: date = Field()
#opening_balance: Decimal = Field(decimal_places=2, default=0)
class BaseAccountWrite(AccountBase):
path: SkipJsonSchema[str] = Field(default="")
family: SkipJsonSchema[str] = Field(default="")
class AccountWrite(BaseAccountWrite):
type: Asset | Liability = Field()
parent_account_id: UUID | None = PydField(default=None, json_schema_extra={
"foreign_key": {
"reference": {
"resource": "accounts",
"schema": "AccountRead",
"label": "name"
}
}
})
opening_date: date = Field()
opening_balance: MonetaryAmount = Field()
class AccountCreate(AccountWrite):
pass
class AccountUpdate(AccountWrite):
pass
class CategoryRead(AccountBaseId):
pass
class CategoryWrite(BaseAccountWrite):
type: CategoryFamily = Field()
parent_account_id: UUID | None = PydField(default=None, json_schema_extra={
"foreign_key": {
"reference": {
"resource": "categories",
"schema": "CategoryRead",
"label": "name"
}
}
})
class CategoryCreate(CategoryWrite):
pass
class CategoryUpdate(CategoryWrite):
pass