#141: patch Slug Field pre_save() to ensure slug value consistency

This commit is contained in:
Dario Marcelino 2017-12-12 12:26:02 +00:00
parent 271bbe513f
commit 7cf94069b6
3 changed files with 37 additions and 4 deletions

View file

@ -61,6 +61,7 @@ def runtests():
('en', 'English'),
),
MIDDLEWARE_CLASSES=(),
WAGTAILMODELTRANSLATION_ORIGINAL_SLUG_LANGUAGE='default',
)
if django.VERSION >= (1, 7):

View file

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

View file

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