from __future__ import annotations from functools import lru_cache from django.db.models.signals import pre_save from django.dispatch import receiver from wagtail.models import Page from wagtail.snippets.models import get_snippet_models from .validators.multilingual import validate_instance_or_raise @lru_cache(maxsize=1) def _snippet_models(): return tuple(get_snippet_models()) def _is_snippet_instance(instance) -> bool: instance_model = instance.__class__ return any(model == instance_model for model in _snippet_models()) @receiver(pre_save) def enforce_multilingual_integrity(sender, instance, **kwargs): if isinstance(instance, Page) or _is_snippet_instance(instance): validate_instance_or_raise(instance)