Skip to content

Commit 7560fe4

Browse files
author
Vanessa Bedzra
committed
Address PR comments and implement suggestion and added testcase
1 parent 54272ce commit 7560fe4

File tree

2 files changed

+95
-77
lines changed

2 files changed

+95
-77
lines changed

djangocms_versioning/cms_toolbars.py

Lines changed: 67 additions & 77 deletions
Original file line numberDiff line numberDiff line change
@@ -345,80 +345,74 @@ def change_language_menu(self):
345345
else:
346346
can_change = False
347347

348-
if can_change:
349-
language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
350-
if not language_menu:
351-
return None
352-
353-
languages = get_language_dict(self.current_site.pk)
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]
356-
copy = [
357-
(code, name) for code, name in languages.items() if code != self.current_lang and (code, name) in remove
358-
]
359-
360-
if add:
361-
language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK)
362-
363-
add_plugins_menu = language_menu.get_or_create_menu(
364-
f"{LANGUAGE_MENU_IDENTIFIER}-add", _("Add Translation")
365-
)
366-
367-
page_add_url = admin_reverse("cms_pagecontent_add")
368-
369-
for code, name in add:
370-
url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code)
371-
add_plugins_menu.add_modal_item(name, url=url)
372-
373-
if remove and ALLOW_DELETING_VERSIONS and CMS_SUPPORTS_DELETING_TRANSLATIONS:
374-
remove_plugins_menu = language_menu.get_or_create_menu(
375-
f"{LANGUAGE_MENU_IDENTIFIER}-del", _("Delete Translation")
376-
)
377-
disabled = len(remove) == 1
378-
for code, name in remove:
379-
pagecontent = self.page.get_admin_content(language=code)
380-
if pagecontent:
381-
translation_delete_url = admin_reverse("cms_pagecontent_delete", args=(pagecontent.pk,))
382-
url = add_url_parameters(translation_delete_url, language=code)
383-
on_close = REFRESH_PAGE
384-
if self.toolbar.get_object() == pagecontent and not disabled:
385-
other_content = next(
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-
)
393-
on_close = get_object_preview_url(other_content)
394-
remove_plugins_menu.add_modal_item(name, url=url, disabled=disabled, on_close=on_close)
395-
396-
if copy:
397-
copy_plugins_menu = language_menu.get_or_create_menu(
398-
f"{LANGUAGE_MENU_IDENTIFIER}-copy", _("Copy all plugins")
399-
)
400-
title = _("from %s")
401-
question = _("Are you sure you want to copy all plugins from %s?")
402-
item_added = False
403-
for code, name in copy:
404-
# Get the Draft or Published PageContent.
405-
page_content = self.page.get_admin_content(language=code)
406-
if page_content: # Only offer to copy if content for source language exists
407-
page_copy_url = admin_reverse("cms_pagecontent_copy_language", args=(page_content.pk,))
408-
copy_plugins_menu.add_ajax_item(
409-
title % name,
410-
action=page_copy_url,
411-
data={"source_language": code, "target_language": self.current_lang},
412-
question=question % name,
413-
on_success=self.toolbar.REFRESH_PAGE,
414-
)
415-
item_added = True
416-
if not item_added: # pragma: no cover
417-
copy_plugins_menu.add_link_item(
418-
_("No other language available"),
419-
url="#",
420-
disabled=True,
348+
language_menu = self.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
349+
if not language_menu:
350+
return None
351+
352+
languages = get_language_dict(self.current_site.pk)
353+
remove = [(code, languages.get(code, code)) for code in self.page.get_languages() if code in languages]
354+
add = [code for code in languages.items() if code not in remove]
355+
copy = [
356+
(code, name) for code, name in languages.items() if code != self.current_lang and (code, name) in remove
357+
]
358+
if add:
359+
language_menu.add_break(ADD_PAGE_LANGUAGE_BREAK)
360+
361+
add_plugins_menu = language_menu.get_or_create_menu(f"{LANGUAGE_MENU_IDENTIFIER}-add", _("Add Translation"))
362+
363+
page_add_url = admin_reverse("cms_pagecontent_add")
364+
365+
for code, name in add:
366+
url = add_url_parameters(page_add_url, cms_page=self.page.pk, language=code)
367+
add_plugins_menu.add_modal_item(name, url=url)
368+
if remove and ALLOW_DELETING_VERSIONS and CMS_SUPPORTS_DELETING_TRANSLATIONS: # fabian why?
369+
remove_plugins_menu = language_menu.get_or_create_menu(
370+
f"{LANGUAGE_MENU_IDENTIFIER}-del", _("Delete Translation")
371+
)
372+
disabled = len(remove) == 1
373+
for code, name in remove:
374+
pagecontent = self.page.get_admin_content(language=code)
375+
if pagecontent:
376+
translation_delete_url = admin_reverse("cms_pagecontent_delete", args=(pagecontent.pk,))
377+
url = add_url_parameters(translation_delete_url, language=code)
378+
on_close = REFRESH_PAGE
379+
if self.toolbar.get_object() == pagecontent and not disabled:
380+
other_content = next(
381+
(
382+
self.page.get_admin_content(lang)
383+
for lang in self.page.get_languages()
384+
if lang != pagecontent.language and lang in languages
385+
),
386+
None,
421387
)
388+
on_close = get_object_preview_url(other_content)
389+
remove_plugins_menu.add_modal_item(name, url=url, disabled=disabled, on_close=on_close)
390+
if can_change and copy:
391+
copy_plugins_menu = language_menu.get_or_create_menu(
392+
f"{LANGUAGE_MENU_IDENTIFIER}-copy", _("Copy all plugins")
393+
)
394+
title = _("from %s")
395+
question = _("Are you sure you want to copy all plugins from %s?")
396+
item_added = False
397+
for code, name in copy:
398+
# Get the Draft or Published PageContent.
399+
page_content = self.page.get_admin_content(language=code)
400+
if page_content: # Only offer to copy if content for source language exists
401+
page_copy_url = admin_reverse("cms_pagecontent_copy_language", args=(page_content.pk,))
402+
copy_plugins_menu.add_ajax_item(
403+
title % name,
404+
action=page_copy_url,
405+
data={"source_language": code, "target_language": self.current_lang},
406+
question=question % name,
407+
on_success=self.toolbar.REFRESH_PAGE,
408+
)
409+
item_added = True
410+
if not item_added: # pragma: no cover
411+
copy_plugins_menu.add_link_item(
412+
_("No other language available"),
413+
url="#",
414+
disabled=True,
415+
)
422416

423417

424418
class VersioningBasicToolbar(BasicToolbar):
@@ -434,13 +428,9 @@ def add_language_menu(self):
434428
return
435429

436430
languages = get_language_tuple(self.current_site.pk)
437-
page_languages = self.request.current_page.get_languages()
438431
if len(languages) < 2:
439432
return # No need to show the language menu if there is only one language
440433

441-
if len(page_languages) < 2:
442-
return # No need to show language menu if current page has one language
443-
444434
language_menu = self.toolbar.get_or_create_menu(LANGUAGE_MENU_IDENTIFIER, _("Languages"), position=-1)
445435
for code, name in languages:
446436
# Get the page content, it could be draft too!

tests/test_toolbars.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from django.contrib.auth.models import Permission
1111
from django.test import override_settings
1212
from django.utils.text import slugify
13+
from djangocms_versioning import cms_toolbars
1314
from packaging.version import Version
1415

1516
from djangocms_versioning.cms_config import VersioningCMSConfig
@@ -528,6 +529,33 @@ def test_change_language_menu_page_toolbar(self):
528529
lang_code = "fr" if "Française" in item.name else "it"
529530
self.assertIn(f"language={lang_code}", item.url)
530531

532+
@patch("cms_toolbars.ALLOW_DELETING_VERSIONS", True)
533+
@patch("cms_toolbars.CMS_SUPPORTS_DELETING_TRANSLATIONS", True)
534+
def test_language_menu_in_non_edit_mode(self):
535+
version = PageVersionFactory(content__language="en")
536+
PageContentWithVersionFactory(page=version.content.page, language="de")
537+
PageContentWithVersionFactory(page=version.content.page, language="it")
538+
page = version.content.page
539+
page.update_languages(["en", "de", "it"])
540+
541+
request = self.get_page_request(
542+
page=page,
543+
path=get_object_preview_url(version.content),
544+
user=self.get_superuser(),
545+
)
546+
request.toolbar.set_object(version.content)
547+
request.toolbar.populate()
548+
request.toolbar.post_template_populate()
549+
550+
language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER)
551+
# 3 out of 4 populated languages, Break, Add Translation menu, Delete Translation
552+
self.assertEqual(language_menu.get_item_count(), 6)
553+
554+
language_menu_dict = {menu.name: list(menu.items) for key, menu in language_menu.menus.items()}
555+
self.assertIn("Add Translation", language_menu_dict.keys())
556+
self.assertNotIn("Copy all plugins", language_menu_dict.keys())
557+
self.assertIn("Delete Translation", language_menu_dict.keys())
558+
531559
@skipIf(cms_version <= Version("4.1.4"), "For CMS 4.1.5 and bove: Add delete translation menu")
532560
def test_change_language_menu_page_toolbar_including_delete(self):
533561
"""Check that patched PageToolbar.change_language_menu also provides

0 commit comments

Comments
 (0)