Why Gemfury? Push, build, and install  RubyGems npm packages Python packages Maven artifacts PHP packages Go Modules Debian packages RPM packages NuGet packages

Repository URL to install this package:

Details    
dj-kaos / models / models.py
Size: Mime:
from typing import Sequence

from django.db import models
from django.db.models.base import ModelBase

from .configs import ModelConfig


class KaosModelMeta:
    config_parents: Sequence[ModelConfig]
    config_mixins: Sequence[ModelConfig]
    _orders: dict

    fields: Sequence[str]  # base -> zenith
    fieldsets: dict[None | str, dict]  # base -> zenith
    search_fields: Sequence[str]  # base -> zenith
    filterset_fields: dict[str, Sequence]  # unordered

    list_display: Sequence[str]  # base -> zenith
    list_filter: Sequence[str]  # zenith -> base
    list_filter_autocomplete: Sequence[str]  # unordered

    readonly_fields: Sequence[str]  # unordered
    edit_readonly_fields: Sequence[str]  # unordered

    actions: Sequence[str]  # zenith -> base
    change_actions: Sequence[str]  # actions

    unrequired_fields: Sequence[str]  # unordered
    attrs_to_track: Sequence[str]  # unordered

    extras: dict


class KaosModelBaseMixin:
    def __new__(cls, name, bases, attrs, **kwargs):
        inferred_parents = [
            base.config
            for base in reversed(bases)
            if isinstance(getattr(base, 'config', None), ModelConfig)
        ]

        model_meta = attrs.get('Meta')
        root_parents = ModelConfig.find_root_parents_from(model_meta, inferred_parents)
        partial_config = ModelConfig.make_partial_config_from(model_meta, name=name)

        new_class = super().__new__(cls, name, bases, attrs, **kwargs)

        if partial_config:
            config = partial_config.make_complete_config(root_parents, name=name)
        else:
            config = ModelConfig.combine(*root_parents, name=name)
        new_class.config = config

        return new_class


class KaosModelBase(KaosModelBaseMixin, ModelBase):
    pass


class KaosModel(
    models.Model,
    metaclass=KaosModelBase
):
    class Meta(KaosModelMeta):
        abstract = True


KaosModel.config = None

__all__ = (
    'KaosModelBaseMixin',
    'KaosModelBase',
    'KaosModelMeta',
    'KaosModel',
)