Changed the PeriodChooser utility from abstract to real, and replaced the various trivial subclasses with the get_url callable as the parameter.
This commit is contained in:
parent
9635448f18
commit
1fd50e23d9
@ -31,7 +31,7 @@ from .utils.base_page_params import BasePageParams
|
||||
from .utils.base_report import BaseReport
|
||||
from .utils.csv_export import BaseCSVRow, csv_download, period_spec
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.period_choosers import BalanceSheetPeriodChooser
|
||||
from .utils.period_choosers import PeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
from .utils.urls import ledger_url, balance_sheet_url, income_statement_url
|
||||
@ -317,8 +317,8 @@ class PageParams(BasePageParams):
|
||||
"""The liabilities."""
|
||||
self.owner_s_equity: Section = owner_s_equity
|
||||
"""The owner's equity."""
|
||||
self.period_chooser: BalanceSheetPeriodChooser \
|
||||
= BalanceSheetPeriodChooser(currency)
|
||||
self.period_chooser: PeriodChooser = PeriodChooser(
|
||||
lambda x: balance_sheet_url(currency, x))
|
||||
"""The period chooser."""
|
||||
|
||||
@property
|
||||
|
@ -34,7 +34,7 @@ from .utils.base_page_params import BasePageParams
|
||||
from .utils.base_report import BaseReport
|
||||
from .utils.csv_export import BaseCSVRow, csv_download, period_spec
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.period_choosers import IncomeExpensesPeriodChooser
|
||||
from .utils.period_choosers import PeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
from .utils.urls import income_expenses_url
|
||||
@ -289,8 +289,8 @@ class PageParams(BasePageParams):
|
||||
"""The report entries."""
|
||||
self.total: ReportEntry | None = total
|
||||
"""The total entry."""
|
||||
self.period_chooser: IncomeExpensesPeriodChooser \
|
||||
= IncomeExpensesPeriodChooser(currency, account)
|
||||
self.period_chooser: PeriodChooser = PeriodChooser(
|
||||
lambda x: income_expenses_url(currency, account, x))
|
||||
"""The period chooser."""
|
||||
|
||||
@property
|
||||
|
@ -31,7 +31,7 @@ from .utils.base_page_params import BasePageParams
|
||||
from .utils.base_report import BaseReport
|
||||
from .utils.csv_export import BaseCSVRow, csv_download, period_spec
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.period_choosers import IncomeStatementPeriodChooser
|
||||
from .utils.period_choosers import PeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
from .utils.urls import ledger_url, income_statement_url
|
||||
@ -160,8 +160,8 @@ class PageParams(BasePageParams):
|
||||
"""True if there is any data, or False otherwise."""
|
||||
self.sections: list[Section] = sections
|
||||
"""The sections in the income statement."""
|
||||
self.period_chooser: IncomeStatementPeriodChooser \
|
||||
= IncomeStatementPeriodChooser(currency)
|
||||
self.period_chooser: PeriodChooser = PeriodChooser(
|
||||
lambda x: income_statement_url(currency, x))
|
||||
"""The period chooser."""
|
||||
|
||||
@property
|
||||
|
@ -31,9 +31,10 @@ from accounting.utils.pagination import Pagination
|
||||
from .utils.base_page_params import BasePageParams
|
||||
from .utils.base_report import BaseReport
|
||||
from .utils.csv_export import BaseCSVRow, csv_download, period_spec
|
||||
from .utils.period_choosers import JournalPeriodChooser
|
||||
from .utils.period_choosers import PeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
from .utils.urls import journal_url
|
||||
|
||||
|
||||
class ReportEntry:
|
||||
@ -122,8 +123,8 @@ class PageParams(BasePageParams):
|
||||
"""The pagination."""
|
||||
self.entries: list[JournalEntry] = entries
|
||||
"""The entries."""
|
||||
self.period_chooser: JournalPeriodChooser \
|
||||
= JournalPeriodChooser()
|
||||
self.period_chooser: PeriodChooser = PeriodChooser(
|
||||
lambda x: journal_url(x))
|
||||
"""The period chooser."""
|
||||
|
||||
@property
|
||||
|
@ -33,7 +33,7 @@ from .utils.base_page_params import BasePageParams
|
||||
from .utils.base_report import BaseReport
|
||||
from .utils.csv_export import BaseCSVRow, csv_download, period_spec
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.period_choosers import LedgerPeriodChooser
|
||||
from .utils.period_choosers import PeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
from .utils.urls import ledger_url
|
||||
@ -264,8 +264,8 @@ class PageParams(BasePageParams):
|
||||
"""The entries."""
|
||||
self.total: ReportEntry | None = total
|
||||
"""The total entry."""
|
||||
self.period_chooser: LedgerPeriodChooser \
|
||||
= LedgerPeriodChooser(currency, account)
|
||||
self.period_chooser: PeriodChooser = PeriodChooser(
|
||||
lambda x: ledger_url(currency, account, x))
|
||||
"""The period chooser."""
|
||||
|
||||
@property
|
||||
|
@ -30,7 +30,7 @@ from .utils.base_page_params import BasePageParams
|
||||
from .utils.base_report import BaseReport
|
||||
from .utils.csv_export import BaseCSVRow, csv_download, period_spec
|
||||
from .utils.option_link import OptionLink
|
||||
from .utils.period_choosers import TrialBalancePeriodChooser
|
||||
from .utils.period_choosers import PeriodChooser
|
||||
from .utils.report_chooser import ReportChooser
|
||||
from .utils.report_type import ReportType
|
||||
from .utils.urls import ledger_url, trial_balance_url
|
||||
@ -121,8 +121,8 @@ class PageParams(BasePageParams):
|
||||
"""The accounts in the trial balance."""
|
||||
self.total: Total = total
|
||||
"""The total of the trial balance."""
|
||||
self.period_chooser: TrialBalancePeriodChooser \
|
||||
= TrialBalancePeriodChooser(currency)
|
||||
self.period_chooser: PeriodChooser = PeriodChooser(
|
||||
lambda x: trial_balance_url(currency, x))
|
||||
"""The period chooser."""
|
||||
|
||||
@property
|
||||
|
@ -20,42 +20,45 @@ This file is largely taken from the NanoParma ERP project, first written in
|
||||
2021/9/16 by imacat (imacat@nanoparma.com).
|
||||
|
||||
"""
|
||||
from abc import ABC, abstractmethod
|
||||
import typing as t
|
||||
from datetime import date
|
||||
|
||||
from accounting.models import Currency, Account, Transaction
|
||||
from accounting.report.income_expense_account import IncomeExpensesAccount
|
||||
from accounting.models import Transaction
|
||||
from accounting.report.period import YearPeriod, Period, ThisMonth, \
|
||||
LastMonth, SinceLastMonth, ThisYear, LastYear, Today, Yesterday, \
|
||||
TemplatePeriod
|
||||
from .urls import journal_url, ledger_url, income_expenses_url, \
|
||||
trial_balance_url, income_statement_url, balance_sheet_url
|
||||
|
||||
|
||||
class PeriodChooser(ABC):
|
||||
class PeriodChooser:
|
||||
"""The period chooser."""
|
||||
|
||||
def __init__(self):
|
||||
"""Constructs a period chooser."""
|
||||
def __init__(self, get_url: t.Callable[[Period], str]):
|
||||
"""Constructs a period chooser.
|
||||
|
||||
:param get_url: The callback to return the URL of the current report in
|
||||
a period.
|
||||
"""
|
||||
self.__get_url: t.Callable[[Period], str] = get_url
|
||||
"""The callback to return the URL of the current report in a period."""
|
||||
|
||||
# Shortcut periods
|
||||
self.this_month_url: str = self._url_for(ThisMonth())
|
||||
self.this_month_url: str = get_url(ThisMonth())
|
||||
"""The URL for this month."""
|
||||
self.last_month_url: str = self._url_for(LastMonth())
|
||||
self.last_month_url: str = get_url(LastMonth())
|
||||
"""The URL for last month."""
|
||||
self.since_last_month_url: str = self._url_for(SinceLastMonth())
|
||||
self.since_last_month_url: str = get_url(SinceLastMonth())
|
||||
"""The URL since last mint."""
|
||||
self.this_year_url: str = self._url_for(ThisYear())
|
||||
self.this_year_url: str = get_url(ThisYear())
|
||||
"""The URL for this year."""
|
||||
self.last_year_url: str = self._url_for(LastYear())
|
||||
self.last_year_url: str = get_url(LastYear())
|
||||
"""The URL for last year."""
|
||||
self.today_url: str = self._url_for(Today())
|
||||
self.today_url: str = get_url(Today())
|
||||
"""The URL for today."""
|
||||
self.yesterday_url: str = self._url_for(Yesterday())
|
||||
self.yesterday_url: str = get_url(Yesterday())
|
||||
"""The URL for yesterday."""
|
||||
self.all_url: str = self._url_for(Period(None, None))
|
||||
self.all_url: str = get_url(Period(None, None))
|
||||
"""The URL for all period."""
|
||||
self.url_template: str = self._url_for(TemplatePeriod())
|
||||
self.url_template: str = get_url(TemplatePeriod())
|
||||
"""The URL template."""
|
||||
|
||||
first: Transaction | None \
|
||||
@ -85,95 +88,10 @@ class PeriodChooser(ABC):
|
||||
self.available_years \
|
||||
= reversed(range(start.year, today.year - 1))
|
||||
|
||||
@abstractmethod
|
||||
def _url_for(self, period: Period) -> str:
|
||||
"""Returns the URL for a period.
|
||||
|
||||
:param period: The period.
|
||||
:return: The URL for the period.
|
||||
"""
|
||||
pass
|
||||
|
||||
def year_url(self, year: int) -> str:
|
||||
"""Returns the period URL of a year.
|
||||
|
||||
:param year: The year
|
||||
:return: The period URL of the year.
|
||||
"""
|
||||
return self._url_for(YearPeriod(year))
|
||||
|
||||
|
||||
class JournalPeriodChooser(PeriodChooser):
|
||||
"""The journal period chooser."""
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
return journal_url(period)
|
||||
|
||||
|
||||
class LedgerPeriodChooser(PeriodChooser):
|
||||
"""The ledger period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency, account: Account):
|
||||
"""Constructs the ledger period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
self.account: Account = account
|
||||
"""The account."""
|
||||
super().__init__()
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
return ledger_url(self.currency, self.account, period)
|
||||
|
||||
|
||||
class IncomeExpensesPeriodChooser(PeriodChooser):
|
||||
"""The income and expenses log period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency, account: IncomeExpensesAccount):
|
||||
"""Constructs the income and expenses log period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
self.account: IncomeExpensesAccount = account
|
||||
"""The account."""
|
||||
super().__init__()
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
return income_expenses_url(self.currency, self.account, period)
|
||||
|
||||
|
||||
class TrialBalancePeriodChooser(PeriodChooser):
|
||||
"""The trial balance period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency):
|
||||
"""Constructs the trial balance period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
super().__init__()
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
return trial_balance_url(self.currency, period)
|
||||
|
||||
|
||||
class IncomeStatementPeriodChooser(PeriodChooser):
|
||||
"""The income statement period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency):
|
||||
"""Constructs the income statement period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
super().__init__()
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
return income_statement_url(self.currency, period)
|
||||
|
||||
|
||||
class BalanceSheetPeriodChooser(PeriodChooser):
|
||||
"""The balance sheet period chooser."""
|
||||
|
||||
def __init__(self, currency: Currency):
|
||||
"""Constructs the balance sheet period chooser."""
|
||||
self.currency: Currency = currency
|
||||
"""The currency."""
|
||||
super().__init__()
|
||||
|
||||
def _url_for(self, period: Period) -> str:
|
||||
return balance_sheet_url(self.currency, period)
|
||||
return self.__get_url(YearPeriod(year))
|
||||
|
Loading…
Reference in New Issue
Block a user