diff --git a/src/accounting/account/views.py b/src/accounting/account/views.py index 4054bd9..cf43c50 100644 --- a/src/accounting/account/views.py +++ b/src/accounting/account/views.py @@ -27,6 +27,7 @@ from werkzeug.datastructures import ImmutableMultiDict from accounting import db from accounting.locale import lazy_gettext from accounting.models import Account, BaseAccount +from accounting.utils.flash_errors import flash_form_errors from accounting.utils.next_uri import inherit_next, or_next from accounting.utils.pagination import Pagination from accounting.utils.permission import can_view, has_permission, can_edit @@ -78,9 +79,7 @@ def add_account() -> redirect: """ form = AccountForm(request.form) if not form.validate(): - for key in form.errors: - for error in form.errors[key]: - flash(error, "error") + flash_form_errors(form) session["form"] = urlencode(list(request.form.items())) return redirect(inherit_next(url_for("accounting.account.create"))) account: Account = Account() @@ -133,9 +132,7 @@ def update_account(account: Account) -> redirect: """ form = AccountForm(request.form) if not form.validate(): - for key in form.errors: - for error in form.errors[key]: - flash(error, "error") + flash_form_errors(form) session["form"] = urlencode(list(request.form.items())) return redirect(inherit_next(url_for("accounting.account.edit", account=account))) diff --git a/src/accounting/currency/views.py b/src/accounting/currency/views.py index f1323db..11ae10b 100644 --- a/src/accounting/currency/views.py +++ b/src/accounting/currency/views.py @@ -27,6 +27,7 @@ from werkzeug.datastructures import ImmutableMultiDict from accounting import db from accounting.locale import lazy_gettext from accounting.models import Currency +from accounting.utils.flash_errors import flash_form_errors from accounting.utils.next_uri import inherit_next, or_next from accounting.utils.pagination import Pagination from accounting.utils.permission import has_permission, can_view, can_edit @@ -80,9 +81,7 @@ def add_currency() -> redirect: """ form = CurrencyForm(request.form) if not form.validate(): - for key in form.errors: - for error in form.errors[key]: - flash(error, "error") + flash_form_errors(form) session["form"] = urlencode(list(request.form.items())) return redirect(inherit_next(url_for("accounting.currency.create"))) currency: Currency = Currency() @@ -136,9 +135,7 @@ def update_currency(currency: Currency) -> redirect: form = CurrencyForm(request.form) form.obj_code = currency.code if not form.validate(): - for key in form.errors: - for error in form.errors[key]: - flash(error, "error") + flash_form_errors(form) session["form"] = urlencode(list(request.form.items())) return redirect(inherit_next(url_for("accounting.currency.edit", currency=currency))) diff --git a/src/accounting/utils/flash_errors.py b/src/accounting/utils/flash_errors.py new file mode 100644 index 0000000..c699239 --- /dev/null +++ b/src/accounting/utils/flash_errors.py @@ -0,0 +1,50 @@ +# The Mia! Accounting Flask Project. +# Author: imacat@mail.imacat.idv.tw (imacat), 2023/2/1 + +# 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 flash all errors from the forms. + +This module should not import any other module from the application. + +""" +import typing as t + +from flask import flash +from flask_wtf import FlaskForm + + +def flash_form_errors(form: FlaskForm) -> None: + """Flash all errors from a form recursively. + + :param form: The form. + :return: None. + """ + __flash_errors(form.errors) + + +def __flash_errors(error: t.Any) -> None: + """Flash all errors recursively. + + :param error: The errors. + :return: None. + """ + if isinstance(error, dict): + for key in error: + __flash_errors(error[key]) + elif isinstance(error, list): + for e in error: + __flash_errors(e) + else: + flash(error, "error")