Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
54 changes: 30 additions & 24 deletions djangocms_alias/cms_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,47 +7,53 @@
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")
from .internal_search import AliasContentConfig
except (ImportError, LookupError):
AliasContentConfig = None

djangocms_versioning_installed = apps.is_installed("djangocms_versioning")


class AliasCMSConfig(CMSAppConfig):
cms_enabled = True
cms_toolbar_enabled_models = [(AliasContent, render_alias_content, "alias")]
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 = [
Expand Down
3 changes: 0 additions & 3 deletions djangocms_alias/filters.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,16 +4,13 @@
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,
SITE_FILTER_URL_PARAM,
)
from .models import Category

djangocms_versioning_enabled = AliasCMSConfig.djangocms_versioning_enabled


class SiteFilter(admin.SimpleListFilter):
title = _("Site")
Expand Down
15 changes: 8 additions & 7 deletions djangocms_alias/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -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):
Expand All @@ -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)
Expand Down
22 changes: 15 additions & 7 deletions djangocms_alias/utils.py
Original file line number Diff line number Diff line change
@@ -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):
Expand Down