Merge pull request #140 from dmarcelino/patch-2

Fix update_translation_fields command
This commit is contained in:
Diogo Marques 2018-01-03 14:34:00 +00:00 committed by GitHub
commit ff8a7f7afe
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23

View file

@ -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
@ -34,44 +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):
# 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)
obj.save(update_fields=[def_lang_fieldname])
model.full_clean = original_full_clean
else:
model._default_manager.filter(q).rewrite(False).update(
**{def_lang_fieldname: F(field_name)})