Skip to content

Commit 08ec77b

Browse files
authored
fix: auto-create static alias content in current language (#165)
1 parent 7525409 commit 08ec77b

File tree

14 files changed

+115
-68
lines changed

14 files changed

+115
-68
lines changed

.pre-commit-config.yaml

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,14 +25,10 @@ repos:
2525
hooks:
2626
- id: flake8
2727
additional_dependencies:
28-
# - flake8-broken-line
2928
- flake8-bugbear
3029
- flake8-builtins
31-
- flake8-coding
32-
- flake8-commas
3330
- flake8-comprehensions
34-
- flake8-eradicate
35-
- flake8-quotes
31+
# - flake8-eradicate
3632
- flake8-tidy-imports
3733
- pep8-naming
3834

djangocms_alias/__init__.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1 @@
11
__version__ = '1.11.0'
2-
3-
default_app_config = 'djangocms_alias.apps.AliasConfig'

djangocms_alias/admin.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,12 +122,13 @@ def get_queryset(self, request):
122122
return queryset
123123

124124
# Add Alias category in the admin manager list and order field
125+
@admin.display(
126+
description=_('category'),
127+
ordering="alias_category_translations_ordered",
128+
)
125129
def get_category(self, obj):
126130
return obj.alias.category
127131

128-
get_category.short_description = _('category')
129-
get_category.admin_order_field = "alias_category_translations_ordered"
130-
131132
def has_add_permission(self, request, obj=None):
132133
# FIXME: It is not currently possible to add an alias from the django admin changelist issue #97
133134
# https://github.com/django-cms/djangocms-alias/issues/97

djangocms_alias/cms_plugins.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ def get_render_template(self, context, instance, placeholder):
3636
and instance.is_recursive()
3737
):
3838
return 'djangocms_alias/alias_recursive.html'
39-
return 'djangocms_alias/{}/alias.html'.format(instance.template)
39+
return f'djangocms_alias/{instance.template}/alias.html'
4040

4141
@classmethod
4242
def get_extra_plugin_menu_items(cls, request, plugin):

djangocms_alias/cms_toolbars.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -227,7 +227,7 @@ def change_language_menu(self):
227227

228228
if add:
229229
add_plugins_menu = language_menu.get_or_create_menu(
230-
'{0}-add'.format(LANGUAGE_MENU_IDENTIFIER),
230+
f'{LANGUAGE_MENU_IDENTIFIER}-add',
231231
_('Add Translation'),
232232
)
233233
add_url = admin_reverse('djangocms_alias_aliascontent_add')
@@ -238,7 +238,7 @@ def change_language_menu(self):
238238

239239
if remove:
240240
remove_plugins_menu = language_menu.get_or_create_menu(
241-
'{0}-del'.format(LANGUAGE_MENU_IDENTIFIER),
241+
f'{LANGUAGE_MENU_IDENTIFIER}-del',
242242
_('Delete Translation'),
243243
)
244244
disabled = len(remove) == 1
@@ -256,7 +256,7 @@ def change_language_menu(self):
256256

257257
if copy:
258258
copy_plugins_menu = language_menu.get_or_create_menu(
259-
'{0}-copy'.format(LANGUAGE_MENU_IDENTIFIER),
259+
f'{LANGUAGE_MENU_IDENTIFIER}-copy',
260260
_('Copy all plugins')
261261
)
262262
title = _('from %s')

djangocms_alias/models.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -134,7 +134,7 @@ def objects_using(self):
134134
if obj_class_name.endswith('Content'):
135135
attr_name = obj_class_name.replace('Content', '').lower()
136136
attr_related_model = obj._meta.get_field(attr_name).related_model
137-
id_attr = getattr(obj, '{}_id'.format(attr_name))
137+
id_attr = getattr(obj, f'{attr_name}_id')
138138
if id_attr:
139139
object_ids[attr_related_model].update([id_attr])
140140
else:
@@ -150,13 +150,13 @@ def objects_using(self):
150150

151151
def get_name(self, language=None):
152152
content = self.get_content(language, show_draft_content=True)
153-
name = getattr(content, 'name', 'Alias {} (No content)'.format(self.pk))
153+
name = getattr(content, 'name', f'Alias {self.pk} (No content)')
154154
if is_versioning_enabled() and content:
155155
from djangocms_versioning.constants import DRAFT
156156
version = content.versions.first()
157157

158158
if version.state == DRAFT:
159-
return '{} (Not published)'.format(name)
159+
return f'{name} (Not published)'
160160

161161
return name
162162

@@ -282,7 +282,7 @@ class Meta:
282282
verbose_name_plural = _('alias contents')
283283

284284
def __str__(self):
285-
return '{} ({})'.format(self.name, self.language)
285+
return f'{self.name} ({self.language})'
286286

287287
@cached_property
288288
def placeholder(self):

djangocms_alias/templatetags/djangocms_alias_tags.py

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from cms.templatetags.cms_tags import PlaceholderOptions
66
from cms.toolbar.utils import get_toolbar_from_request
77
from cms.utils import get_current_site, get_language_from_request
8-
from cms.utils.i18n import get_default_language_for_site
8+
from cms.utils.i18n import get_language_list
99
from cms.utils.placeholder import validate_placeholder_name
1010
from cms.utils.urlutils import add_url_parameters, admin_reverse
1111

@@ -86,16 +86,22 @@ def _get_alias(self, request, static_code, extra_bits):
8686
else:
8787
alias_filter_kwargs['site_id__isnull'] = True
8888

89+
if hasattr(request, "toolbar"):
90+
# Try getting language from the toolbar first (end and view endpoints)
91+
language = getattr(request.toolbar.get_object(), "language", None)
92+
if language not in get_language_list(current_site):
93+
language = None
94+
else:
95+
language = get_language_from_request(request)
8996
# Try and find an Alias to render
9097
alias = Alias.objects.filter(**alias_filter_kwargs).first()
9198
# If there is no alias found we need to create one
9299
if not alias:
93100

94-
# If versioning is enabled we can only create the records with a logged in user / staff member
101+
# If versioning is enabled we can only create the records with a logged-in user / staff member
95102
if is_versioning_enabled() and not request.user.is_authenticated:
96103
return None
97104

98-
language = get_default_language_for_site(current_site)
99105
# Parlers get_or_create doesn't work well with translations, so we must perform our own get or create
100106
default_category = Category.objects.filter(translations__name=DEFAULT_STATIC_ALIAS_CATEGORY_NAME).first()
101107
if not default_category:
@@ -110,6 +116,13 @@ def _get_alias(self, request, static_code, extra_bits):
110116
alias_creation_kwargs['site'] = current_site
111117

112118
alias = Alias.objects.create(category=default_category, **alias_creation_kwargs)
119+
120+
if not AliasContent._default_manager.filter(alias=alias, language=language).exists():
121+
# Create a first content object if none exists in the given language.
122+
# If versioning is enabled we can only create the records with a logged-in user / staff member
123+
if is_versioning_enabled() and not request.user.is_authenticated:
124+
return None
125+
113126
alias_content = AliasContent.objects.create(
114127
alias=alias,
115128
name=static_code,
@@ -120,6 +133,7 @@ def _get_alias(self, request, static_code, extra_bits):
120133
from djangocms_versioning.models import Version
121134

122135
Version.objects.create(content=alias_content, created_by=request.user)
136+
alias._content_cache[language] = alias_content
123137

124138
return alias
125139

djangocms_alias/urls.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,37 @@
1-
from django.urls import re_path
1+
from django.urls import path
22

33

44
from . import constants, views # isort:skip
55

66

77
urlpatterns = [
8-
re_path(
9-
r'^create-alias/$',
8+
path(
9+
'create-alias/',
1010
views.create_alias_view,
1111
name=constants.CREATE_ALIAS_URL_NAME,
1212
),
13-
re_path(
14-
r'^aliases/(?P<pk>\d+)/usage/$',
13+
path(
14+
'aliases/<int:pk>/usage/',
1515
views.alias_usage_view,
1616
name=constants.USAGE_ALIAS_URL_NAME,
1717
),
18-
re_path(
19-
r'^detach-alias/(?P<plugin_pk>\d+)/$',
18+
path(
19+
'detach-alias/<int:plugin_pk>/',
2020
views.detach_alias_plugin_view,
2121
name=constants.DETACH_ALIAS_PLUGIN_URL_NAME,
2222
),
23-
re_path(
24-
r'^delete-alias/(?P<pk>\d+)/$',
23+
path(
24+
'delete-alias/<int:pk>/',
2525
views.delete_alias_view,
2626
name=constants.DELETE_ALIAS_URL_NAME,
2727
),
28-
re_path(
29-
r'^select2/$',
28+
path(
29+
'select2/',
3030
views.AliasSelect2View.as_view(),
3131
name=constants.SELECT2_ALIAS_URL_NAME,
3232
),
33-
re_path(
34-
r'^category-select2/$',
33+
path(
34+
'category-select2/',
3535
views.CategorySelect2View.as_view(),
3636
name=constants.CATEGORY_SELECT2_URL_NAME,
3737
),

djangocms_alias/views.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def delete_alias_view(request, pk, *args, **kwargs):
7676
model=AliasModel,
7777
admin_site=admin.site,
7878
)
79-
response = alias_admin.delete_view(request, pk)
79+
response = alias_admin.delete_view(request, str(pk))
8080
if request.POST and response.status_code in [200, 302]:
8181
return HttpResponse(JAVASCRIPT_SUCCESS_RESPONSE)
8282
return response
@@ -294,7 +294,7 @@ def alias_usage_view(request, pk):
294294

295295
alias = get_object_or_404(AliasModel.objects.all(), pk=pk)
296296
opts = Alias.model._meta
297-
title = _('Objects using alias: {}'.format(alias))
297+
title = _(f'Objects using alias: {alias}')
298298
context = {
299299
'has_change_permission': True,
300300
'opts': opts,

tests/test_admin_filters.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -60,19 +60,19 @@ def test_language_filter(self):
6060

6161
self.assertEqual(
6262
set(response_default.context["cl"].queryset),
63-
set([expected_en_content])
63+
{expected_en_content}
6464
)
6565
self.assertEqual(
6666
set(response_en.context["cl"].queryset),
67-
set([expected_en_content])
67+
{expected_en_content}
6868
)
6969
self.assertEqual(
7070
set(response_de.context["cl"].queryset),
71-
set([expected_de_content])
71+
{expected_de_content}
7272
)
7373
self.assertEqual(
7474
set(response_fr.context["cl"].queryset),
75-
set([])
75+
set()
7676
)
7777

7878

@@ -145,31 +145,31 @@ def test_site_filter(self):
145145
# By default all alias are shown
146146
self.assertEqual(
147147
set(response_default.context["cl"].queryset),
148-
set([
148+
{
149149
current_site_alias_content,
150150
another_site_alias_content,
151151
no_site_alias_content,
152-
])
152+
}
153153
)
154154
# Only alias attached to the current site are shown when filtered by the current site
155155
self.assertEqual(
156156
set(response_current_site.context["cl"].queryset),
157-
set([current_site_alias_content])
157+
{current_site_alias_content}
158158
)
159159
# Only alias attached to the current site are shown when filtered by another site
160160
self.assertEqual(
161161
set(response_other_site.context["cl"].queryset),
162-
set([another_site_alias_content])
162+
{another_site_alias_content}
163163
)
164164
# Only alias attached to the current site are shown when filtered by no site
165165
self.assertEqual(
166166
set(response_no_site.context["cl"].queryset),
167-
set([no_site_alias_content])
167+
{no_site_alias_content}
168168
)
169169
# No are shown when filtered by an empty site
170170
self.assertEqual(
171171
set(response_empty_site.context["cl"].queryset),
172-
set([])
172+
set()
173173
)
174174

175175

@@ -216,9 +216,9 @@ def test_unpublished_filter(self):
216216
# filter by unpublished show
217217

218218
# show all alias contents excluding unpublished versions
219-
self.assertEqual(set(qs_default), set([expected_en_content]))
219+
self.assertEqual(set(qs_default), {expected_en_content})
220220
# show all aliase contents including unpublished versions
221-
self.assertEqual(set(qs_unpublished), set([expected_unpublished]))
221+
self.assertEqual(set(qs_unpublished), {expected_unpublished})
222222

223223

224224
class CatergoryFiltersTestCase(BaseAliasPluginTestCase):
@@ -261,20 +261,20 @@ def test_category_filter_no_verisoning(self):
261261
# By default all alias contents are shown
262262
self.assertEqual(
263263
set(response_default.context["cl"].queryset),
264-
set([
264+
{
265265
expected_category_one_content,
266266
expected_category_two_content,
267-
])
267+
}
268268
)
269269
# show alias contents filter by category one
270270
self.assertEqual(
271271
set(category_one_filter_response.context["cl"].queryset),
272-
set([expected_category_one_content])
272+
{expected_category_one_content}
273273
)
274274
# show alias contents filter by category two
275275
self.assertEqual(
276276
set(category_two_filter_response.context["cl"].queryset),
277-
set([expected_category_two_content])
277+
{expected_category_two_content}
278278
)
279279

280280
@skipUnless(is_versioning_enabled(), 'Test only relevant when versioning enabled')
@@ -319,20 +319,20 @@ def test_category_filter_with_verisoning(self):
319319
# By default all alias contents are shown
320320
self.assertEqual(
321321
set(response_default.context["cl"].queryset),
322-
set([
322+
{
323323
expected_category_one_content,
324324
expected_category_two_content,
325-
])
325+
}
326326
)
327327
# show alias contents filter by category one
328328
self.assertEqual(
329329
set(category_one_filter_response.context["cl"].queryset),
330-
set([expected_category_one_content])
330+
{expected_category_one_content}
331331
)
332332
# show alias contents filter by category two
333333
self.assertEqual(
334334
set(category_two_filter_response.context["cl"].queryset),
335-
set([expected_category_two_content])
335+
{expected_category_two_content}
336336
)
337337

338338
def test_category_filter_lookups_ordered_alphabetical(self):

0 commit comments

Comments
 (0)