From 5ffd37c85970364bda3a771a7df259fe09b3d890 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BE=9D=E7=91=AA=E8=B2=93?= Date: Wed, 26 Jul 2023 20:49:06 +0800 Subject: [PATCH] Revised to capitalize the account titles when initializing the base accounts instead of when displaying the account titles, so that the titles of the user-added accounts are not capitalized incorrectly. --- src/accounting/base_account/commands.py | 3 +- src/accounting/models.py | 4 +- .../report/reports/balance_sheet.py | 6 +- .../report/reports/income_expenses.py | 4 +- .../report/reports/income_statement.py | 20 +++---- src/accounting/report/reports/journal.py | 2 +- .../report/reports/trial_balance.py | 2 +- .../report/reports/unapplied_accounts.py | 3 +- .../report/reports/unmatched_accounts.py | 3 +- .../templates/accounting/account/detail.html | 2 +- .../accounting/base-account/detail.html | 2 +- .../include/detail-line-items.html | 2 +- .../original-line-item-selector-modal.html | 2 +- .../report/include/balance-sheet-section.html | 6 +- .../include/income-expenses-row-desktop.html | 2 +- .../include/income-expenses-row-mobile.html | 2 +- .../report/include/toolbar-buttons.html | 2 +- .../accounting/report/income-expenses.html | 2 +- .../accounting/report/income-statement.html | 8 +-- .../templates/accounting/report/journal.html | 4 +- .../templates/accounting/report/ledger.html | 2 +- .../templates/accounting/report/search.html | 4 +- .../accounting/report/trial-balance.html | 2 +- .../accounting/report/unapplied-accounts.html | 8 +-- .../accounting/report/unapplied.html | 2 +- .../accounting/report/unmatched-accounts.html | 8 +-- .../accounting/report/unmatched.html | 2 +- src/accounting/utils/title_case.py | 59 +++++++++++++++++++ tests/test_commands.py | 22 ++++++- 29 files changed, 134 insertions(+), 56 deletions(-) create mode 100644 src/accounting/utils/title_case.py diff --git a/src/accounting/base_account/commands.py b/src/accounting/base_account/commands.py index cc06581..28939f7 100644 --- a/src/accounting/base_account/commands.py +++ b/src/accounting/base_account/commands.py @@ -24,6 +24,7 @@ import sqlalchemy as sa from accounting import data_dir from accounting import db from accounting.models import BaseAccount, BaseAccountL10n +from accounting.utils.title_case import title_case def init_base_accounts_command() -> None: @@ -34,7 +35,7 @@ def init_base_accounts_command() -> None: with open(data_dir / "base_accounts.csv") as fp: data: list[dict[str, str]] = [x for x in csv.DictReader(fp)] account_data: list[dict[str, str]] = [{"code": x["code"], - "title_l10n": x["title"]} + "title_l10n": title_case(x["title"])} for x in data] locales: list[str] = [x[5:] for x in data[0] if x.startswith("l10n-")] l10n_data: list[dict[str, str]] = [{"account_code": x["code"], diff --git a/src/accounting/models.py b/src/accounting/models.py index e949fd9..df84366 100644 --- a/src/accounting/models.py +++ b/src/accounting/models.py @@ -54,7 +54,7 @@ class BaseAccount(db.Model): :return: The string representation of the base account. """ - return f"{self.code} {self.title.title()}" + return f"{self.code} {self.title}" @property def title(self) -> str: @@ -151,7 +151,7 @@ class Account(db.Model): :return: The string representation of this account. """ - return f"{self.base_code}-{self.no:03d} {self.title.title()}" + return f"{self.base_code}-{self.no:03d} {self.title}" @property def code(self) -> str: diff --git a/src/accounting/report/reports/balance_sheet.py b/src/accounting/report/reports/balance_sheet.py index 9fc2321..65969b7 100644 --- a/src/accounting/report/reports/balance_sheet.py +++ b/src/accounting/report/reports/balance_sheet.py @@ -454,11 +454,11 @@ class BalanceSheet(BaseReport): :return: The CSV rows for the section. """ rows: list[CSVHalfRow] \ - = [CSVHalfRow(section.title.title.title(), None)] + = [CSVHalfRow(section.title.title, None)] for subsection in section.subsections: - rows.append(CSVHalfRow(f" {subsection.title.title.title()}", None)) + rows.append(CSVHalfRow(f" {subsection.title.title}", None)) for account in subsection.accounts: - rows.append(CSVHalfRow(f" {str(account.account).title()}", + rows.append(CSVHalfRow(f" {str(account.account)}", account.amount)) return rows diff --git a/src/accounting/report/reports/income_expenses.py b/src/accounting/report/reports/income_expenses.py index 9ed35b5..ae5b355 100644 --- a/src/accounting/report/reports/income_expenses.py +++ b/src/accounting/report/reports/income_expenses.py @@ -407,13 +407,13 @@ class IncomeExpenses(BaseReport): gettext("Note"))] if self.__brought_forward is not None: rows.append(CSVRow(self.__brought_forward.date, - str(self.__brought_forward.account).title(), + str(self.__brought_forward.account), self.__brought_forward.description, self.__brought_forward.income, self.__brought_forward.expense, self.__brought_forward.balance, None)) - rows.extend([CSVRow(x.date, str(x.account).title(), x.description, + rows.extend([CSVRow(x.date, str(x.account), x.description, x.income, x.expense, x.balance, x.note) for x in self.__line_items]) if self.__total is not None: diff --git a/src/accounting/report/reports/income_statement.py b/src/accounting/report/reports/income_statement.py index 72b451c..c45349a 100644 --- a/src/accounting/report/reports/income_statement.py +++ b/src/accounting/report/reports/income_statement.py @@ -226,12 +226,12 @@ class IncomeStatement(BaseReport): for x in balances})).all() total_titles: dict[str, str] \ - = {"4": gettext("total operating revenue"), - "5": gettext("gross income"), - "6": gettext("operating income"), - "7": gettext("before tax income"), - "8": gettext("after tax income"), - "9": gettext("net income or loss for current period")} + = {"4": gettext("Total Operating Revenue"), + "5": gettext("Gross Income"), + "6": gettext("Operating Income"), + "7": gettext("Before Tax Income"), + "8": gettext("After Tax Income"), + "9": gettext("Net Income or Loss for Current Period")} sections: dict[str, Section] \ = {x.code: Section(x, total_titles[x.code]) for x in titles} @@ -301,14 +301,14 @@ class IncomeStatement(BaseReport): total_str: str = gettext("Total") rows: list[CSVRow] = [CSVRow(None, gettext("Amount"))] for section in self.__sections: - rows.append(CSVRow(str(section.title).title(), None)) + rows.append(CSVRow(str(section.title), None)) for subsection in section.subsections: - rows.append(CSVRow(f" {str(subsection.title).title()}", None)) + rows.append(CSVRow(f" {str(subsection.title)}", None)) for account in subsection.accounts: - rows.append(CSVRow(f" {str(account.account).title()}", + rows.append(CSVRow(f" {str(account.account)}", account.amount)) rows.append(CSVRow(f" {total_str}", subsection.total)) - rows.append(CSVRow(section.accumulated.title.title(), + rows.append(CSVRow(section.accumulated.title, section.accumulated.amount)) rows.append(CSVRow(None, None)) rows = rows[:-1] diff --git a/src/accounting/report/reports/journal.py b/src/accounting/report/reports/journal.py index e86d44b..67bdeb3 100644 --- a/src/accounting/report/reports/journal.py +++ b/src/accounting/report/reports/journal.py @@ -160,7 +160,7 @@ def get_csv_rows(line_items: list[JournalEntryLineItem]) -> list[CSVRow]: gettext("Debit"), gettext("Credit"), gettext("Note"))] rows.extend([CSVRow(x.journal_entry.date, x.currency.code, - str(x.account).title(), x.description, + str(x.account), x.description, x.debit, x.credit, x.journal_entry.note) for x in line_items]) return rows diff --git a/src/accounting/report/reports/trial_balance.py b/src/accounting/report/reports/trial_balance.py index 2a6cce7..50be407 100644 --- a/src/accounting/report/reports/trial_balance.py +++ b/src/accounting/report/reports/trial_balance.py @@ -224,7 +224,7 @@ class TrialBalance(BaseReport): """ rows: list[CSVRow] = [CSVRow(gettext("Account"), gettext("Debit"), gettext("Credit"))] - rows.extend([CSVRow(str(x.account).title(), x.debit, x.credit) + rows.extend([CSVRow(str(x.account), x.debit, x.credit) for x in self.__accounts]) rows.append(CSVRow(gettext("Total"), self.__total.debit, self.__total.credit)) diff --git a/src/accounting/report/reports/unapplied_accounts.py b/src/accounting/report/reports/unapplied_accounts.py index 1b3f3d2..99a22c4 100644 --- a/src/accounting/report/reports/unapplied_accounts.py +++ b/src/accounting/report/reports/unapplied_accounts.py @@ -120,8 +120,7 @@ def get_csv_rows(accounts: list[Account]) -> list[CSVRow]: :return: The CSV rows. """ rows: list[CSVRow] = [CSVRow(gettext("Account"), gettext("Count"))] - rows.extend([CSVRow(str(x).title(), x.count) - for x in accounts]) + rows.extend([CSVRow(str(x), x.count) for x in accounts]) return rows diff --git a/src/accounting/report/reports/unmatched_accounts.py b/src/accounting/report/reports/unmatched_accounts.py index ac83335..4a3d6cb 100644 --- a/src/accounting/report/reports/unmatched_accounts.py +++ b/src/accounting/report/reports/unmatched_accounts.py @@ -120,8 +120,7 @@ def get_csv_rows(accounts: list[Account]) -> list[CSVRow]: :return: The CSV rows. """ rows: list[CSVRow] = [CSVRow(gettext("Account"), gettext("Count"))] - rows.extend([CSVRow(str(x).title(), x.count) - for x in accounts]) + rows.extend([CSVRow(str(x), x.count) for x in accounts]) return rows diff --git a/src/accounting/templates/accounting/account/detail.html b/src/accounting/templates/accounting/account/detail.html index 702855c..4ac1a88 100644 --- a/src/accounting/templates/accounting/account/detail.html +++ b/src/accounting/templates/accounting/account/detail.html @@ -90,7 +90,7 @@ First written: 2023/1/31 {% endif %}
-
{{ obj.title|title }}
+
{{ obj.title }}
{{ obj.code }}
{% if obj.is_need_offset %}
diff --git a/src/accounting/templates/accounting/base-account/detail.html b/src/accounting/templates/accounting/base-account/detail.html index c9a1be1..408bda1 100644 --- a/src/accounting/templates/accounting/base-account/detail.html +++ b/src/accounting/templates/accounting/base-account/detail.html @@ -33,7 +33,7 @@ First written: 2023/2/1
-
{{ obj.title|title }}
+
{{ obj.title }}
{{ obj.code }}
{% if obj.accounts %}
diff --git a/src/accounting/templates/accounting/journal-entry/include/detail-line-items.html b/src/accounting/templates/accounting/journal-entry/include/detail-line-items.html index 6b2746c..bd632bc 100644 --- a/src/accounting/templates/accounting/journal-entry/include/detail-line-items.html +++ b/src/accounting/templates/accounting/journal-entry/include/detail-line-items.html @@ -26,7 +26,7 @@ First written: 2023/3/14
{{ line_item.account.code }} - {{ line_item.account.title|title }} + {{ line_item.account.title }}
{% if line_item.description is not none %}
{{ line_item.description }}
diff --git a/src/accounting/templates/accounting/journal-entry/include/original-line-item-selector-modal.html b/src/accounting/templates/accounting/journal-entry/include/original-line-item-selector-modal.html index 30219d2..c931964 100644 --- a/src/accounting/templates/accounting/journal-entry/include/original-line-item-selector-modal.html +++ b/src/accounting/templates/accounting/journal-entry/include/original-line-item-selector-modal.html @@ -42,7 +42,7 @@ First written: 2023/2/25
{{ line_item.journal_entry.date|accounting_format_date }} {{ line_item.account.code }} - {{ line_item.account.title|title }} + {{ line_item.account.title }}
{{ line_item.description|accounting_default }}
diff --git a/src/accounting/templates/accounting/report/include/balance-sheet-section.html b/src/accounting/templates/accounting/report/include/balance-sheet-section.html index 3ae0dc1..a013aeb 100644 --- a/src/accounting/templates/accounting/report/include/balance-sheet-section.html +++ b/src/accounting/templates/accounting/report/include/balance-sheet-section.html @@ -20,21 +20,21 @@ Author: imacat@mail.imacat.idv.tw (imacat) First written: 2023/3/8 #}
-
{{ section.title.title|title }}
+
{{ section.title.title }}
{% for subsection in section.subsections %}
{{ subsection.title.code }} - {{ subsection.title.title|title }} + {{ subsection.title.title }}
{% for account in subsection.accounts %} diff --git a/src/accounting/templates/accounting/report/include/income-expenses-row-desktop.html b/src/accounting/templates/accounting/report/include/income-expenses-row-desktop.html index 55191ce..870ad2b 100644 --- a/src/accounting/templates/accounting/report/include/income-expenses-row-desktop.html +++ b/src/accounting/templates/accounting/report/include/income-expenses-row-desktop.html @@ -20,7 +20,7 @@ Author: imacat@mail.imacat.idv.tw (imacat) First written: 2023/3/8 #}
{{ line_item.date|accounting_format_date }}
-
{{ line_item.account.title|title }}
+
{{ line_item.account.title }}
{{ line_item.description|accounting_default }}
{{ line_item.income|accounting_format_amount|accounting_default }}
{{ line_item.expense|accounting_format_amount|accounting_default }}
diff --git a/src/accounting/templates/accounting/report/include/income-expenses-row-mobile.html b/src/accounting/templates/accounting/report/include/income-expenses-row-mobile.html index 797d761..eaacaa9 100644 --- a/src/accounting/templates/accounting/report/include/income-expenses-row-mobile.html +++ b/src/accounting/templates/accounting/report/include/income-expenses-row-mobile.html @@ -26,7 +26,7 @@ First written: 2023/3/5 {{ line_item.date|accounting_format_date }} {% endif %} {% if line_item.account %} - {{ line_item.account.title|title }} + {{ line_item.account.title }} {% endif %}
{% endif %} diff --git a/src/accounting/templates/accounting/report/include/toolbar-buttons.html b/src/accounting/templates/accounting/report/include/toolbar-buttons.html index 92f4030..73b1977 100644 --- a/src/accounting/templates/accounting/report/include/toolbar-buttons.html +++ b/src/accounting/templates/accounting/report/include/toolbar-buttons.html @@ -93,7 +93,7 @@ First written: 2023/3/8 {% for account in report.account_options %}
  • - {{ account.title|title }} + {{ account.title }}
  • {% endfor %} diff --git a/src/accounting/templates/accounting/report/income-expenses.html b/src/accounting/templates/accounting/report/income-expenses.html index 8fbc2f7..d768004 100644 --- a/src/accounting/templates/accounting/report/income-expenses.html +++ b/src/accounting/templates/accounting/report/income-expenses.html @@ -26,7 +26,7 @@ First written: 2023/3/5 {% endblock %} -{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Income and Expenses Log of %(account)s %(period)s", account=report.account.title|title, period=report.period.desc|title) }}{% else %}{{ A_("Income and Expenses Log of %(account)s in %(currency)s %(period)s", currency=report.currency.name|title, account=report.account.title|title, period=report.period.desc|title) }}{% endif %}{% endblock %}{% endblock %} +{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Income and Expenses Log of %(account)s %(period)s", account=report.account.title, period=report.period.desc|title) }}{% else %}{{ A_("Income and Expenses Log of %(account)s in %(currency)s %(period)s", currency=report.currency.name|title, account=report.account.title, period=report.period.desc|title) }}{% endif %}{% endblock %}{% endblock %} {% block content %} diff --git a/src/accounting/templates/accounting/report/income-statement.html b/src/accounting/templates/accounting/report/income-statement.html index bca11d6..7a891b2 100644 --- a/src/accounting/templates/accounting/report/income-statement.html +++ b/src/accounting/templates/accounting/report/income-statement.html @@ -66,21 +66,21 @@ First written: 2023/3/7
    {{ section.title.code }} - {{ section.title.title|title }} + {{ section.title.title }}
    {% for subsection in section.subsections %}
    {{ subsection.title.code }} - {{ subsection.title.title|title }} + {{ subsection.title.title }}
    {% for account in subsection.accounts %} @@ -91,7 +91,7 @@ First written: 2023/3/7
    {% endfor %}
    -
    {{ section.accumulated.title|title }}
    +
    {{ section.accumulated.title }}
    {{ section.accumulated.amount|accounting_report_format_amount }}
    {% endfor %} diff --git a/src/accounting/templates/accounting/report/journal.html b/src/accounting/templates/accounting/report/journal.html index 441981a..4e61108 100644 --- a/src/accounting/templates/accounting/report/journal.html +++ b/src/accounting/templates/accounting/report/journal.html @@ -65,7 +65,7 @@ First written: 2023/3/4
    {{ line_item.currency.name }}
    {{ line_item.account.code }} - {{ line_item.account.title|title }} + {{ line_item.account.title }}
    {{ line_item.description|accounting_default }}
    {{ line_item.debit|accounting_format_amount|accounting_default }}
    @@ -82,7 +82,7 @@ First written: 2023/3/4
    {{ line_item.journal_entry.date|accounting_format_date }} - {{ line_item.account.title|title }} + {{ line_item.account.title }} {% if line_item.currency.code != accounting_default_currency_code() %} {{ line_item.currency.code }} {% endif %} diff --git a/src/accounting/templates/accounting/report/ledger.html b/src/accounting/templates/accounting/report/ledger.html index 4935fe5..2b033ac 100644 --- a/src/accounting/templates/accounting/report/ledger.html +++ b/src/accounting/templates/accounting/report/ledger.html @@ -26,7 +26,7 @@ First written: 2023/3/5 {% endblock %} -{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Ledger of %(account)s %(period)s", account=report.account.title|title, period=report.period.desc|title) }}{% else %}{{ A_("Ledger of %(account)s in %(currency)s %(period)s", currency=report.currency.name|title, account=report.account.title|title, period=report.period.desc|title) }}{% endif %}{% endblock %}{% endblock %} +{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Ledger of %(account)s %(period)s", account=report.account.title, period=report.period.desc|title) }}{% else %}{{ A_("Ledger of %(account)s in %(currency)s %(period)s", currency=report.currency.name|title, account=report.account.title, period=report.period.desc|title) }}{% endif %}{% endblock %}{% endblock %} {% block content %} diff --git a/src/accounting/templates/accounting/report/search.html b/src/accounting/templates/accounting/report/search.html index 5c0edb8..aedd3cb 100644 --- a/src/accounting/templates/accounting/report/search.html +++ b/src/accounting/templates/accounting/report/search.html @@ -62,7 +62,7 @@ First written: 2023/3/8
    {{ line_item.currency.name }}
    {{ line_item.account.code }} - {{ line_item.account.title|title }} + {{ line_item.account.title }}
    {{ line_item.description|accounting_default }}
    {{ line_item.debit|accounting_format_amount|accounting_default }}
    @@ -79,7 +79,7 @@ First written: 2023/3/8
    {{ line_item.journal_entry.date|accounting_format_date }} - {{ line_item.account.title|title }} + {{ line_item.account.title }} {% if line_item.currency.code != accounting_default_currency_code() %} {{ line_item.currency.code }} {% endif %} diff --git a/src/accounting/templates/accounting/report/trial-balance.html b/src/accounting/templates/accounting/report/trial-balance.html index b83930a..6e441fe 100644 --- a/src/accounting/templates/accounting/report/trial-balance.html +++ b/src/accounting/templates/accounting/report/trial-balance.html @@ -68,7 +68,7 @@ First written: 2023/3/5
    {{ account.account.code }} - {{ account.account.title|title }} + {{ account.account.title }}
    {{ account.debit|accounting_format_amount|accounting_default }}
    {{ account.credit|accounting_format_amount|accounting_default }}
    diff --git a/src/accounting/templates/accounting/report/unapplied-accounts.html b/src/accounting/templates/accounting/report/unapplied-accounts.html index 709f6ad..28fca06 100644 --- a/src/accounting/templates/accounting/report/unapplied-accounts.html +++ b/src/accounting/templates/accounting/report/unapplied-accounts.html @@ -26,7 +26,7 @@ First written: 2023/4/8 {% endblock %} -{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Accounts with Unapplied Items") }}{% else %}{{ A_("Accounts with Unapplied Items in %(currency)s", currency=report.currency.name|title) }}{% endif %}{% endblock %}{% endblock %} +{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Accounts With Unapplied Items") }}{% else %}{{ A_("Accounts With Unapplied Items in %(currency)s", currency=report.currency.name|title) }}{% endif %}{% endblock %}{% endblock %} {% block content %} @@ -46,9 +46,9 @@ First written: 2023/4/8

    {% if report.currency.code == accounting_default_currency_code() %} - {{ A_("Accounts with Unapplied Items") }} + {{ A_("Accounts With Unapplied Items") }} {% else %} - {{ A_("Accounts with Unapplied Items in %(currency)s", currency=report.currency.name|title) }} + {{ A_("Accounts With Unapplied Items in %(currency)s", currency=report.currency.name|title) }} {% endif %}

    @@ -64,7 +64,7 @@ First written: 2023/4/8
    {{ account.code }} - {{ account.title|title }} + {{ account.title }}
    {{ account.count }}
    diff --git a/src/accounting/templates/accounting/report/unapplied.html b/src/accounting/templates/accounting/report/unapplied.html index 0a3be46..969816e 100644 --- a/src/accounting/templates/accounting/report/unapplied.html +++ b/src/accounting/templates/accounting/report/unapplied.html @@ -26,7 +26,7 @@ First written: 2023/4/7 {% endblock %} -{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Unapplied Items of %(account)s", account=report.account.title|title) }}{% else %}{{ A_("Unapplied Items of %(account)s in %(currency)s", currency=report.currency.name|title, account=report.account.title|title) }}{% endif %}{% endblock %}{% endblock %} +{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Unapplied Items of %(account)s", account=report.account.title) }}{% else %}{{ A_("Unapplied Items of %(account)s in %(currency)s", currency=report.currency.name|title, account=report.account.title) }}{% endif %}{% endblock %}{% endblock %} {% block content %} diff --git a/src/accounting/templates/accounting/report/unmatched-accounts.html b/src/accounting/templates/accounting/report/unmatched-accounts.html index fa357be..db84aca 100644 --- a/src/accounting/templates/accounting/report/unmatched-accounts.html +++ b/src/accounting/templates/accounting/report/unmatched-accounts.html @@ -26,7 +26,7 @@ First written: 2023/4/17 {% endblock %} -{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Accounts with Unmatched Offsets") }}{% else %}{{ A_("Accounts with Unmatched Offsets in %(currency)s", currency=report.currency.name|title) }}{% endif %}{% endblock %}{% endblock %} +{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Accounts With Unmatched Offsets") }}{% else %}{{ A_("Accounts With Unmatched Offsets in %(currency)s", currency=report.currency.name|title) }}{% endif %}{% endblock %}{% endblock %} {% block content %} @@ -46,9 +46,9 @@ First written: 2023/4/17

    {% if report.currency.code == accounting_default_currency_code() %} - {{ A_("Accounts with Unmatched Offsets") }} + {{ A_("Accounts With Unmatched Offsets") }} {% else %} - {{ A_("Accounts with Unmatched Offsets in %(currency)s", currency=report.currency.name|title) }} + {{ A_("Accounts With Unmatched Offsets in %(currency)s", currency=report.currency.name|title) }} {% endif %}

    @@ -64,7 +64,7 @@ First written: 2023/4/17
    {{ account.code }} - {{ account.title|title }} + {{ account.title }}
    {{ account.count }}
    diff --git a/src/accounting/templates/accounting/report/unmatched.html b/src/accounting/templates/accounting/report/unmatched.html index 74339b0..df26fc4 100644 --- a/src/accounting/templates/accounting/report/unmatched.html +++ b/src/accounting/templates/accounting/report/unmatched.html @@ -26,7 +26,7 @@ First written: 2023/4/17 {% endblock %} -{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Unmatched Offsets of %(account)s", account=report.account.title|title) }}{% else %}{{ A_("Unmatched Offsets of %(account)s in %(currency)s", currency=report.currency.name|title, account=report.account.title|title) }}{% endif %}{% endblock %}{% endblock %} +{% block header %}{% block title %}{% if report.currency.code == accounting_default_currency_code() %}{{ A_("Unmatched Offsets of %(account)s", account=report.account.title) }}{% else %}{{ A_("Unmatched Offsets of %(account)s in %(currency)s", currency=report.currency.name|title, account=report.account.title) }}{% endif %}{% endblock %}{% endblock %} {% block content %} diff --git a/src/accounting/utils/title_case.py b/src/accounting/utils/title_case.py new file mode 100644 index 0000000..920f2e3 --- /dev/null +++ b/src/accounting/utils/title_case.py @@ -0,0 +1,59 @@ +# The Mia! Accounting Project. +# Author: imacat@mail.imacat.idv.tw (imacat), 2023/7/29 + +# Copyright (c) 2023 imacat. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +"""The title case capitalization for the base account titles. +This follows the APA style title case capitalization. See +https://apastyle.apa.org/style-grammar-guidelines/capitalization/title-case . + +This module should not import any other module from the application. + +""" +import re + +CONJUNCTIONS: set[str] = {"and", "as", "but", "for", "if", "nor", "or", "so", + "yet"} +"""Short conjunctions.""" +ARTICLES: set[str] = {"a", "an", "the"} +"""Articles.""" +PREPOSITIONS: set[str] = {"as", "at", "by", "for", "in", "of", "on", "per", + "to", "up", "via"} +"""Short prepositions.""" +MINOR_WORDS: set[str] \ + = CONJUNCTIONS.copy().union(ARTICLES).union(PREPOSITIONS) +"""Minor words that should be in lowercase.""" +# Excludes "by" as in "1223 by-products" +MINOR_WORDS.remove("by") + + +def title_case(s: str) -> str: + """Capitalize a title string for the base account titles. Do not use it + in other places. This excludes "by" as in "1223 by-products". + + :param s: The title string. + :return: The capitalized title string. + """ + return re.sub(r"\w+", __cap_word, s) + + +def __cap_word(m: re.Match) -> str: + """Capitalize a matched title word. + + :param m: The matched title word. + :return: The capitalized title word. + """ + if m.group(0).lower() in MINOR_WORDS: + return m.group(0) + return m.group(0).title() diff --git a/tests/test_commands.py b/tests/test_commands.py index d988081..dc38f81 100644 --- a/tests/test_commands.py +++ b/tests/test_commands.py @@ -18,6 +18,7 @@ """ import csv +import re import unittest from typing import Any @@ -95,7 +96,9 @@ class ConsoleCommandTestCase(unittest.TestCase): self.assertEqual(len(accounts), len(data)) for account in accounts: self.assertIn(account.code, data) - self.assertEqual(account.title_l10n, data[account.code]["title"]) + self.assertEqual(account.title_l10n.lower(), + data[account.code]["title"].lower()) + self.__test_title_case(account.title_l10n) l10n: dict[str, str] = {x.locale: x.title for x in account.l10n} self.assertEqual(len(l10n), len(data[account.code]["l10n"])) for locale in l10n: @@ -103,6 +106,23 @@ class ConsoleCommandTestCase(unittest.TestCase): self.assertEqual(l10n[locale], data[account.code]["l10n"][locale]) + def __test_title_case(self, s: str) -> None: + """Tests the case of a base account title. + + :param s: The base account title. + :return: None. + """ + from accounting.utils.title_case import MINOR_WORDS + + self.assertTrue(s[0].isupper(), s) + for word in re.findall(r"\w+", s): + if len(word) >= 4: + self.assertTrue(word.istitle(), s) + elif word in MINOR_WORDS: + self.assertTrue(word.islower(), s) + else: + self.assertTrue(word.istitle(), s) + def __test_account_data(self) -> None: """Tests the account data.