diff --git a/djangocms_alias/cms_plugins.py b/djangocms_alias/cms_plugins.py index f440106e..4bc764a2 100644 --- a/djangocms_alias/cms_plugins.py +++ b/djangocms_alias/cms_plugins.py @@ -2,6 +2,7 @@ from cms.plugin_base import CMSPluginBase, PluginMenuItem from cms.plugin_pool import plugin_pool +from cms.toolbar.utils import get_object_edit_url from cms.utils.permissions import ( get_model_permission_codename, has_plugin_permission, @@ -39,20 +40,22 @@ def get_render_template(self, context, instance, placeholder): @classmethod def get_extra_plugin_menu_items(cls, request, plugin): if plugin.plugin_type == cls.__name__: - edit_endpoint = plugin.alias.get_absolute_url() + alias_content = plugin.alias.get_content() detach_endpoint = admin_reverse( DETACH_ALIAS_PLUGIN_URL_NAME, args=[plugin.pk], ) - plugin_menu_items = [ - PluginMenuItem( - _("Edit Alias"), - edit_endpoint, - action="sideframe", - attributes={"cms-icon": "alias"}, - ), - ] + plugin_menu_items = [] + if alias_content: + plugin_menu_items.append( + PluginMenuItem( + _("Edit Alias"), + get_object_edit_url(alias_content), + action="", + attributes={"cms-icon": "alias"}, + ), + ) if cls.can_detach( request.user, diff --git a/djangocms_alias/cms_toolbars.py b/djangocms_alias/cms_toolbars.py index 87f102c5..7d241470 100644 --- a/djangocms_alias/cms_toolbars.py +++ b/djangocms_alias/cms_toolbars.py @@ -8,10 +8,10 @@ SHORTCUTS_BREAK, ) from cms.toolbar.items import Break, ButtonList +from cms.toolbar.utils import get_object_edit_url from cms.toolbar_base import CMSToolbar from cms.toolbar_pool import toolbar_pool from cms.utils.i18n import ( - force_language, get_default_language, get_language_dict, get_language_tuple, @@ -185,8 +185,7 @@ def override_language_switcher(self): show_draft_content=True, ) if alias_content: - with force_language(code): - url = alias_content.get_absolute_url() + url = get_object_edit_url(alias_content, language=code) language_menu.add_link_item(name, url=url, active=self.current_lang == code) def change_language_menu(self): diff --git a/djangocms_alias/forms.py b/djangocms_alias/forms.py index afc1f886..d128b491 100644 --- a/djangocms_alias/forms.py +++ b/djangocms_alias/forms.py @@ -148,15 +148,11 @@ def save(self): category=self.cleaned_data.get("category"), site=self.cleaned_data.get("site"), ) - alias_content = AliasContent.objects.create( + alias_content = AliasContent.objects.with_user(self.user).create( alias=alias, name=self.cleaned_data.get("name"), language=self.cleaned_data.get("language"), ) - if is_versioning_enabled(): - from djangocms_versioning.models import Version - - Version.objects.create(content=alias_content, created_by=self.user) if self.cleaned_data.get("replace"): placeholder = self.cleaned_data.get("placeholder") plugin = self.cleaned_data.get("plugin") diff --git a/djangocms_alias/internal_search.py b/djangocms_alias/internal_search.py index 34d4d835..30b02c15 100644 --- a/djangocms_alias/internal_search.py +++ b/djangocms_alias/internal_search.py @@ -1,4 +1,4 @@ -from cms.toolbar.utils import get_toolbar_from_request +from cms.toolbar.utils import get_object_preview_url, get_toolbar_from_request from django.template import RequestContext from django.utils.translation import gettext_lazy as _ from djangocms_internalsearch.base import BaseSearchConfig @@ -77,7 +77,7 @@ def prepare_text(self, obj): return content def prepare_url(self, obj): - return obj.get_absolute_url() + return get_object_preview_url(obj) def prepare_category(self, obj): obj.alias.category.set_current_language(obj.language) diff --git a/djangocms_alias/models.py b/djangocms_alias/models.py index f9190817..4e0b397f 100644 --- a/djangocms_alias/models.py +++ b/djangocms_alias/models.py @@ -5,7 +5,6 @@ from cms.models import CMSPlugin, Placeholder from cms.models.fields import PlaceholderRelationField from cms.models.managers import WithUserMixin -from cms.toolbar.utils import get_object_preview_url from cms.utils.plugins import copy_plugins_to_placeholder from cms.utils.urlutils import admin_reverse from django.conf import settings @@ -62,7 +61,7 @@ def __str__(self): # Be sure to be able to see the category name even if it's not in the current language return self.safe_translation_getter("name", any_language=True) - def get_absolute_url(self): + def get_admin_change_url(self): """Builds the url to the admin category change view""" return admin_reverse(CHANGE_CATEGORY_URL_NAME, args=[self.pk]) @@ -160,17 +159,6 @@ def get_name(self, language=None): return name - def get_absolute_url(self, language=None): - if is_versioning_enabled(): - from djangocms_versioning.helpers import ( - version_list_url_for_grouper, - ) - - return version_list_url_for_grouper(self) - content = self.get_content(language=language) - if content: - return content.get_absolute_url() - def get_content(self, language=None, show_draft_content=False): if not language: language = get_language() @@ -300,9 +288,6 @@ def placeholder(self): def get_placeholders(self): return [self.placeholder] - def get_absolute_url(self): - return get_object_preview_url(self) - def get_template(self): return "djangocms_alias/alias_content.html" diff --git a/djangocms_alias/templates/admin/djangocms_alias/alias/delete_confirmation.html b/djangocms_alias/templates/admin/djangocms_alias/alias/delete_confirmation.html index ae4878ab..cef5e7fd 100644 --- a/djangocms_alias/templates/admin/djangocms_alias/alias/delete_confirmation.html +++ b/djangocms_alias/templates/admin/djangocms_alias/alias/delete_confirmation.html @@ -26,7 +26,7 @@ {% for item in object.objects_using %}
  • {{ item|verbose_name|capfirst|escape }}: - {{ item }} + {% if item|admin_view_url %}{{ item }}{% else %}{{ item }}{% endif %}
  • {% endfor %} diff --git a/djangocms_alias/templates/djangocms_alias/alias_usage.html b/djangocms_alias/templates/djangocms_alias/alias_usage.html index 82963c61..41e06330 100644 --- a/djangocms_alias/templates/djangocms_alias/alias_usage.html +++ b/djangocms_alias/templates/djangocms_alias/alias_usage.html @@ -39,7 +39,11 @@ {% with item|verbose_name as object_type %} {{ object_type|capfirst|escape }} - {{ item }} + {% if item|admin_view_url %} + {{ item }} + {% else %} + {{ item }} + {% endif %} {% if object_type == 'alias' %} diff --git a/djangocms_alias/templates/djangocms_alias/detach_alias.html b/djangocms_alias/templates/djangocms_alias/detach_alias.html index b9425892..caa95a0a 100644 --- a/djangocms_alias/templates/djangocms_alias/detach_alias.html +++ b/djangocms_alias/templates/djangocms_alias/detach_alias.html @@ -11,10 +11,10 @@
    {% csrf_token %} -
    - - + + {% endblock %} diff --git a/djangocms_alias/templatetags/djangocms_alias_tags.py b/djangocms_alias/templatetags/djangocms_alias_tags.py index d0f04d6f..49f3d458 100644 --- a/djangocms_alias/templatetags/djangocms_alias_tags.py +++ b/djangocms_alias/templatetags/djangocms_alias_tags.py @@ -3,8 +3,9 @@ from classytags.arguments import Argument, MultiValueArgument from classytags.core import Tag from cms.templatetags.cms_tags import PlaceholderOptions -from cms.toolbar.utils import get_toolbar_from_request +from cms.toolbar.utils import get_object_preview_url, get_toolbar_from_request from cms.utils import get_current_site, get_language_from_request +from cms.utils.helpers import is_editable_model from cms.utils.i18n import get_default_language, get_language_list from cms.utils.placeholder import validate_placeholder_name from cms.utils.urlutils import add_url_parameters, admin_reverse @@ -27,6 +28,21 @@ def get_alias_usage_view_url(alias, **kwargs): return add_url_parameters(url, **ChainMap(kwargs)) +@register.filter() +def admin_view_url(obj): + if is_editable_model(obj.__class__): + # Is obj frontend-editable? + return get_object_preview_url(obj) + if hasattr(obj, "get_content"): + # Is its content object frontend-editable? + content_obj = obj.get_content() + if is_editable_model(content_obj.__class__): + return get_object_preview_url(content_obj) + if hasattr(obj, "get_absolute_url"): + return obj.get_absolute_url() + return "" + + @register.filter() def verbose_name(obj): return obj._meta.verbose_name diff --git a/tests/test_admin.py b/tests/test_admin.py index d1a16ca4..3125990b 100644 --- a/tests/test_admin.py +++ b/tests/test_admin.py @@ -2,6 +2,7 @@ from bs4 import BeautifulSoup from cms.api import add_plugin +from cms.toolbar.utils import get_object_preview_url from cms.utils.i18n import force_language from cms.utils.urlutils import add_url_parameters, admin_reverse from django.contrib.auth.models import Permission @@ -208,7 +209,7 @@ def test_alias_content_manager_rendering_preview_add_url(self): response_content_decoded = response.content.decode() self.assertIn( - expected_en_content.get_absolute_url(), + get_object_preview_url(expected_en_content), response_content_decoded, ) self.assertNotIn( @@ -428,9 +429,9 @@ def test_aliascontent_list_view(self): self.assertNotContains(response, "Published") self.assertNotContains(response, "Draft") - aliascontent1_url = alias1.get_absolute_url() - aliascontent2_url = alias2.get_absolute_url() - aliascontent3_url = alias3.get_absolute_url() + aliascontent1_url = get_object_preview_url(alias1.get_content(show_draft_content=True)) + aliascontent2_url = get_object_preview_url(alias2.get_content(show_draft_content=True)) + aliascontent3_url = get_object_preview_url(alias3.get_content(show_draft_content=True)) # when versioning is not enabled, the django admin change form # is used which used links to the aliascontent_change view diff --git a/tests/test_cms_plugins.py b/tests/test_cms_plugins.py index 7a69e354..9ce4e374 100644 --- a/tests/test_cms_plugins.py +++ b/tests/test_cms_plugins.py @@ -3,6 +3,7 @@ from urllib.parse import urlparse from cms.api import add_plugin, create_title +from cms.toolbar.utils import get_object_edit_url from cms.utils import get_current_site from cms.utils.plugins import downcast_plugins from cms.utils.urlutils import admin_reverse @@ -50,8 +51,8 @@ def test_extra_plugin_items_for_alias_plugins(self): self.assertEqual(len(extra_items), 2) first, second = extra_items self.assertEqual(first.name, "Edit Alias") - self.assertEqual(first.url, alias.get_absolute_url()) - self.assertEqual(first.action, "sideframe") + self.assertEqual(first.url, get_object_edit_url(alias.get_content())) + self.assertEqual(first.action, "") self.assertEqual(second.name, "Detach Alias") self.assertEqual(second.action, "modal") @@ -95,7 +96,7 @@ def test_extra_plugin_items_with_versioning_checks(self): first = extra_items[0] # We cannot detach alias on undraft page self.assertEqual(first.name, "Edit Alias") - self.assertEqual(first.url, alias.get_absolute_url()) + self.assertEqual(first.url, get_object_edit_url(alias.get_content())) def test_rendering_plugin_on_page(self): alias = self._create_alias(published=True) diff --git a/tests/test_menu.py b/tests/test_menu.py index d70328a6..ec811586 100644 --- a/tests/test_menu.py +++ b/tests/test_menu.py @@ -1,3 +1,5 @@ +from cms.toolbar.utils import get_object_edit_url + from djangocms_alias.utils import is_versioning_enabled from .base import BaseAliasPluginTestCase @@ -7,8 +9,8 @@ class AliasMenuTestCase(BaseAliasPluginTestCase): def test_alias_pages_have_no_menu_nodes(self): alias = self._create_alias() with self.login_user_context(self.superuser): - response = self.client.get(alias.get_absolute_url()) - if is_versioning_enabled(): + response = self.client.get(get_object_edit_url(alias.get_content()), follow=True) + if is_versioning_enabled() and False: self.assertNotContains(response, '