Repository URL to install this package:
Version:
0.2.0a6 ▾
|
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',
)