Skip to content

Commit e2e5e8d

Browse files
va-langVanessa Bedzrafsbraunmarbru
authored
[BUG FIX] Language menu is showing despite only one language configured (#491)
* fix merge conflict * fix test case * fix ruff format * Address PR comments and implement suggestion and added testcase * Update PR per review * Hide language when it only has one language for users without edit permission * Revert changes in preexisting test * Update PR per comments * Update PR --------- Co-authored-by: Vanessa Bedzra <vanessa.bedzra@instantrad.com> Co-authored-by: Fabian Braun <fsbraun@gmx.de> Co-authored-by: Mar <mar@coconauts.net> Co-authored-by: Mar Bartolome <mailmarbu@gmail.com>
1 parent d90268d commit e2e5e8d

File tree

3 files changed

+100
-122
lines changed

3 files changed

+100
-122
lines changed

README.rst

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ Testing
5252

5353
To run all the tests the only thing you need to do is run::
5454

55-
pip install -r tests/requirements.txt
55+
pip install -r tests/requirements/requirements_base.txt
5656
python test_settings.py
5757

5858

djangocms_versioning/cms_toolbars.py

Lines changed: 46 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,7 @@ def _is_versioned(self):
5555
versioning
5656
"""
5757
versioning_extension = apps.get_app_config("djangocms_versioning").cms_extension
58-
return versioning_extension.is_content_model_versioned(
59-
self.toolbar.obj.__class__
60-
)
58+
return versioning_extension.is_content_model_versioned(self.toolbar.obj.__class__)
6159

6260
def _get_proxy_model(self):
6361
"""Helper method to get the proxy model class for the content
@@ -66,8 +64,7 @@ def _get_proxy_model(self):
6664
return self._get_versionable().version_model_proxy
6765

6866
def _add_publish_button(self):
69-
"""Helper method to add a publish button to the toolbar
70-
"""
67+
"""Helper method to add a publish button to the toolbar"""
7168
# Check if object is registered with versioning otherwise don't add
7269
if not self._is_versioned():
7370
return
@@ -99,8 +96,7 @@ def add_edit_button(self):
9996
self._add_unlock_button()
10097

10198
def _add_edit_button(self, disabled=False):
102-
"""Helper method to add an edit button to the toolbar
103-
"""
99+
"""Helper method to add an edit button to the toolbar"""
104100
item = ButtonList(side=self.toolbar.RIGHT)
105101
proxy_model = self._get_proxy_model()
106102
version = Version.objects.get_for_content(self.toolbar.obj)
@@ -109,9 +105,9 @@ def _add_edit_button(self, disabled=False):
109105
f"admin:{proxy_model._meta.app_label}_{proxy_model.__name__.lower()}_edit_redirect",
110106
args=(version.pk,),
111107
)
112-
pks_for_grouper = version.versionable.for_content_grouping_values(
113-
version.content
114-
).values_list("pk", flat=True)
108+
pks_for_grouper = version.versionable.for_content_grouping_values(version.content).values_list(
109+
"pk", flat=True
110+
)
115111
content_type = ContentType.objects.get_for_model(version.content)
116112
draft_exists = Version.objects.filter(
117113
object_id__in=pks_for_grouper, content_type=content_type, state=DRAFT
@@ -125,8 +121,7 @@ def _add_edit_button(self, disabled=False):
125121
self.toolbar.add_item(item)
126122

127123
def _add_unlock_button(self):
128-
"""Helper method to add an edit button to the toolbar
129-
"""
124+
"""Helper method to add an edit button to the toolbar"""
130125
if LOCK_VERSIONS and self._is_versioned():
131126
item = ButtonList(side=self.toolbar.RIGHT)
132127
proxy_model = self._get_proxy_model()
@@ -164,8 +159,7 @@ def _add_lock_message(self):
164159
self.toolbar.add_item(lock_message, position=0)
165160

166161
def _add_revert_button(self, disabled=False):
167-
"""Helper method to add a revert button to the toolbar
168-
"""
162+
"""Helper method to add a revert button to the toolbar"""
169163
# Check if object is registered with versioning otherwise don't add
170164
if not self._is_versioned():
171165
return
@@ -186,8 +180,7 @@ def _add_revert_button(self, disabled=False):
186180
self.toolbar.add_item(item)
187181

188182
def _add_versioning_menu(self):
189-
""" Helper method to add version menu in the toolbar
190-
"""
183+
"""Helper method to add version menu in the toolbar"""
191184
# Check if object is registered with versioning otherwise don't add
192185
if not self._is_versioned():
193186
return
@@ -215,13 +208,15 @@ def _add_versioning_menu(self):
215208
proxy_model = self._get_proxy_model()
216209
url = reverse(
217210
f"admin:{proxy_model._meta.app_label}_{proxy_model.__name__.lower()}_compare",
218-
args=(version.source.pk,)
211+
args=(version.source.pk,),
219212
)
220213

221-
url += "?" + urlencode({
222-
"compare_to": version.pk,
223-
"back": self.toolbar.request_path,
224-
})
214+
url += "?" + urlencode(
215+
{
216+
"compare_to": version.pk,
217+
"back": self.toolbar.request_path,
218+
}
219+
)
225220
versioning_menu.add_link_item(name, url=url)
226221
# Discard changes menu entry (wrt to source)
227222
if version.check_discard.as_bool(self.request.user): # pragma: no cover
@@ -230,26 +225,22 @@ def _add_versioning_menu(self):
230225
_("Discard Changes"),
231226
url=reverse(
232227
f"admin:{proxy_model._meta.app_label}_{proxy_model.__name__.lower()}_discard",
233-
args=(version.pk,)
234-
)
228+
args=(version.pk,),
229+
),
235230
)
236231

237232
def _get_published_page_version(self):
238-
"""Returns a published page if one exists for the toolbar object
239-
"""
233+
"""Returns a published page if one exists for the toolbar object"""
240234
language = self.current_lang
241235

242236
# Exit the current toolbar object is not a Page / PageContent instance
243237
if not isinstance(self.toolbar.obj, PageContent) or not self.page:
244238
return
245239

246-
return PageContent.objects.filter(
247-
page=self.page, language=language
248-
).select_related("page").first()
240+
return PageContent.objects.filter(page=self.page, language=language).select_related("page").first()
249241

250242
def _add_view_published_button(self):
251-
"""Helper method to add a publish button to the toolbar
252-
"""
243+
"""Helper method to add a publish button to the toolbar"""
253244
# Check if object is registered with versioning otherwise don't add
254245
if not self._is_versioned():
255246
return
@@ -347,50 +338,38 @@ def override_language_menu(self):
347338
language_menu.add_link_item(name, url=url, active=self.current_lang == code)
348339

349340
def change_language_menu(self):
350-
if self.toolbar.edit_mode_active and self.page:
351-
can_change = page_permissions.user_can_change_page(
341+
can_change = (
342+
self.page
343+
and page_permissions.user_can_change_page(
352344
user=self.request.user, page=self.page, site=self.current_site
353345
)
354-
else:
355-
can_change = False
346+
)
356347

357348
if can_change:
358349
language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
359350
if not language_menu:
360351
return None
361352

362353
languages = get_language_dict(self.current_site.pk)
363-
remove = [
364-
(code, languages.get(code, code))
365-
for code in self.page.get_languages()
366-
if code in languages
367-
]
368-
add = [
369-
code
370-
for code in languages.items()
371-
if code not in remove
372-
]
354+
remove = [(code, languages.get(code, code)) for code in self.page.get_languages() if code in languages]
355+
add = [code for code in languages.items() if code not in remove]
373356
copy = [
374-
(code, name)
375-
for code, name in languages.items()
376-
if code != self.current_lang and (code, name) in remove
357+
(code, name) for code, name in languages.items() if code != self.current_lang and (code, name) in remove
377358
]
378359

360+
# ADD TRANSLATION — only if user has change permission
379361
if add:
380362
language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK)
381363

382-
add_plugins_menu = language_menu.get_or_create_menu(
383-
f"{LANGUAGE_MENU_IDENTIFIER}-add", _("Add Translation")
384-
)
364+
add_plugins_menu = language_menu.get_or_create_menu(f"{LANGUAGE_MENU_IDENTIFIER}-add", _("Add Translation")) # noqa: E501
385365

386366
page_add_url = admin_reverse("cms_pagecontent_add")
387367

388368
for code, name in add:
389-
url = add_url_parameters(
390-
page_add_url, cms_page=self.page.pk, language=code
391-
)
369+
url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code)
392370
add_plugins_menu.add_modal_item(name, url=url)
393371

372+
# DELETE TRANSLATION — only if user has change permission
394373
if remove and ALLOW_DELETING_VERSIONS and CMS_SUPPORTS_DELETING_TRANSLATIONS:
395374
remove_plugins_menu = language_menu.get_or_create_menu(
396375
f"{LANGUAGE_MENU_IDENTIFIER}-del", _("Delete Translation")
@@ -404,12 +383,17 @@ def change_language_menu(self):
404383
on_close = REFRESH_PAGE
405384
if self.toolbar.get_object() == pagecontent and not disabled:
406385
other_content = next(
407-
(self.page.get_admin_content(lang) for lang in self.page.get_languages()
408-
if lang != pagecontent.language and lang in languages), None)
386+
(
387+
self.page.get_admin_content(lang)
388+
for lang in self.page.get_languages()
389+
if lang != pagecontent.language and lang in languages
390+
),
391+
None,
392+
)
409393
on_close = get_object_preview_url(other_content)
410394
remove_plugins_menu.add_modal_item(name, url=url, disabled=disabled, on_close=on_close)
411-
412-
if copy:
395+
# COPY ALL PLUGINS — only if user can change AND in edit mode
396+
if self.toolbar.edit_mode_active and copy:
413397
copy_plugins_menu = language_menu.get_or_create_menu(
414398
f"{LANGUAGE_MENU_IDENTIFIER}-copy", _("Copy all plugins")
415399
)
@@ -422,9 +406,11 @@ def change_language_menu(self):
422406
if page_content: # Only offer to copy if content for source language exists
423407
page_copy_url = admin_reverse("cms_pagecontent_copy_language", args=(page_content.pk,))
424408
copy_plugins_menu.add_ajax_item(
425-
title % name, action=page_copy_url,
409+
title % name,
410+
action=page_copy_url,
426411
data={"source_language": code, "target_language": self.current_lang},
427-
question=question % name, on_success=self.toolbar.REFRESH_PAGE
412+
question=question % name,
413+
on_success=self.toolbar.REFRESH_PAGE,
428414
)
429415
item_added = True
430416
if not item_added: # pragma: no cover
@@ -467,8 +453,7 @@ def replace_toolbar(old, new):
467453
new_name = ".".join((new.__module__, new.__name__))
468454
old_name = ".".join((old.__module__, old.__name__))
469455
toolbar_pool.toolbars = OrderedDict(
470-
(new_name, new) if name == old_name else (name, toolbar)
471-
for name, toolbar in toolbar_pool.toolbars.items()
456+
(new_name, new) if name == old_name else (name, toolbar) for name, toolbar in toolbar_pool.toolbars.items()
472457
)
473458

474459

0 commit comments

Comments
 (0)