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
40 changes: 38 additions & 2 deletions djangocms_alias/templatetags/djangocms_alias_tags.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,10 @@

register = template.Library()

DeclaredStaticAlias = namedtuple("DeclaredStaticAlias", ["static_code", "site"])
DeclaredStaticAlias = namedtuple(
"DeclaredStaticAlias",
["static_code", "site", "placeholder_preview_link"],
)

_static_alias_editing_enabled = getattr(settings, "STATIC_ALIAS_EDITING_ENABLED", True)

Expand Down Expand Up @@ -71,10 +74,12 @@

eg: {% static_alias "identifier_text" %}
eg: {% static_alias "identifier_text" site %}
eg: {% static_alias "identifier_text" placeholder_preview_link %}

Keyword arguments:
static_code -- the unique identifier of the Alias
site -- If site is supplied an Alias instance will be created per site.
placeholder_preview_link -- If supplied, show a link to the placeholder.
"""

name = "static_alias"
Expand Down Expand Up @@ -166,6 +171,29 @@
if self.toolbar.edit_mode_active and not editable and _static_alias_editing_enabled:
# Also non-editable placeholders need interactivity in the structure board
content += renderer.get_placeholder_toolbar_js(placeholder)

if (
"placeholder_preview_link" in extra_bits
and self.toolbar
and not self.toolbar.preview_mode_active
and self.toolbar.is_staff
):
href = admin_view_url(alias)
link = f"""
<span class="static-alias-placeholder-preview-link" style="position: relative;">
<a href="{href}" class="cms-icon cms-icon-view"
style="background: repeating-linear-gradient(-45deg, #dedede, #dedede 10px, #a9a9a9 10px, #a9a9a9 20px);

Check failure on line 185 in djangocms_alias/templatetags/djangocms_alias_tags.py

View workflow job for this annotation

GitHub Actions / ruff

Ruff (E501)

djangocms_alias/templatetags/djangocms_alias_tags.py:185:120: E501 Line too long (125 > 119)
bottom: 0;
opacity: .5;
padding: 5px;
position: absolute;
right: 0;
text-decoration: none;">
</a>
</span>
"""
content = link + content

return content
return ""

Expand All @@ -175,10 +203,18 @@
return None
static_code = str(self.kwargs["static_code"].var).strip('"').strip("'")
site = False
placeholder_preview_link = False
if isinstance(self.kwargs["extra_bits"], ListValue):
site = any(extra.var.value.strip() == "site" for extra in self.kwargs["extra_bits"])
placeholder_preview_link = any(
extra.var.value.strip() == "placeholder_preview_link" for extra in self.kwargs["extra_bits"]
)

return DeclaredStaticAlias(static_code=static_code, site=site)
return DeclaredStaticAlias(
static_code=static_code,
site=site,
placeholder_preview_link=placeholder_preview_link,
)


register.tag(StaticAlias.name, StaticAlias)
97 changes: 96 additions & 1 deletion tests/test_templatetags.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
from unittest import skipUnless

from cms.api import add_plugin, create_page, create_page_content
from cms.toolbar.utils import get_object_edit_url, get_object_preview_url
from cms.toolbar.utils import (
get_object_edit_url,
get_object_preview_url,
get_toolbar_from_request,
)
from django.contrib.auth.models import AnonymousUser
from django.contrib.sites.models import Site
from django.test.utils import override_settings

Expand Down Expand Up @@ -408,3 +413,93 @@ def test_alias_rendered_when_identifier_is_variable(self):
)

self.assertEqual(output, "Content Alias 1234")

def test_alias_rendered_including_placeholder_preview_link(self):
alias_template = """{% load djangocms_alias_tags %}{% static_alias "some_unique_id" %}""" # noqa: E501
alias_link_enabled_template = (
"""{% load djangocms_alias_tags %}{% static_alias "some_unique_id" placeholder_preview_link %}""" # noqa: E501
)
alias_content = "Content Alias 1234"
alias_preview_link = '<span class="static-alias-placeholder-preview-link" '

alias = self._create_alias(static_code="some_unique_id")
add_plugin(
alias.get_placeholder(self.language),
"TextPlugin",
language=self.language,
body=alias_content,
)

request = self.get_request("/")
toolbar = get_toolbar_from_request(request)
toolbar.is_staff = True
toolbar.preview_mode_active = False
request.toolbar = toolbar

with self.subTest("preview-link disabled"):
output = self.render_template_obj(alias_template, {}, request)
self.assertEqual(alias_content, output)

with self.subTest("preview-link disabled due to preview-mode"):
request.toolbar.preview_mode_active = True
output = self.render_template_obj(
alias_link_enabled_template,
{},
request,
)
self.assertEqual(alias_content, output)

request.toolbar.preview_mode_active = False

with self.subTest("preview-link enabled in edit-mode"):
output = self.render_template_obj(
alias_link_enabled_template,
{},
request,
)
self.assertNotEqual(alias_content, output)
self.assertIn(alias_preview_link, output)

# check that other "extra_bits" don't interfere with functionality
output = self.render_template_obj(
alias_link_enabled_template.replace(
"placeholder_preview_link",
"site placeholder_preview_link",
),
{},
request,
)
self.assertNotEqual(alias_content, output)
self.assertIn(alias_preview_link, output)

with self.subTest("preview-link disabled for missing staff-rights"):
request.toolbar.is_staff = False
output = self.render_template_obj(
alias_link_enabled_template,
{},
request,
)
self.assertEqual(alias_content, output)

request.toolbar.is_staff = True

with self.subTest("preview-link disabled for missing toolbar"):
del request.toolbar
output = self.render_template_obj(
alias_link_enabled_template,
{},
request,
)
self.assertEqual(alias_content, output)

request.toolbar = toolbar

with self.subTest("preview-link hidden for anonymous user"):
anon_request = self.get_request("/")
anon_request.user = AnonymousUser()
output = self.render_template_obj(
alias_link_enabled_template,
{},
anon_request,
)
self.assertEqual(alias_content, output)
Loading