Changing Account/category structure and Adding transactions and splits

This commit is contained in:
2025-01-25 01:56:41 +01:00
parent 38c5a69130
commit cda36315c3
20 changed files with 424 additions and 160 deletions

View File

76
api/app/payee/models.py Normal file
View File

@@ -0,0 +1,76 @@
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"]

49
api/app/payee/routes.py Normal file
View File

@@ -0,0 +1,49 @@
from uuid import UUID
from fastapi import APIRouter, HTTPException, Depends
from fastapi_filter import FilterDepends
from fastapi_pagination import Page
from fastapi_pagination.ext.sqlmodel import paginate
from payee.models import Payee, PayeeCreate, PayeeRead, PayeeUpdate, PayeeFilters
from db import SessionDep
from user.manager import get_current_user
router = APIRouter()
@router.post("")
def create_payee(payee: PayeeCreate, session: SessionDep, current_user=Depends(get_current_user)) -> PayeeRead:
result = Payee.create(payee, session)
return Payee.get(session, result.id)
@router.get("")
def read_categories(session: SessionDep,
filters: PayeeFilters = FilterDepends(PayeeFilters),
current_user=Depends(get_current_user)) -> Page[PayeeRead]:
return paginate(session, Payee.list(filters))
@router.get("/{payee_id}")
def read_payee(payee_id: UUID, session: SessionDep, current_user=Depends(get_current_user)) -> PayeeRead:
payee = Payee.get(session, payee_id)
if not payee:
raise HTTPException(status_code=404, detail="Payee not found")
return payee
@router.put("/{payee_id}")
def update_payee(payee_id: UUID, payee: PayeeUpdate, session: SessionDep, current_user=Depends(get_current_user)) -> PayeeRead:
db_payee = Payee.get(session, payee_id)
if not db_payee:
raise HTTPException(status_code=404, detail="Payee not found")
payee_data = payee.model_dump(exclude_unset=True)
payee = Payee.update(session, db_payee, payee_data)
return payee
@router.delete("/{payee_id}")
def delete_payee(payee_id: UUID, session: SessionDep, current_user=Depends(get_current_user)):
payee = Payee.get(session, payee_id)
if not payee:
raise HTTPException(status_code=404, detail="Payee not found")
Payee.delete(session, payee)
return {"ok": True}