Source code for app.view.forms.base_form
from flask_wtf import FlaskForm
from wtforms.validators import ValidationError
from app.model.lib.util import (
humanize_camelcased_string,
find_duplicates,
)
[docs]
class BaseForm(FlaskForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self._duplicated_attributes = {}
@property
[docs]
def error_messages(self):
return list(_iterate_error_messages(prefixes=[], errors=self.errors))
def _validate_uniqueness(self, attribute, message, value_list):
if duplicated := find_duplicates(value_list):
self._duplicated_attributes[attribute] = list(duplicated)
value_description = ', '.join([repr(d) for d in duplicated])
raise ValidationError(f"{message}: {value_description}")
def _iterate_error_messages(prefixes, errors):
if isinstance(errors, list):
for index, error in enumerate(errors):
if isinstance(error, str):
# Global error on the field collection:
new_prefixes = prefixes
else:
# list or dict of attributes, so nested:
new_prefixes = [*prefixes, str(index + 1)]
yield from _iterate_error_messages(new_prefixes, error)
elif isinstance(errors, dict):
for field_name, error in errors.items():
new_prefixes = [*prefixes, humanize_camelcased_string(field_name)]
yield from _iterate_error_messages(new_prefixes, error)
else:
prefix = ' '.join(prefixes).capitalize()
message = errors
yield f"{prefix}: {message}".strip()