|
| 1 | +import re |
| 2 | +from unittest import skipIf |
| 3 | +from unittest.mock import patch |
| 4 | + |
| 5 | +from cms import __version__ |
1 | 6 | from cms.cms_toolbars import LANGUAGE_MENU_IDENTIFIER, PlaceholderToolbar |
2 | 7 | from cms.test_utils.testcases import CMSTestCase |
3 | 8 | from cms.toolbar.utils import get_object_edit_url, get_object_preview_url |
4 | 9 | from cms.utils.urlutils import admin_reverse |
5 | 10 | from django.contrib.auth.models import Permission |
6 | 11 | from django.utils.text import slugify |
| 12 | +from packaging.version import Version |
7 | 13 |
|
8 | 14 | from djangocms_versioning.cms_config import VersioningCMSConfig |
9 | 15 | from djangocms_versioning.cms_toolbars import VersioningPageToolbar |
|
26 | 32 | toolbar_button_exists, |
27 | 33 | ) |
28 | 34 |
|
| 35 | +cms_version = Version(__version__) |
| 36 | + |
29 | 37 |
|
30 | 38 | class VersioningToolbarTestCase(CMSTestCase): |
31 | 39 | def _get_publish_url(self, version, versionable=PollsCMSConfig.versioning[0]): |
@@ -488,7 +496,7 @@ def _get_toolbar_item_by_name(self, menu, name): |
488 | 496 |
|
489 | 497 | def test_change_language_menu_page_toolbar(self): |
490 | 498 | """Check that patched PageToolbar.change_language_menu only provides |
491 | | - Add Translation links. |
| 499 | + Add Translation links if DJANGOCMS_ALLOW_DELETING_VERSIONS is False. |
492 | 500 | """ |
493 | 501 | version = PageVersionFactory(content__language="en") |
494 | 502 | PageContentWithVersionFactory(page=version.content.page, language="de") |
@@ -533,6 +541,73 @@ def test_change_language_menu_page_toolbar(self): |
533 | 541 | lang_code = "fr" if "Française" in item.name else "it" |
534 | 542 | self.assertIn(f"language={lang_code}", item.url) |
535 | 543 |
|
| 544 | + @skipIf(cms_version <= Version("4.1.4"), "For CMS 4.1.5 and bove: Add delete translation menu") |
| 545 | + def test_change_language_menu_page_toolbar_including_delete(self): |
| 546 | + """Check that patched PageToolbar.change_language_menu also provides |
| 547 | + Delete Translation links if DJANGOCMS_ALLOW_DELETING_VERSIONS is True. |
| 548 | + """ |
| 549 | + from djangocms_versioning import cms_toolbars |
| 550 | + |
| 551 | + with patch.object(cms_toolbars, "ALLOW_DELETING_VERSIONS", True): |
| 552 | + version = PageVersionFactory(content__language="en") |
| 553 | + PageContentWithVersionFactory(page=version.content.page, language="de") |
| 554 | + PageContentWithVersionFactory(page=version.content.page, language="it") |
| 555 | + page = version.content.page |
| 556 | + page.update_languages(["en", "de", "it"]) |
| 557 | + |
| 558 | + request = self.get_page_request( |
| 559 | + page=page, |
| 560 | + path=get_object_edit_url(version.content), |
| 561 | + user=self.get_superuser(), |
| 562 | + ) |
| 563 | + request.toolbar.set_object(version.content) |
| 564 | + request.toolbar.populate() |
| 565 | + request.toolbar.post_template_populate() |
| 566 | + |
| 567 | + language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) |
| 568 | + # 3 out of 4 populated languages, Break, Add Translation menu, Copy all plugins |
| 569 | + self.assertEqual(language_menu.get_item_count(), 7) |
| 570 | + |
| 571 | + language_menu_dict = { |
| 572 | + menu.name: list(menu.items) |
| 573 | + for key, menu in language_menu.menus.items() |
| 574 | + } |
| 575 | + self.assertIn("Add Translation", language_menu_dict.keys()) |
| 576 | + self.assertIn("Copy all plugins", language_menu_dict.keys()) |
| 577 | + self.assertIn("Delete Translation", language_menu_dict.keys()) |
| 578 | + |
| 579 | + pattern = r"\?language=([a-z]{2})" |
| 580 | + for item in language_menu_dict["Delete Translation"]: |
| 581 | + match = re.search(pattern, item.url) # Contains "?language=<code>“? |
| 582 | + self.assertTrue(bool(match)) |
| 583 | + code = match.group(1) # Extract code |
| 584 | + pk = page.get_admin_content(code).pk # get content object |
| 585 | + self.assertIn(admin_reverse("cms_pagecontent_delete", args=(int(pk),)), item.url) # verify url |
| 586 | + |
| 587 | + @skipIf(cms_version > Version("4.1.4"), "Only for CMS 4.1.4 and below: No delete translation menu") |
| 588 | + def test_change_language_menu_page_toolbar_excluding_delete(self): |
| 589 | + from djangocms_versioning import cms_toolbars |
| 590 | + |
| 591 | + with patch.object(cms_toolbars, "ALLOW_DELETING_VERSIONS", True): |
| 592 | + version = PageVersionFactory(content__language="en") |
| 593 | + PageContentWithVersionFactory(page=version.content.page, language="de") |
| 594 | + PageContentWithVersionFactory(page=version.content.page, language="it") |
| 595 | + page = version.content.page |
| 596 | + page.update_languages(["en", "de", "it"]) |
| 597 | + |
| 598 | + request = self.get_page_request( |
| 599 | + page=page, |
| 600 | + path=get_object_edit_url(version.content), |
| 601 | + user=self.get_superuser(), |
| 602 | + ) |
| 603 | + request.toolbar.set_object(version.content) |
| 604 | + request.toolbar.populate() |
| 605 | + request.toolbar.post_template_populate() |
| 606 | + |
| 607 | + language_menu = request.toolbar.get_menu(LANGUAGE_MENU_IDENTIFIER) |
| 608 | + # 3 out of 4 populated languages, Break, Add Translation menu, Copy all plugins |
| 609 | + self.assertEqual(language_menu.get_item_count(), 6) |
| 610 | + |
536 | 611 | def test_change_language_menu_page_toolbar_language_selector_version_link(self): |
537 | 612 | """ |
538 | 613 | Ensure that the correct version is navigated to in the language selector. |
|
0 commit comments