Adding sorting to Accounts

This commit is contained in:
2025-02-02 23:40:19 +01:00
parent fb7e46efdb
commit a33f84c5b4
6 changed files with 51 additions and 38 deletions

View File

@@ -1,10 +1,11 @@
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 account.models import Account, AccountCreate, AccountRead, AccountUpdate
from account.models import Account, AccountCreate, AccountRead, AccountUpdate, AccountFilters
from db import SessionDep
from user.manager import get_current_user
@@ -16,16 +17,22 @@ def create_account(account: AccountCreate, session: SessionDep, current_user=Dep
return result
@router.get("")
def read_accounts(session: SessionDep, current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_accounts())
def read_accounts(session: SessionDep,
filters: AccountFilters = FilterDepends(AccountFilters),
current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_accounts(filters))
@router.get("")
def read_assets(session: SessionDep, current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_assets())
@router.get("/assets")
def read_assets(session: SessionDep,
filters: AccountFilters = FilterDepends(AccountFilters),
current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_assets(filters))
@router.get("")
def read_liabilities(session: SessionDep, current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_liabilities())
@router.get("/liabilities")
def read_liabilities(session: SessionDep,
filters: AccountFilters = FilterDepends(AccountFilters),
current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_liabilities(filters))
@router.get("/{account_id}")
def read_account(account_id: UUID, session: SessionDep, current_user=Depends(get_current_user)) -> AccountRead:

View File

@@ -1,10 +1,11 @@
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 account.models import Account, AccountRead, CategoryCreate, CategoryUpdate
from account.models import Account, AccountRead, CategoryCreate, CategoryUpdate, AccountFilters
from db import SessionDep
from user.manager import get_current_user
@@ -16,16 +17,22 @@ def create_category(category: CategoryCreate, session: SessionDep, current_user=
return result
@router.get("")
def read_categories(session: SessionDep, current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_categories())
def read_categories(session: SessionDep,
filters: AccountFilters = FilterDepends(AccountFilters),
current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_categories(filters))
@router.get("expenses")
def read_expenses(session: SessionDep, current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_expenses())
def read_expenses(session: SessionDep,
filters: AccountFilters = FilterDepends(AccountFilters),
current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_expenses(filters))
@router.get("incomes")
def read_incomes(session: SessionDep, current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_incomes())
def read_incomes(session: SessionDep,
filters: AccountFilters = FilterDepends(AccountFilters),
current_user=Depends(get_current_user)) -> Page[AccountRead]:
return paginate(session, Account.list_incomes(filters))
@router.get("/{category_id}")
def read_category(category_id: UUID, session: SessionDep, current_user=Depends(get_current_user)) -> AccountRead:

View File

@@ -105,36 +105,36 @@ class Account(AccountBaseId, table=True):
return account_db
@classmethod
def list(cls):
return select(Account)
def list(cls, filters):
return filters.sort(filters.filter(select(Account)))
@classmethod
def list_accounts(cls):
return cls.list().where(
def list_accounts(cls, filters):
return cls.list(filters).where(
Account.type.not_in([v.value for v in CategoryType])
)
@classmethod
def list_assets(cls):
return cls.list().where(Account.family == "Asset")
def list_assets(cls, filters):
return cls.list(filters).where(Account.family == "Asset")
@classmethod
def list_liabilities(cls):
return cls.list().where(Account.family == "Liability")
def list_liabilities(cls, filters):
return cls.list(filters).where(Account.family == "Liability")
@classmethod
def list_categories(cls):
return cls.list().where(
def list_categories(cls, filters):
return cls.list(filters).where(
Account.type.in_([v.value for v in CategoryType])
)
@classmethod
def list_expenses(cls):
return cls.list().where(Account.family == "Expense")
def list_expenses(cls, filters):
return cls.list(filters).where(Account.family == "Expense")
@classmethod
def list_incomes(cls):
return cls.list().where(Account.family == "Income")
def list_incomes(cls, filters):
return cls.list(filters).where(Account.family == "Income")
@classmethod
def get(cls, session, account_id):
@@ -227,8 +227,9 @@ class CategoryCreate(CategoryWrite):
class CategoryUpdate(CategoryWrite):
pass
class AccountFilter(Filter):
class AccountFilters(Filter):
name__like: Optional[str] = None
order_by: Optional[list[str]] = None
class Constants(Filter.Constants):
model = Account

View File

@@ -17,7 +17,7 @@ def create_payee(payee: PayeeCreate, session: SessionDep, current_user=Depends(g
return Payee.get(session, result.id)
@router.get("")
def read_categories(session: SessionDep,
def read_payees(session: SessionDep,
filters: PayeeFilters = FilterDepends(PayeeFilters),
current_user=Depends(get_current_user)) -> Page[PayeeRead]:
return paginate(session, Payee.list(filters))

View File

@@ -1,12 +1,11 @@
import { useMany } from "@refinedev/core";
import {DeleteButton, EditButton, List, useDataGrid} from "@refinedev/mui";
import React from "react";
import { ButtonGroup } from "@mui/material";
import { DataGrid, type GridColDef } from "@mui/x-data-grid";
import { DeleteButton, EditButton, List, useDataGrid} from "@refinedev/mui";
import type { IAccount } from "../../interfaces";
import {AccountCreate} from "./create";
import {ButtonGroup} from "@mui/material";
export const AccountList: React.FC = () => {
const { dataGridProps } = useDataGrid<IAccount>();

View File

@@ -48,8 +48,7 @@ export const dataProvider: DataProvider = {
}
if (sorters && sorters.length > 0) {
params.append("sort", sorters.map((sorter) => sorter.field).join(","));
params.append("order", sorters.map((sorter) => sorter.order).join(","));
params.append("order_by", sorters.map((sorter) => (sorter.order == "asc" ? "+" : "-") + sorter.field).join(","));
}
if (filters && filters.length > 0) {