Source code for caps.models.nested

from typing import Any
from django.db import models

from caps.utils import nested


__all__ = ("NestedModelBase",)


[docs] class NestedModelBase(nested.NestedBase, models.base.ModelBase): """ This metaclass allows to create nested model class based from parent one. See :py:class:`~caps.utils.nested.NestedBase` for more information about usage. """
[docs] @classmethod def create_nested_class(cls, new_class: type[object], name: str, attrs: dict[str, Any] = {}) -> type: """ Create the nested class for the provided container one to-be-created. It ensures the ``Meta`` class to have default values based on the new class (for app_label, abstract, etc.). """ return super(NestedModelBase, cls).create_nested_class( new_class, name, { "Meta": cls.set_meta( attrs, defaults={ "__module__": new_class.__module__, "app_label": new_class._meta.app_label, "abstract": new_class._meta.abstract, "proxy": new_class._meta.proxy, }, ), **attrs, }, )
[docs] @classmethod def set_meta(cls, attrs: dict[str, Any], set: dict[str, Any] = {}, defaults: dict[str, Any] = {}) -> type: """Get or create new meta class assigning to it the provided attributes. :param attrs: attribute to look into. :param set: attributes to set to the class. :param defaults: attributes to set to the class if not present. :return the Meta class. """ meta = attrs.get("Meta") or type("Meta", tuple(), {}) for k, v in set.items(): setattr(meta, k, v) for k, v in defaults.items(): not hasattr(meta, k) and setattr(meta, k, v) return meta