Compare commits

...

2 Commits

Author SHA1 Message Date
2fa5e04dca Removing opening info from category 2025-02-12 21:35:39 +01:00
b6bef1f775 Adding a common moneratary amount field type 2025-02-12 20:35:13 +01:00
4 changed files with 45 additions and 7 deletions

View File

@@ -1,8 +1,6 @@
from typing import Optional, Any from typing import Optional
from pydantic import computed_field
from sqlmodel import Relationship from sqlmodel import Relationship
from sqlalchemy.sql import text
from account.enums import CategoryFamily, Asset, Liability, AccountFamily from account.enums import CategoryFamily, Asset, Liability, AccountFamily
from account.schemas import AccountBaseId from account.schemas import AccountBaseId

View File

@@ -3,11 +3,12 @@ from decimal import Decimal
from typing import Optional from typing import Optional
from uuid import UUID, uuid4 from uuid import UUID, uuid4
from pydantic.json_schema import SkipJsonSchema
from sqlmodel import Field, SQLModel from sqlmodel import Field, SQLModel
from pydantic import Field as PydField from pydantic import Field as PydField
from pydantic.json_schema import SkipJsonSchema
from account.enums import Asset, Liability, CategoryFamily from account.enums import Asset, Liability, CategoryFamily
from core.types import MonetaryAmount
class AccountBase(SQLModel): class AccountBase(SQLModel):
name: str = Field(index=True) name: str = Field(index=True)
@@ -39,7 +40,7 @@ class AccountWrite(BaseAccountWrite):
} }
}) })
opening_date: date = Field() opening_date: date = Field()
opening_balance: Decimal = Field(decimal_places=2, default=0) opening_balance: MonetaryAmount = Field()
class AccountCreate(AccountWrite): class AccountCreate(AccountWrite):
pass pass
@@ -61,8 +62,6 @@ class CategoryWrite(BaseAccountWrite):
} }
} }
}) })
opening_date: date = date(1970, 1, 1)
opening_balance: Decimal = 0
class CategoryCreate(CategoryWrite): class CategoryCreate(CategoryWrite):
pass pass

0
api/app/core/__init__.py Normal file
View File

41
api/app/core/types.py Normal file
View File

@@ -0,0 +1,41 @@
from dataclasses import dataclass
from decimal import Decimal
from typing import Any
from pydantic import GetCoreSchemaHandler
from pydantic_core import core_schema
@dataclass
class MonetaryAmount:
amount: Decimal# = Field(decimal_places=2, default=0)
@classmethod
def __get_pydantic_core_schema__(
cls, source: type[Any], handler: GetCoreSchemaHandler
) -> core_schema.CoreSchema:
assert source is MonetaryAmount
return core_schema.no_info_after_validator_function(
cls._validate,
core_schema.float_schema(multiple_of=0.01),
serialization=core_schema.plain_serializer_function_ser_schema(
cls._serialize,
info_arg=False,
return_schema=core_schema.float_schema(multiple_of=0.01),
),
)
@staticmethod
def _validate(value: str) -> 'CompressedString':
inverse_dictionary: dict[str, int] = {}
text: list[int] = []
for word in value.split(' '):
if word not in inverse_dictionary:
inverse_dictionary[word] = len(inverse_dictionary)
text.append(inverse_dictionary[word])
return MonetaryAmount(
{v: k for k, v in inverse_dictionary.items()}, text
)
@staticmethod
def _serialize(value: 'CompressedString') -> str:
return value.amount