diff --git a/djangocms_alias/cms_config.py b/djangocms_alias/cms_config.py index ac9b5d35..dbdc8a41 100644 --- a/djangocms_alias/cms_config.py +++ b/djangocms_alias/cms_config.py @@ -7,6 +7,7 @@ from .cms_wizards import create_alias_wizard from .models import AliasContent, AliasPlugin, copy_alias_content from .rendering import add_static_alias_js, render_alias_content +from .utils import get_versionable_item try: apps.get_app_config("djangocms_internalsearch") @@ -14,8 +15,6 @@ except (ImportError, LookupError): AliasContentConfig = None -djangocms_versioning_installed = apps.is_installed("djangocms_versioning") - class AliasCMSConfig(CMSAppConfig): cms_enabled = True @@ -23,31 +22,38 @@ class AliasCMSConfig(CMSAppConfig): moderated_models = [AliasContent] cms_wizards = [create_alias_wizard] - djangocms_moderation_enabled = getattr(settings, "MODERATING_ALIAS_MODELS_ENABLED", True) - djangocms_versioning_enabled = getattr(settings, "VERSIONING_ALIAS_MODELS_ENABLED", djangocms_versioning_installed) + def __init__(self, app_config): + super().__init__(app_config) + VersionableItem = get_versionable_item(self) + self.djangocms_moderation_enabled = getattr(settings, "MODERATING_ALIAS_MODELS_ENABLED", True) + self.djangocms_versioning_enabled = getattr( + settings, "VERSIONING_ALIAS_MODELS_ENABLED", VersionableItem is not None + ) - if djangocms_versioning_enabled: - from cms.utils.i18n import get_language_tuple - from djangocms_versioning import __version__ as djangocms_versioning_version - from djangocms_versioning.datastructures import VersionableItem + if self.djangocms_versioning_enabled: + from cms.utils.i18n import get_language_tuple - if PackageVersion(djangocms_versioning_version) < PackageVersion("2.4"): # pragma: no cover - raise ImportError( - "djangocms_versioning >= 2.4.0 is required for djangocms_alias to work properly." - " Please upgrade djangocms_versioning." - ) + if not VersionableItem: + from djangocms_versioning import __version__ as djangocms_versioning_version + from djangocms_versioning.datastructures import VersionableItem - versioning = [ - VersionableItem( - content_model=AliasContent, - grouper_field_name="alias", - extra_grouping_fields=["language"], - version_list_filter_lookups={"language": get_language_tuple}, - copy_function=copy_alias_content, - grouper_selector_option_label=lambda obj, lang: obj.get_name(lang), - grouper_admin_mixin="__default__", - ), - ] + if PackageVersion(djangocms_versioning_version) < PackageVersion("2.4"): # pragma: no cover + raise ImportError( + "djangocms_versioning >= 2.4.0 is required for djangocms_alias to work properly." + " Please upgrade djangocms_versioning." + ) + + self.versioning = [ + VersionableItem( + content_model=AliasContent, + grouper_field_name="alias", + extra_grouping_fields=["language"], + version_list_filter_lookups={"language": get_language_tuple}, + copy_function=copy_alias_content, + grouper_selector_option_label=lambda obj, lang: obj.get_name(lang), + grouper_admin_mixin="__default__", + ), + ] djangocms_references_enabled = getattr(settings, "REFERENCES_ALIAS_MODELS_ENABLED", True) reference_fields = [ diff --git a/djangocms_alias/filters.py b/djangocms_alias/filters.py index b1f7272f..7a5e41bd 100644 --- a/djangocms_alias/filters.py +++ b/djangocms_alias/filters.py @@ -4,7 +4,6 @@ from django.utils.translation import get_language from django.utils.translation import gettext_lazy as _ -from .cms_config import AliasCMSConfig from .constants import ( CATEGORY_FILTER_PARAM, SITE_FILTER_NO_SITE_VALUE, @@ -12,8 +11,6 @@ ) from .models import Category -djangocms_versioning_enabled = AliasCMSConfig.djangocms_versioning_enabled - class SiteFilter(admin.SimpleListFilter): title = _("Site") diff --git a/djangocms_alias/models.py b/djangocms_alias/models.py index 2cfc9583..fe2df3db 100644 --- a/djangocms_alias/models.py +++ b/djangocms_alias/models.py @@ -19,7 +19,6 @@ from parler.models import TranslatableModel, TranslatedFields from .constants import CHANGE_ALIAS_URL_NAME, CHANGE_CATEGORY_URL_NAME -from .utils import is_versioning_enabled __all__ = [ "Category", @@ -158,15 +157,18 @@ def objects_using(self): def get_name(self, language=None): content = self.get_content(language, show_draft_content=True) + if not content: + content = next(iter(self._content_cache.values()), None) name = getattr(content, "name", f"Alias {self.pk} (No content)") - if is_versioning_enabled() and content: + try: from djangocms_versioning.constants import DRAFT version = content.versions.first() if version.state == DRAFT: return f"{name} (Not published)" - + except (ImportError, ModuleNotFoundError, AttributeError): + return name # djangocms versioning unreachable for draft check - just return the name return name def get_content(self, language=None, show_draft_content=False): @@ -180,10 +182,9 @@ def get_content(self, language=None, show_draft_content=False): qs = self.contents(manager="admin_manager").latest_content() else: qs = self.contents.all() - qs = qs.filter(language=language) - - self._content_cache[language] = qs.first() - return self._content_cache[language] + for content in qs: + self._content_cache.setdefault(content.language, content) + return self._content_cache.get(language) def get_placeholder(self, language=None, show_draft_content=False): content = self.get_content(language=language, show_draft_content=show_draft_content) diff --git a/djangocms_alias/utils.py b/djangocms_alias/utils.py index 4bfbfccc..7ee161c9 100644 --- a/djangocms_alias/utils.py +++ b/djangocms_alias/utils.py @@ -1,14 +1,22 @@ +from functools import cache + from django.apps import apps -def is_versioning_enabled(): - from .models import AliasContent +@cache +def get_versionable_item(cms_config) -> type | None: + if hasattr(cms_config, "get_contract"): + return cms_config.get_contract("djangocms_versioning") + return None - try: - app_config = apps.get_app_config("djangocms_versioning") - return app_config.cms_extension.is_content_model_versioned(AliasContent) - except LookupError: - return False + +def is_versioning_enabled() -> bool: + """ + is_versioning_enabled returns True if djangocms-alias has registered itself + for verisoning + """ + cms_config = apps.get_app_config("djangocms_alias").cms_config + return bool(getattr(cms_config, "versioning", False)) def emit_content_change(objs, sender=None):