diff --git a/runtests.py b/runtests.py index e374ca3..6831e31 100755 --- a/runtests.py +++ b/runtests.py @@ -61,6 +61,7 @@ def runtests(): ('en', 'English'), ), MIDDLEWARE_CLASSES=(), + WAGTAILMODELTRANSLATION_ORIGINAL_SLUG_LANGUAGE='default', ) if django.VERSION >= (1, 7): diff --git a/wagtail_modeltranslation/patch_wagtailadmin.py b/wagtail_modeltranslation/patch_wagtailadmin.py index fbb6eb7..bcd611d 100644 --- a/wagtail_modeltranslation/patch_wagtailadmin.py +++ b/wagtail_modeltranslation/patch_wagtailadmin.py @@ -2,7 +2,7 @@ import copy import logging -from django.core.exceptions import ValidationError +from django.core.exceptions import ValidationError, FieldDoesNotExist from django.core.urlresolvers import reverse from django.db import transaction from django.http import Http404 @@ -23,7 +23,7 @@ from wagtail.wagtailsearch.index import SearchField from wagtail.wagtailsnippets.models import get_snippet_models from wagtail.wagtailsnippets.views.snippets import SNIPPET_EDIT_HANDLERS -from wagtail_modeltranslation.settings import CUSTOM_SIMPLE_PANELS, CUSTOM_COMPOSED_PANELS +from wagtail_modeltranslation.settings import CUSTOM_SIMPLE_PANELS, CUSTOM_COMPOSED_PANELS, ORIGINAL_SLUG_LANGUAGE from wagtail_modeltranslation.utils import compare_class_tree_depth logger = logging.getLogger('wagtail.core') @@ -88,8 +88,15 @@ class WagtailTranslator(object): translated_field.field_name = build_localized_fieldname(field.field_name, language) model.search_fields = list(model.search_fields) + [translated_field] - # OVERRIDE PAGE METHODS + # SLUG FIELD PATCHING + try: + slug_field = model._meta.get_field('slug') + _patch_pre_save(slug_field) + except FieldDoesNotExist: + pass + + # OVERRIDE PAGE METHODS model.move = _new_move model.set_url_path = _new_set_url_path model.route = _new_route @@ -201,7 +208,6 @@ class WagtailTranslator(object): # patched, leaving the original untouched return panel - # Overridden Page methods adapted to the translated fields @transaction.atomic # only commit when all descendants are properly updated @@ -403,6 +409,30 @@ def _patch_clean(model): model.clean = clean +def _patch_pre_save(field): + if not ORIGINAL_SLUG_LANGUAGE: + return + + if ORIGINAL_SLUG_LANGUAGE == 'default': + reference_slug_language = mt_settings.DEFAULT_LANGUAGE + else: + reference_slug_language = ORIGINAL_SLUG_LANGUAGE + + def pre_save(self, model_instance, add): + """ + Returns slug field's value using the language set by `WAGTAILMODELTRANSLATION_ORIGINAL_SLUG_LANGUAGE` + just before saving. + """ + current_language = get_language() + # using ORIGINAL_SLUG_LANGUAGE makes Page's slug value consistent + trans_real.activate(reference_slug_language) + value = getattr(model_instance, self.attname) + trans_real.activate(current_language) + return value + + field.pre_save = pre_save.__get__(field) + + def patch_wagtail_models(): # After all models being registered the Page or BaseSetting subclasses and snippets are patched registered_models = translator.get_registered_models() diff --git a/wagtail_modeltranslation/settings.py b/wagtail_modeltranslation/settings.py index c3eadf8..370d156 100644 --- a/wagtail_modeltranslation/settings.py +++ b/wagtail_modeltranslation/settings.py @@ -10,3 +10,5 @@ CUSTOM_SIMPLE_PANELS = [import_from_string(panel_class) for panel_class in getattr(settings, 'WAGTAILMODELTRANSLATION_CUSTOM_SIMPLE_PANELS', [])] CUSTOM_COMPOSED_PANELS = [import_from_string(panel_class) for panel_class in getattr(settings, 'WAGTAILMODELTRANSLATION_CUSTOM_COMPOSED_PANELS', [])] + +ORIGINAL_SLUG_LANGUAGE = getattr(settings, 'WAGTAILMODELTRANSLATION_ORIGINAL_SLUG_LANGUAGE', None)