Added the "accounting.utils.cast" module to cast the things to the expected type in order to supress the warnings from PyCharm.
This commit is contained in:
parent
4c84686395
commit
e9d8a8fcd8
@ -27,6 +27,7 @@ from werkzeug.datastructures import ImmutableMultiDict
|
|||||||
from accounting import db
|
from accounting import db
|
||||||
from accounting.locale import lazy_gettext
|
from accounting.locale import lazy_gettext
|
||||||
from accounting.models import Account, BaseAccount
|
from accounting.models import Account, BaseAccount
|
||||||
|
from accounting.utils.cast import s
|
||||||
from accounting.utils.flash_errors import flash_form_errors
|
from accounting.utils.flash_errors import flash_form_errors
|
||||||
from accounting.utils.next_uri import inherit_next, or_next
|
from accounting.utils.next_uri import inherit_next, or_next
|
||||||
from accounting.utils.pagination import Pagination
|
from accounting.utils.pagination import Pagination
|
||||||
@ -86,7 +87,7 @@ def add_account() -> redirect:
|
|||||||
form.populate_obj(account)
|
form.populate_obj(account)
|
||||||
db.session.add(account)
|
db.session.add(account)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The account is added successfully"), "success")
|
flash(s(lazy_gettext("The account is added successfully")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(account)))
|
return redirect(inherit_next(__get_detail_uri(account)))
|
||||||
|
|
||||||
|
|
||||||
@ -138,12 +139,12 @@ def update_account(account: Account) -> redirect:
|
|||||||
with db.session.no_autoflush:
|
with db.session.no_autoflush:
|
||||||
form.populate_obj(account)
|
form.populate_obj(account)
|
||||||
if not account.is_modified:
|
if not account.is_modified:
|
||||||
flash(lazy_gettext("The account was not modified."), "success")
|
flash(s(lazy_gettext("The account was not modified.")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(account)))
|
return redirect(inherit_next(__get_detail_uri(account)))
|
||||||
account.updated_by_id = get_current_user_pk()
|
account.updated_by_id = get_current_user_pk()
|
||||||
account.updated_at = sa.func.now()
|
account.updated_at = sa.func.now()
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The account is updated successfully."), "success")
|
flash(s(lazy_gettext("The account is updated successfully.")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(account)))
|
return redirect(inherit_next(__get_detail_uri(account)))
|
||||||
|
|
||||||
|
|
||||||
@ -159,7 +160,7 @@ def delete_account(account: Account) -> redirect:
|
|||||||
account.delete()
|
account.delete()
|
||||||
sort_accounts_in(account.base_code, account.id)
|
sort_accounts_in(account.base_code, account.id)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The account is deleted successfully."), "success")
|
flash(s(lazy_gettext("The account is deleted successfully.")), "success")
|
||||||
return redirect(or_next(__get_list_uri()))
|
return redirect(or_next(__get_list_uri()))
|
||||||
|
|
||||||
|
|
||||||
@ -186,10 +187,10 @@ def sort_accounts(base: BaseAccount) -> redirect:
|
|||||||
form: AccountReorderForm = AccountReorderForm(base)
|
form: AccountReorderForm = AccountReorderForm(base)
|
||||||
form.save_order()
|
form.save_order()
|
||||||
if not form.is_modified:
|
if not form.is_modified:
|
||||||
flash(lazy_gettext("The order was not modified."), "success")
|
flash(s(lazy_gettext("The order was not modified.")), "success")
|
||||||
return redirect(or_next(__get_list_uri()))
|
return redirect(or_next(__get_list_uri()))
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The order is updated successfully."), "success")
|
flash(s(lazy_gettext("The order is updated successfully.")), "success")
|
||||||
return redirect(or_next(__get_list_uri()))
|
return redirect(or_next(__get_list_uri()))
|
||||||
|
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ from werkzeug.datastructures import ImmutableMultiDict
|
|||||||
from accounting import db
|
from accounting import db
|
||||||
from accounting.locale import lazy_gettext
|
from accounting.locale import lazy_gettext
|
||||||
from accounting.models import Currency
|
from accounting.models import Currency
|
||||||
|
from accounting.utils.cast import s
|
||||||
from accounting.utils.flash_errors import flash_form_errors
|
from accounting.utils.flash_errors import flash_form_errors
|
||||||
from accounting.utils.next_uri import inherit_next, or_next
|
from accounting.utils.next_uri import inherit_next, or_next
|
||||||
from accounting.utils.pagination import Pagination
|
from accounting.utils.pagination import Pagination
|
||||||
@ -88,7 +89,7 @@ def add_currency() -> redirect:
|
|||||||
form.populate_obj(currency)
|
form.populate_obj(currency)
|
||||||
db.session.add(currency)
|
db.session.add(currency)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The currency is added successfully"), "success")
|
flash(s(lazy_gettext("The currency is added successfully")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(currency)))
|
return redirect(inherit_next(__get_detail_uri(currency)))
|
||||||
|
|
||||||
|
|
||||||
@ -141,12 +142,12 @@ def update_currency(currency: Currency) -> redirect:
|
|||||||
with db.session.no_autoflush:
|
with db.session.no_autoflush:
|
||||||
form.populate_obj(currency)
|
form.populate_obj(currency)
|
||||||
if not currency.is_modified:
|
if not currency.is_modified:
|
||||||
flash(lazy_gettext("The currency was not modified."), "success")
|
flash(s(lazy_gettext("The currency was not modified.")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(currency)))
|
return redirect(inherit_next(__get_detail_uri(currency)))
|
||||||
currency.updated_by_id = get_current_user_pk()
|
currency.updated_by_id = get_current_user_pk()
|
||||||
currency.updated_at = sa.func.now()
|
currency.updated_at = sa.func.now()
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The currency is updated successfully."), "success")
|
flash(s(lazy_gettext("The currency is updated successfully.")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(currency)))
|
return redirect(inherit_next(__get_detail_uri(currency)))
|
||||||
|
|
||||||
|
|
||||||
@ -161,7 +162,7 @@ def delete_currency(currency: Currency) -> redirect:
|
|||||||
"""
|
"""
|
||||||
currency.delete()
|
currency.delete()
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The currency is deleted successfully."), "success")
|
flash(s(lazy_gettext("The currency is deleted successfully.")), "success")
|
||||||
return redirect(or_next(url_for("accounting.currency.list")))
|
return redirect(or_next(url_for("accounting.currency.list")))
|
||||||
|
|
||||||
|
|
||||||
|
@ -37,6 +37,7 @@ from accounting.report.utils.option_link import OptionLink
|
|||||||
from accounting.report.utils.report_chooser import ReportChooser
|
from accounting.report.utils.report_chooser import ReportChooser
|
||||||
from accounting.report.utils.report_type import ReportType
|
from accounting.report.utils.report_type import ReportType
|
||||||
from accounting.report.utils.urls import income_expenses_url
|
from accounting.report.utils.urls import income_expenses_url
|
||||||
|
from accounting.utils.cast import be
|
||||||
from accounting.utils.pagination import Pagination
|
from accounting.utils.pagination import Pagination
|
||||||
|
|
||||||
|
|
||||||
@ -120,7 +121,7 @@ class EntryCollector:
|
|||||||
else_=-JournalEntry.amount))
|
else_=-JournalEntry.amount))
|
||||||
select: sa.Select = sa.Select(balance_func)\
|
select: sa.Select = sa.Select(balance_func)\
|
||||||
.join(Transaction).join(Account)\
|
.join(Transaction).join(Account)\
|
||||||
.filter(JournalEntry.currency_code == self.__currency.code,
|
.filter(be(JournalEntry.currency_code == self.__currency.code),
|
||||||
self.__account_condition,
|
self.__account_condition,
|
||||||
Transaction.date < self.__period.start)
|
Transaction.date < self.__period.start)
|
||||||
balance: int | None = db.session.scalar(select)
|
balance: int | None = db.session.scalar(select)
|
||||||
@ -342,7 +343,7 @@ class PageParams(BasePageParams):
|
|||||||
self.account.id == 0)]
|
self.account.id == 0)]
|
||||||
in_use: sa.Select = sa.Select(JournalEntry.account_id)\
|
in_use: sa.Select = sa.Select(JournalEntry.account_id)\
|
||||||
.join(Account)\
|
.join(Account)\
|
||||||
.filter(JournalEntry.currency_code == self.currency.code,
|
.filter(be(JournalEntry.currency_code == self.currency.code),
|
||||||
sa.or_(Account.base_code.startswith("11"),
|
sa.or_(Account.base_code.startswith("11"),
|
||||||
Account.base_code.startswith("12"),
|
Account.base_code.startswith("12"),
|
||||||
Account.base_code.startswith("21"),
|
Account.base_code.startswith("21"),
|
||||||
|
@ -36,6 +36,7 @@ from accounting.report.utils.option_link import OptionLink
|
|||||||
from accounting.report.utils.report_chooser import ReportChooser
|
from accounting.report.utils.report_chooser import ReportChooser
|
||||||
from accounting.report.utils.report_type import ReportType
|
from accounting.report.utils.report_type import ReportType
|
||||||
from accounting.report.utils.urls import ledger_url
|
from accounting.report.utils.urls import ledger_url
|
||||||
|
from accounting.utils.cast import be
|
||||||
from accounting.utils.pagination import Pagination
|
from accounting.utils.pagination import Pagination
|
||||||
|
|
||||||
|
|
||||||
@ -116,8 +117,8 @@ class EntryCollector:
|
|||||||
(JournalEntry.is_debit, JournalEntry.amount),
|
(JournalEntry.is_debit, JournalEntry.amount),
|
||||||
else_=-JournalEntry.amount))
|
else_=-JournalEntry.amount))
|
||||||
select: sa.Select = sa.Select(balance_func).join(Transaction)\
|
select: sa.Select = sa.Select(balance_func).join(Transaction)\
|
||||||
.filter(JournalEntry.currency_code == self.__currency.code,
|
.filter(be(JournalEntry.currency_code == self.__currency.code),
|
||||||
JournalEntry.account_id == self.__account.id,
|
be(JournalEntry.account_id == self.__account.id),
|
||||||
Transaction.date < self.__period.start)
|
Transaction.date < self.__period.start)
|
||||||
balance: int | None = db.session.scalar(select)
|
balance: int | None = db.session.scalar(select)
|
||||||
if balance is None:
|
if balance is None:
|
||||||
@ -303,7 +304,7 @@ class PageParams(BasePageParams):
|
|||||||
:return: The account options.
|
:return: The account options.
|
||||||
"""
|
"""
|
||||||
in_use: sa.Select = sa.Select(JournalEntry.account_id)\
|
in_use: sa.Select = sa.Select(JournalEntry.account_id)\
|
||||||
.filter(JournalEntry.currency_code == self.currency.code)\
|
.filter(be(JournalEntry.currency_code == self.currency.code))\
|
||||||
.group_by(JournalEntry.account_id)
|
.group_by(JournalEntry.account_id)
|
||||||
return [OptionLink(str(x), ledger_url(self.currency, x, self.period),
|
return [OptionLink(str(x), ledger_url(self.currency, x, self.period),
|
||||||
x.id == self.account.id)
|
x.id == self.account.id)
|
||||||
|
@ -32,6 +32,7 @@ from accounting.report.utils.base_report import BaseReport
|
|||||||
from accounting.report.utils.csv_export import csv_download
|
from accounting.report.utils.csv_export import csv_download
|
||||||
from accounting.report.utils.report_chooser import ReportChooser
|
from accounting.report.utils.report_chooser import ReportChooser
|
||||||
from accounting.report.utils.report_type import ReportType
|
from accounting.report.utils.report_type import ReportType
|
||||||
|
from accounting.utils.cast import be
|
||||||
from accounting.utils.pagination import Pagination
|
from accounting.utils.pagination import Pagination
|
||||||
from accounting.utils.query import parse_query_keywords
|
from accounting.utils.query import parse_query_keywords
|
||||||
from .journal import get_csv_rows
|
from .journal import get_csv_rows
|
||||||
@ -124,7 +125,7 @@ class EntryCollector:
|
|||||||
try:
|
try:
|
||||||
txn_date = datetime.strptime(k, "%Y")
|
txn_date = datetime.strptime(k, "%Y")
|
||||||
conditions.append(
|
conditions.append(
|
||||||
sa.extract("year", Transaction.date) == txn_date.year)
|
be(sa.extract("year", Transaction.date) == txn_date.year))
|
||||||
except ValueError:
|
except ValueError:
|
||||||
pass
|
pass
|
||||||
try:
|
try:
|
||||||
|
@ -28,6 +28,7 @@ from werkzeug.datastructures import ImmutableMultiDict
|
|||||||
from accounting import db
|
from accounting import db
|
||||||
from accounting.locale import lazy_gettext
|
from accounting.locale import lazy_gettext
|
||||||
from accounting.models import Transaction
|
from accounting.models import Transaction
|
||||||
|
from accounting.utils.cast import s
|
||||||
from accounting.utils.flash_errors import flash_form_errors
|
from accounting.utils.flash_errors import flash_form_errors
|
||||||
from accounting.utils.next_uri import inherit_next, or_next
|
from accounting.utils.next_uri import inherit_next, or_next
|
||||||
from accounting.utils.permission import has_permission, can_view, can_edit
|
from accounting.utils.permission import has_permission, can_view, can_edit
|
||||||
@ -87,7 +88,7 @@ def add_transaction(txn_type: TransactionType) -> redirect:
|
|||||||
form.populate_obj(txn)
|
form.populate_obj(txn)
|
||||||
db.session.add(txn)
|
db.session.add(txn)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The transaction is added successfully"), "success")
|
flash(s(lazy_gettext("The transaction is added successfully")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(txn)))
|
return redirect(inherit_next(__get_detail_uri(txn)))
|
||||||
|
|
||||||
|
|
||||||
@ -141,12 +142,13 @@ def update_transaction(txn: Transaction) -> redirect:
|
|||||||
with db.session.no_autoflush:
|
with db.session.no_autoflush:
|
||||||
form.populate_obj(txn)
|
form.populate_obj(txn)
|
||||||
if not form.is_modified:
|
if not form.is_modified:
|
||||||
flash(lazy_gettext("The transaction was not modified."), "success")
|
flash(s(lazy_gettext("The transaction was not modified.")), "success")
|
||||||
return redirect(inherit_next(__get_detail_uri(txn)))
|
return redirect(inherit_next(__get_detail_uri(txn)))
|
||||||
txn.updated_by_id = get_current_user_pk()
|
txn.updated_by_id = get_current_user_pk()
|
||||||
txn.updated_at = sa.func.now()
|
txn.updated_at = sa.func.now()
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The transaction is updated successfully."), "success")
|
flash(s(lazy_gettext("The transaction is updated successfully.")),
|
||||||
|
"success")
|
||||||
return redirect(inherit_next(__get_detail_uri(txn)))
|
return redirect(inherit_next(__get_detail_uri(txn)))
|
||||||
|
|
||||||
|
|
||||||
@ -162,7 +164,8 @@ def delete_transaction(txn: Transaction) -> redirect:
|
|||||||
txn.delete()
|
txn.delete()
|
||||||
sort_transactions_in(txn.date, txn.id)
|
sort_transactions_in(txn.date, txn.id)
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The transaction is deleted successfully."), "success")
|
flash(s(lazy_gettext("The transaction is deleted successfully.")),
|
||||||
|
"success")
|
||||||
return redirect(or_next(__get_default_page_uri()))
|
return redirect(or_next(__get_default_page_uri()))
|
||||||
|
|
||||||
|
|
||||||
@ -193,10 +196,10 @@ def sort_transactions(txn_date: date) -> redirect:
|
|||||||
form: TransactionReorderForm = TransactionReorderForm(txn_date)
|
form: TransactionReorderForm = TransactionReorderForm(txn_date)
|
||||||
form.save_order()
|
form.save_order()
|
||||||
if not form.is_modified:
|
if not form.is_modified:
|
||||||
flash(lazy_gettext("The order was not modified."), "success")
|
flash(s(lazy_gettext("The order was not modified.")), "success")
|
||||||
return redirect(or_next(__get_default_page_uri()))
|
return redirect(or_next(__get_default_page_uri()))
|
||||||
db.session.commit()
|
db.session.commit()
|
||||||
flash(lazy_gettext("The order is updated successfully."), "success")
|
flash(s(lazy_gettext("The order is updated successfully.")), "success")
|
||||||
return redirect(or_next(__get_default_page_uri()))
|
return redirect(or_next(__get_default_page_uri()))
|
||||||
|
|
||||||
|
|
||||||
|
43
src/accounting/utils/cast.py
Normal file
43
src/accounting/utils/cast.py
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
# The Mia! Accounting Flask Project.
|
||||||
|
# Author: imacat@mail.imacat.idv.tw (imacat), 2023/3/15
|
||||||
|
|
||||||
|
# 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 utility to cast a SQLAlchemy column into the column type, to avoid
|
||||||
|
warnings from the IDE.
|
||||||
|
|
||||||
|
This module should not import any other module from the application.
|
||||||
|
|
||||||
|
"""
|
||||||
|
import typing as t
|
||||||
|
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
|
||||||
|
def be(expression: t.Any) -> sa.BinaryExpression:
|
||||||
|
"""Casts the SQLAlchemy binary expression to the binary expression type.
|
||||||
|
|
||||||
|
:param expression: The binary expression.
|
||||||
|
:return: The binary expression itself.
|
||||||
|
"""
|
||||||
|
return expression
|
||||||
|
|
||||||
|
|
||||||
|
def s(message: t.Any) -> str:
|
||||||
|
"""Casts the LazyString message to the string type.
|
||||||
|
|
||||||
|
:param message: The message.
|
||||||
|
:return: The binary expression itself.
|
||||||
|
"""
|
||||||
|
return message
|
Loading…
Reference in New Issue
Block a user