Merge pull request #155 from dmarcelino/set_translation_url_paths

Remove .specific calls from set_translation_url_paths command
This commit is contained in:
Dário 2018-01-03 12:22:21 +00:00 committed by GitHub
commit fd1cbe2432
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 106 additions and 25 deletions

View file

@ -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)

View file

@ -814,3 +814,92 @@ 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.__dict__['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.__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/')
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/')