From 1e03faf76e25553734e10464e63802a6e1891e5c Mon Sep 17 00:00:00 2001 From: Dario Marcelino Date: Tue, 12 Dec 2017 20:19:17 +0000 Subject: [PATCH 1/2] #143: adds failing tests for StreamField fallback --- wagtail_modeltranslation/tests/settings.py | 2 +- wagtail_modeltranslation/tests/tests.py | 13 +++++++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/wagtail_modeltranslation/tests/settings.py b/wagtail_modeltranslation/tests/settings.py index 4d5caa7..0c50767 100755 --- a/wagtail_modeltranslation/tests/settings.py +++ b/wagtail_modeltranslation/tests/settings.py @@ -18,6 +18,6 @@ USE_TZ = False MIDDLEWARE_CLASSES = () MODELTRANSLATION_AUTO_POPULATE = False -MODELTRANSLATION_FALLBACK_LANGUAGES = () +MODELTRANSLATION_FALLBACK_LANGUAGES = {'default': (MODELTRANSLATION_DEFAULT_LANGUAGE,)} ROOT_URLCONF = 'wagtail_modeltranslation.tests.urls' diff --git a/wagtail_modeltranslation/tests/tests.py b/wagtail_modeltranslation/tests/tests.py index e037770..4beb17d 100755 --- a/wagtail_modeltranslation/tests/tests.py +++ b/wagtail_modeltranslation/tests/tests.py @@ -348,3 +348,16 @@ class WagtailModeltranslationTest(WagtailModeltranslationTestBase): except AttributeError: # python 2.7 self.assertItemsEqual(expected_fields, model_search_fields) + + def test_streamfield_fallback(self): + body_text = '[{"value": "Some text", "type": "text"}]' + page = models.StreamFieldPanelPage(title='Streamfield Fallback', slug='streamfield_fallback', + depth=1, path='0005', body=body_text) + page.save() + + self.assertEqual(str(page.body), '
Some text
') + + trans_real.activate('en') + + self.assertEqual(str(page.body), '
Some text
', + 'page.body did not fallback to original language.') From 1f36b55f0c5e95945b4ae4136035d53681cfe147 Mon Sep 17 00:00:00 2001 From: Dario Marcelino Date: Tue, 12 Dec 2017 20:21:07 +0000 Subject: [PATCH 2/2] #143: Fixes StreamField fallback behaviour --- .../patch_wagtailadmin.py | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/wagtail_modeltranslation/patch_wagtailadmin.py b/wagtail_modeltranslation/patch_wagtailadmin.py index fbb6eb7..c6d5377 100644 --- a/wagtail_modeltranslation/patch_wagtailadmin.py +++ b/wagtail_modeltranslation/patch_wagtailadmin.py @@ -17,6 +17,7 @@ from wagtail.contrib.wagtailroutablepage.models import RoutablePageMixin from wagtail.wagtailadmin.edit_handlers import FieldPanel, \ MultiFieldPanel, FieldRowPanel, InlinePanel, StreamFieldPanel, RichTextFieldPanel from wagtail.wagtailcore.models import Page, Site +from wagtail.wagtailcore.fields import StreamField, StreamValue from wagtail.wagtailcore.url_routing import RouteResult from wagtail.wagtailimages.edit_handlers import ImageChooserPanel from wagtail.wagtailsearch.index import SearchField @@ -88,6 +89,13 @@ class WagtailTranslator(object): translated_field.field_name = build_localized_fieldname(field.field_name, language) model.search_fields = list(model.search_fields) + [translated_field] + # OVERRIDE FIELDS + model_fields = model._meta.get_fields() + for field in model_fields: + if isinstance(field, StreamField) and field.name in translation_registered_fields: + descriptor = getattr(model, field.name) + _patch_stream_field_meaningful_value(descriptor) + # OVERRIDE PAGE METHODS model.move = _new_move @@ -402,6 +410,18 @@ def _patch_clean(model): model.clean = clean +def _patch_stream_field_meaningful_value(field): + old_meaningful_value = field.meaningful_value + + def meaningful_value(self, val, undefined): + """ + Check if val is considered non-empty. + """ + if isinstance(val, StreamValue): + return len(val.stream_data) != 0 + return old_meaningful_value(self, val, undefined) + + field.meaningful_value = meaningful_value.__get__(field) def patch_wagtail_models(): # After all models being registered the Page or BaseSetting subclasses and snippets are patched