diff --git a/api/app/account/account_routes.py b/api/app/account/account_routes.py index ab3a998..6a8623d 100644 --- a/api/app/account/account_routes.py +++ b/api/app/account/account_routes.py @@ -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: diff --git a/api/app/account/category_routes.py b/api/app/account/category_routes.py index 2c3c7b7..2c568e6 100644 --- a/api/app/account/category_routes.py +++ b/api/app/account/category_routes.py @@ -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: diff --git a/api/app/account/models.py b/api/app/account/models.py index c89fcf5..fa0b7fe 100644 --- a/api/app/account/models.py +++ b/api/app/account/models.py @@ -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 diff --git a/api/app/payee/routes.py b/api/app/payee/routes.py index 912e02e..e8ede00 100644 --- a/api/app/payee/routes.py +++ b/api/app/payee/routes.py @@ -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)) diff --git a/gui/app/src/pages/accounts/list.tsx b/gui/app/src/pages/accounts/list.tsx index ad74c07..fe7051b 100644 --- a/gui/app/src/pages/accounts/list.tsx +++ b/gui/app/src/pages/accounts/list.tsx @@ -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(); diff --git a/gui/app/src/providers/data-provider.tsx b/gui/app/src/providers/data-provider.tsx index c210512..940ed91 100644 --- a/gui/app/src/providers/data-provider.tsx +++ b/gui/app/src/providers/data-provider.tsx @@ -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) {