Source code for flask_unchained.bundles.api.hooks.register_model_serializers_hook

from typing import *

from flask_unchained import AppFactoryHook, FlaskUnchained

from ..model_serializer import ModelSerializer
from ..extensions import api


[docs]class RegisterModelSerializersHook(AppFactoryHook): """ Registers ModelSerializers. """ name = 'model_serializers' """ The name of this hook. """ bundle_module_names = ['serializers'] """ The default module this hook loads from. Override by setting the ``model_serializers_module_names`` attribute on your bundle class. """ bundle_override_module_names_attr = 'model_serializers_module_names' run_after = ['models'] # skipcq: PYL-W0221 (parameters mismatch in overridden method)
[docs] def process_objects(self, app: FlaskUnchained, serializers: Dict[str, Type[ModelSerializer]], ) -> None: """ Registers model serializers onto the API Bundle instance. """ for name, serializer_cls in serializers.items(): self.bundle.serializers[name] = serializer_cls model = serializer_cls.Meta.model model_name = model if isinstance(model, str) else model.__name__ kind = getattr(serializer_cls, '__kind__', 'all') api.register_serializer(serializer_cls) if kind == 'all': self.bundle.serializers_by_model[model_name] = serializer_cls elif kind == 'create': self.bundle.create_by_model[model_name] = serializer_cls elif kind == 'many': self.bundle.many_by_model[model_name] = serializer_cls
[docs] def type_check(self, obj: Any) -> bool: """ Returns True if ``obj`` is a subclass of :class:`~flask_unchained.bundles.api.ModelSerializer`. """ if not isinstance(obj, type): return False return issubclass(obj, ModelSerializer) and obj != ModelSerializer
[docs] def update_shell_context(self, ctx: Dict[str, Any]) -> None: """ Adds model serializers to the CLI shell context. """ ctx.update(self.bundle.serializers)