mirror of
https://github.com/Hopiu/wagtail-modeltranslation.git
synced 2026-03-16 22:10:30 +00:00
#141: patch Slug Field pre_save() to ensure slug value consistency
This commit is contained in:
parent
271bbe513f
commit
7cf94069b6
3 changed files with 37 additions and 4 deletions
|
|
@ -61,6 +61,7 @@ def runtests():
|
|||
('en', 'English'),
|
||||
),
|
||||
MIDDLEWARE_CLASSES=(),
|
||||
WAGTAILMODELTRANSLATION_ORIGINAL_SLUG_LANGUAGE='default',
|
||||
)
|
||||
|
||||
if django.VERSION >= (1, 7):
|
||||
|
|
|
|||
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Reference in a new issue