From 421a52e1550a3b86f92df1d089a1ffedf0369e64 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1rio?= Date: Thu, 30 Nov 2017 14:59:03 +0000 Subject: [PATCH 1/3] #103: fix update_translation_fields command --- .../commands/update_translation_fields.py | 55 ++++++------------- 1 file changed, 18 insertions(+), 37 deletions(-) diff --git a/wagtail_modeltranslation/management/commands/update_translation_fields.py b/wagtail_modeltranslation/management/commands/update_translation_fields.py index abe091f..8123c87 100755 --- a/wagtail_modeltranslation/management/commands/update_translation_fields.py +++ b/wagtail_modeltranslation/management/commands/update_translation_fields.py @@ -1,7 +1,6 @@ # coding: utf-8 from django.core.management.base import BaseCommand -from django.db import connection from django.db.models import F, Q from modeltranslation.settings import DEFAULT_LANGUAGE from modeltranslation.translator import translator @@ -9,6 +8,16 @@ from modeltranslation.utils import build_localized_fieldname from wagtail.wagtailcore.models import Page +def is_field_from_parents(field_name, model): + for klass in model.__bases__: + if field_name in klass.__dict__: + return klass + field_klass = is_field_from_parents(field_name, klass) + if field_klass: + return field_klass + return None + + class Command(BaseCommand): help = ('Updates empty values of default translation fields using' ' values from original fields (in all translated models).') @@ -35,43 +44,15 @@ class Command(BaseCommand): if issubclass(model, Page): for obj in model._default_manager.filter(q): - # Get table description in order to know if field is - # in child or parent table - # TODO: Tested only on PostgreSQL engine - db_table = model._meta.db_table - db_table_desc = connection.introspection. \ - get_table_description( - connection.cursor(), db_table) - # original field in child class - if field_name in [x.name for x in db_table_desc]: - raw = model._default_manager.raw( - 'SELECT *, %s AS original_field FROM %s \ - WHERE page_ptr_id=%d LIMIT 1' % ( - field_name, db_table, obj.page_ptr_id))[0] - setattr( - obj, def_lang_fieldname, raw.original_field) - # field is a foreign key - elif (field_name + '_id') in \ - [x.name for x in db_table_desc]: - raw = model._default_manager.raw( - 'SELECT *, %s AS original_field FROM %s \ - WHERE page_ptr_id=%d LIMIT 1' % ( - field_name + '_id', - db_table, - obj.page_ptr_id))[0] - setattr( - obj, - def_lang_fieldname + '_id', - raw.original_field) - # original field parent class - else: - raw = Page._default_manager.raw( - 'SELECT *, %s AS original_field FROM \ - wagtailcore_page WHERE id=%d LIMIT 1' % ( - field_name, obj.page_ptr_id))[0] - setattr( - obj, def_lang_fieldname, raw.original_field) + original_field = obj.__dict__.get(field_name) # retrieve original untranslated value + setattr(obj, def_lang_fieldname, original_field) + + # patching Page.full_clean() to avoid validation errors due to slug and title absence + original_full_clean = obj.full_clean + obj.full_clean = lambda *args: None obj.save(update_fields=[def_lang_fieldname]) + + obj.full_clean = original_full_clean else: model._default_manager.filter(q).rewrite(False).update( **{def_lang_fieldname: F(field_name)}) From 86caf9a816a1d00fdbb0e432404a2eda033f28d8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1rio?= Date: Thu, 30 Nov 2017 15:16:25 +0000 Subject: [PATCH 2/3] update_translation_fields: remove unused method --- .../management/commands/update_translation_fields.py | 12 +----------- 1 file changed, 1 insertion(+), 11 deletions(-) diff --git a/wagtail_modeltranslation/management/commands/update_translation_fields.py b/wagtail_modeltranslation/management/commands/update_translation_fields.py index 8123c87..621b3c4 100755 --- a/wagtail_modeltranslation/management/commands/update_translation_fields.py +++ b/wagtail_modeltranslation/management/commands/update_translation_fields.py @@ -8,16 +8,6 @@ from modeltranslation.utils import build_localized_fieldname from wagtail.wagtailcore.models import Page -def is_field_from_parents(field_name, model): - for klass in model.__bases__: - if field_name in klass.__dict__: - return klass - field_klass = is_field_from_parents(field_name, klass) - if field_klass: - return field_klass - return None - - class Command(BaseCommand): help = ('Updates empty values of default translation fields using' ' values from original fields (in all translated models).') @@ -47,7 +37,7 @@ class Command(BaseCommand): original_field = obj.__dict__.get(field_name) # retrieve original untranslated value setattr(obj, def_lang_fieldname, original_field) - # patching Page.full_clean() to avoid validation errors due to slug and title absence + # patching Page.full_clean() to avoid validation errors due to 'slug_xx' and 'title_xx' absence original_full_clean = obj.full_clean obj.full_clean = lambda *args: None obj.save(update_fields=[def_lang_fieldname]) From 27ac5491f22c03c8a5f7b28f753795458249f909 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?D=C3=A1rio?= Date: Mon, 4 Dec 2017 14:34:04 +0000 Subject: [PATCH 3/3] update_translation_fields: patch model instead of obj --- .../management/commands/update_translation_fields.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/wagtail_modeltranslation/management/commands/update_translation_fields.py b/wagtail_modeltranslation/management/commands/update_translation_fields.py index 621b3c4..0914a00 100755 --- a/wagtail_modeltranslation/management/commands/update_translation_fields.py +++ b/wagtail_modeltranslation/management/commands/update_translation_fields.py @@ -33,16 +33,16 @@ class Command(BaseCommand): q |= Q(**{def_lang_fieldname: ''}) if issubclass(model, Page): + # patching Page.full_clean() to avoid validation errors due to 'slug_xx' and 'title_xx' absences + original_full_clean = model.full_clean + model.full_clean = lambda *args: None + for obj in model._default_manager.filter(q): original_field = obj.__dict__.get(field_name) # retrieve original untranslated value setattr(obj, def_lang_fieldname, original_field) - - # patching Page.full_clean() to avoid validation errors due to 'slug_xx' and 'title_xx' absence - original_full_clean = obj.full_clean - obj.full_clean = lambda *args: None obj.save(update_fields=[def_lang_fieldname]) - obj.full_clean = original_full_clean + model.full_clean = original_full_clean else: model._default_manager.filter(q).rewrite(False).update( **{def_lang_fieldname: F(field_name)})