From 066d00b20b178edb942d755314d0212eb2bdec5c Mon Sep 17 00:00:00 2001 From: Dario Marcelino Date: Tue, 2 Jan 2018 19:53:41 +0000 Subject: [PATCH 1/2] Add (working) test for set_translation_url_paths command --- wagtail_modeltranslation/tests/tests.py | 88 +++++++++++++++++++++++++ 1 file changed, 88 insertions(+) diff --git a/wagtail_modeltranslation/tests/tests.py b/wagtail_modeltranslation/tests/tests.py index ef28318..75cfe74 100755 --- a/wagtail_modeltranslation/tests/tests.py +++ b/wagtail_modeltranslation/tests/tests.py @@ -814,3 +814,91 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): self.assertEqual(root_page.url, '/en/') self.assertEqual(page_01.url, '/en/url-en-01/') self.assertEqual(page_02.url, '/en/url-de-02/') + + def test_set_translation_url_paths_command(self): + """ + Assert set_translation_url_paths management command works correctly + """ + site_pages = { + 'model': models.TestRootPage, + 'kwargs': {'title': 'root untranslated', }, + 'children': { + 'child': { + 'model': models.TestSlugPage1, + 'kwargs': {'title': 'child untranslated'}, + 'children': { + 'grandchild1': { + 'model': models.TestSlugPage1, + 'kwargs': {'title': 'grandchild1 untranslated'}, + 'children': { + 'grandgrandchild': { + 'model': models.TestSlugPage1, + 'kwargs': {'title': 'grandgrandchild untranslated'}, + }, + }, + }, + 'grandchild2': { + 'model': models.TestSlugPage2, + 'kwargs': {'title': 'grandchild2 untranslated'}, + }, + }, + }, + 'child2': { + 'model': models.TestSlugPage1, + 'kwargs': {'title': 'child2 translated', 'slug_en': 'child2-translated-en'}, + 'children': { + 'grandchild1': { + 'model': models.TestSlugPage1, + 'kwargs': {'title': 'grandchild1 translated', 'slug_en': 'grandchild1-translated-en'}, + 'children': { + 'grandgrandchild': { + 'model': models.TestSlugPage1, + 'kwargs': {'title': 'grandgrandchild1 translated', + 'slug_en': 'grandgrandchild1-translated-en'}, + }, + }, + }, + }, + }, + }, + } + page_factory.create_page_tree(site_pages) + + # Revert grandchild1 and grandgrandchild url_path_en to their initial untranslated states + # to simulate pages that haven't been translated yet + models.TestSlugPage1.objects.filter(slug_de__in=['grandchild1-untranslated', 'grandgrandchild-untranslated']) \ + .rewrite(False).update(slug_en=None, url_path_en=None) + + # re-fetch to pick up latest from DB + grandchild1 = models.TestSlugPage1.objects.get(slug_de='grandchild1-untranslated') + self.assertEqual(grandchild1.url_path_en, None) + grandgrandchild = models.TestSlugPage1.objects.get(slug_de='grandgrandchild-untranslated') + self.assertEqual(grandgrandchild.url_path_en, None) + + # change grandchild2 url_path to corrupt it in order to simulate Wagtail's 0.7 corruption bug: + # http://docs.wagtail.io/en/latest/releases/0.8.html#corrupted-url-paths-may-need-fixing + models.TestSlugPage2.objects.filter(slug_de__in=['grandchild2-untranslated',]) \ + .rewrite(False).update(url_path='corrupted', url_path_de='corrupted') + + grandchild2 = models.TestSlugPage2.objects.get(slug_de='grandchild2-untranslated') + self.assertEqual(grandchild2.url_path, 'corrupted') + + call_command('set_translation_url_paths', verbosity=0) + + grandchild1 = models.TestSlugPage1.objects.get(slug_de='grandchild1-untranslated') + self.assertEqual(grandchild1.url_path_de, '/child-untranslated/grandchild1-untranslated/') + self.assertEqual(grandchild1.url_path_en, '/child-untranslated/grandchild1-untranslated/') + grandgrandchild = models.TestSlugPage1.objects.get(slug_de='grandgrandchild-untranslated') + self.assertEqual(grandgrandchild.url_path_de, + '/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/') + self.assertEqual(grandgrandchild.url_path_en, + '/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/') + grandchild2 = models.TestSlugPage2.objects.get(slug_de='grandchild2-untranslated') + self.assertEqual(grandchild2.url_path_de, '/child-untranslated/grandchild2-untranslated/') + self.assertEqual(grandchild2.url_path_en, '/child-untranslated/grandchild2-untranslated/') + + grandgrandchild_translated = models.TestSlugPage1.objects.get(slug_de='grandgrandchild1-translated') + self.assertEqual(grandgrandchild_translated.url_path_de, + '/child2-translated/grandchild1-translated/grandgrandchild1-translated/') + self.assertEqual(grandgrandchild_translated.url_path_en, + '/child2-translated-en/grandchild1-translated-en/grandgrandchild1-translated-en/') From 9e2c2358aeb962f68ddeb1f14deeee8fbd417ac5 Mon Sep 17 00:00:00 2001 From: Dario Marcelino Date: Wed, 3 Jan 2018 12:04:16 +0000 Subject: [PATCH 2/2] Remove .specific calls from set_translation_url_paths command --- .../commands/set_translation_url_paths.py | 42 ++++++++----------- wagtail_modeltranslation/tests/tests.py | 3 +- 2 files changed, 19 insertions(+), 26 deletions(-) diff --git a/wagtail_modeltranslation/management/commands/set_translation_url_paths.py b/wagtail_modeltranslation/management/commands/set_translation_url_paths.py index c6f9ac6..21720a9 100644 --- a/wagtail_modeltranslation/management/commands/set_translation_url_paths.py +++ b/wagtail_modeltranslation/management/commands/set_translation_url_paths.py @@ -1,36 +1,28 @@ # coding: utf-8 -from django.conf import settings from django.core.management.base import BaseCommand +from modeltranslation import settings as mt_settings +from modeltranslation.utils import build_localized_fieldname from wagtail.wagtailcore.models import Page +from wagtail_modeltranslation.contextlib import use_language class Command(BaseCommand): - def set_subtree(self, root, root_path, lang=None): - update_fields = ['url_path_' + lang] if hasattr(root.specific, 'url_path_' + lang) else ['url_path'] + def __init__(self): + super(Command, self).__init__() + update_fields = ['url_path'] + for language in mt_settings.AVAILABLE_LANGUAGES: + localized_url_path = build_localized_fieldname('url_path', language) + update_fields.append(localized_url_path) + self.update_fields = update_fields - if hasattr(root.specific, 'url_path_' + lang): - setattr(root.specific, 'url_path_' + lang, root_path) - else: - setattr(root, 'url_path', root_path) - - if lang == settings.LANGUAGE_CODE: - setattr(root, 'url_path', root_path) - update_fields.append('url_path') - root.specific.save(update_fields=update_fields) + def set_subtree(self, root, parent): + root.set_url_path(parent) + root.save(update_fields=self.update_fields) for child in root.get_children(): - slug = getattr( - child.specific, 'slug_' + lang) if hasattr( - child.specific, 'slug_' + lang) else getattr(child, 'slug') - if not slug or slug == '': - slug = getattr( - child.specific, 'slug_' + settings.LANGUAGE_CODE) if hasattr(child.specific, - 'slug_' + settings.LANGUAGE_CODE) and getattr( - child.specific, 'slug_' + settings.LANGUAGE_CODE) else getattr(child, 'slug') - - self.set_subtree(child, root_path + slug + '/', lang) + self.set_subtree(child, root) def handle(self, **options): - for node in Page.get_root_nodes(): - for lang in settings.LANGUAGES: - self.set_subtree(node, '/', lang=lang[0]) + with use_language(mt_settings.DEFAULT_LANGUAGE): + for node in Page.get_root_nodes(): + self.set_subtree(node, None) diff --git a/wagtail_modeltranslation/tests/tests.py b/wagtail_modeltranslation/tests/tests.py index 75cfe74..408678f 100755 --- a/wagtail_modeltranslation/tests/tests.py +++ b/wagtail_modeltranslation/tests/tests.py @@ -881,7 +881,7 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): .rewrite(False).update(url_path='corrupted', url_path_de='corrupted') grandchild2 = models.TestSlugPage2.objects.get(slug_de='grandchild2-untranslated') - self.assertEqual(grandchild2.url_path, 'corrupted') + self.assertEqual(grandchild2.__dict__['url_path'], 'corrupted') call_command('set_translation_url_paths', verbosity=0) @@ -894,6 +894,7 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): self.assertEqual(grandgrandchild.url_path_en, '/child-untranslated/grandchild1-untranslated/grandgrandchild-untranslated/') grandchild2 = models.TestSlugPage2.objects.get(slug_de='grandchild2-untranslated') + self.assertEqual(grandchild2.__dict__['url_path'], '/child-untranslated/grandchild2-untranslated/') self.assertEqual(grandchild2.url_path_de, '/child-untranslated/grandchild2-untranslated/') self.assertEqual(grandchild2.url_path_en, '/child-untranslated/grandchild2-untranslated/')