Source code for odin.helpers
"""
Helpers
~~~~~~~
A collection of useful convenience methods.
"""
from typing import DefaultDict, Dict, List, Union
from odin import BaseField
from odin.exceptions import NON_FIELD_ERRORS, ValidationError
__all__ = ("ValidationErrorCollection",)
[docs]
class ValidationErrorCollection:
"""Helper collection for collecting validation error messages and generating or raising an exception.
Usage:
.. code-block:: python
errors = ValidationErrorCollection()
... # Perform validation
errors.add_message("name", "Value is required")
if errors:
raise errors.validation_error()
"""
def __init__(self):
"""Initialise collection."""
self.error_messages = DefaultDict[str, List[str]](list)
def __bool__(self):
return bool(self.messages)
@property
def messages(self) -> Dict[str, List[str]]:
"""Filtered messages that strips out empty messages."""
return {
field_name: messages
for field_name, messages in self.error_messages.items()
if messages
}
[docs]
def add_message(self, field: Union[str, BaseField], *messages):
"""Append validation error message(s)."""
field_name = field if isinstance(field, str) else field.attname
self.error_messages[field_name].extend(messages)
[docs]
def add_resource_message(self, *messages):
"""Append resource level validation error message(s)."""
self.error_messages[NON_FIELD_ERRORS].extend(messages)
[docs]
def raise_if_defined(self):
"""Raise an exception if any are defined."""
if self:
raise self.validation_error()
[docs]
def validation_error(self) -> ValidationError:
"""Generate an exception based on the validation messages added."""
return ValidationError(self.messages)