Skip to content

Commit 311f829

Browse files
committed
feat: Use django-cms core's get_object_live_url if available
1 parent 712f59c commit 311f829

File tree

3 files changed

+29
-18
lines changed

3 files changed

+29
-18
lines changed

djangocms_versioning/admin.py

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,10 @@
4646
content_is_unlocked_for_user,
4747
create_version_lock,
4848
get_admin_url,
49+
get_current_site,
4950
get_editable_url,
5051
get_latest_admin_viewable_content,
52+
get_object_live_url,
5153
get_preview_url,
5254
proxy_model,
5355
remove_version_lock,
@@ -1102,13 +1104,8 @@ def publish_view(self, request, object_id):
11021104

11031105
# Redirect to published?
11041106
if not requested_redirect and conf.ON_PUBLISH_REDIRECT == "published":
1105-
if hasattr(version.content, "get_full_url"):
1106-
full_url = version.content.get_full_url()
1107-
if full_url:
1108-
# Can't resolve full_url, redirect directly to it
1109-
return redirect(full_url)
1110-
elif hasattr(version.content, "get_absolute_url"):
1111-
requested_redirect = version.content.get_absolute_url()
1107+
if hasattr(version.content, "get_absolute_url"):
1108+
requested_redirect = get_object_live_url(version.content, site=get_current_site(request))
11121109

11131110
return self._internal_redirect(requested_redirect, redirect_url)
11141111

djangocms_versioning/cms_toolbars.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
from collections import OrderedDict
22
from copy import copy
3-
from typing import Optional
43

54
from cms import __version__ as cms_version
65
from cms.cms_toolbars import (
@@ -31,7 +30,9 @@
3130
from djangocms_versioning.conf import ALLOW_DELETING_VERSIONS, LOCK_VERSIONS
3231
from djangocms_versioning.constants import DRAFT
3332
from djangocms_versioning.helpers import (
33+
get_current_site,
3434
get_latest_admin_viewable_content,
35+
get_object_live_url,
3536
version_list_url,
3637
)
3738
from djangocms_versioning.models import Version
@@ -258,9 +259,9 @@ def _add_view_published_button(self):
258259
if not published_version:
259260
return
260261

261-
url = published_version.get_full_url() if hasattr(published_version, "get_full_url") else None
262-
if not url and hasattr(published_version, "get_absolute_url"):
263-
url = published_version.get_absolute_url()
262+
url = None
263+
if hasattr(published_version, "get_absolute_url"):
264+
url = get_object_live_url(published_version, site=get_current_site(self.toolbar.request))
264265
if url and (self.toolbar.edit_mode_active or self.toolbar.preview_mode_active):
265266
item = ButtonList(side=self.toolbar.RIGHT)
266267
item.add_button(
@@ -299,10 +300,10 @@ class VersioningPageToolbar(PageToolbar):
299300
"""
300301

301302
def __init__(self, *args, **kwargs):
302-
self.page_content: Optional[PageContent] = None
303+
self.page_content: PageContent | None = None
303304
super().__init__(*args, **kwargs)
304305

305-
def get_page_content(self, language: Optional[str] = None) -> PageContent:
306+
def get_page_content(self, language: str | None = None) -> PageContent:
306307
# This method overwrites the method in django CMS core. Not necessary
307308
# for django CMS 4.2+
308309
if not language:

djangocms_versioning/helpers.py

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
import warnings
33
from collections.abc import Iterable
44
from contextlib import contextmanager
5-
from typing import Optional
65

76
from cms.models import Page, PageContent, Placeholder
87
from cms.toolbar.utils import get_object_edit_url, get_object_preview_url
@@ -17,7 +16,7 @@
1716
from django.http import HttpRequest
1817
from django.template.loader import render_to_string
1918
from django.utils.encoding import force_str
20-
from django.utils.translation import get_language
19+
from django.utils.translation import get_language, override as force_language
2120

2221
from . import versionables
2322
from .conf import EMAIL_NOTIFICATIONS_FAIL_SILENTLY
@@ -28,6 +27,20 @@
2827
except ImportError:
2928
emit_content_change = None
3029

30+
try:
31+
from cms.toolbar.utils import get_object_live_url
32+
from cms.utils import get_current_site
33+
except ImportError: # cms < 5.1
34+
def get_object_live_url(obj, language=None, site=None) -> str:
35+
with force_language(language):
36+
return obj.get_absolute_url()
37+
return None
38+
39+
def get_current_site(request) -> models.Model:
40+
from django.contrib.sites.models import Site
41+
42+
return Site.objects.get_current()
43+
3144

3245
def is_editable(content_obj: models.Model, request: HttpRequest) -> bool:
3346
"""Check of content_obj is editable"""
@@ -71,7 +84,7 @@ def _replace_admin_for_model(modeladmin: type[admin.ModelAdmin], mixin: type, ad
7184
admin_site.register(modeladmin.model, new_admin_class)
7285

7386

74-
def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site: Optional[admin.AdminSite] = None):
87+
def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site: admin.AdminSite | None = None):
7588
"""
7689
:param models: List of (model class, admin mixin class) tuples
7790
:param admin_site: AdminSite instance
@@ -86,7 +99,7 @@ def replace_admin_for_models(pairs: tuple[type[models.Model], type], admin_site:
8699
_replace_admin_for_model(modeladmin, mixin, admin_site)
87100

88101

89-
def register_versionadmin_proxy(versionable, admin_site: Optional[admin.AdminSite] = None):
102+
def register_versionadmin_proxy(versionable, admin_site: admin.AdminSite | None = None):
90103
"""Creates a model admin class based on `VersionAdmin` and registers
91104
it with `admin_site` for `versionable.version_model_proxy`.
92105
@@ -281,7 +294,7 @@ def get_content_types_with_subclasses(models: Iterable[type[models.Model]], usin
281294

282295

283296
def get_preview_url(
284-
content_obj: models.Model, language: Optional[str] = None
297+
content_obj: models.Model, language: str | None = None
285298
) -> str:
286299
"""If the object is editable the cms preview view should be used, with the toolbar.
287300
This method provides the URL for it. It falls back the standard change view

0 commit comments

Comments
 (0)