mirror of
https://github.com/Hopiu/django-modeltranslation.git
synced 2026-05-20 02:11:54 +00:00
Some cleanups and validated codebase against PEP8 and coding guidelines.
This commit is contained in:
parent
1c8e82890d
commit
6f7704bc57
6 changed files with 64 additions and 61 deletions
|
|
@ -142,7 +142,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin):
|
|||
if exclude_languages is None:
|
||||
exclude_languages = []
|
||||
if exclude_languages:
|
||||
excl_languages = exclude_languages
|
||||
excl_languages = exclude_languages
|
||||
else:
|
||||
for lang in self.exclude_languages:
|
||||
# TODO: Not a good place for validation.
|
||||
|
|
@ -177,7 +177,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin):
|
|||
exclude_fields = tuple(self.exclude) + tuple(exclude_fields)
|
||||
if exclude_fields:
|
||||
kwargs.update({'exclude': getattr(
|
||||
kwargs, 'exclude', tuple()) + exclude_fields,})
|
||||
kwargs, 'exclude', tuple()) + exclude_fields})
|
||||
if kwargs.get('exclude_languages'):
|
||||
del kwargs['exclude_languages']
|
||||
return kwargs
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ def create_translation_field(model, field_name, lang):
|
|||
field = model._meta.get_field(field_name)
|
||||
cls_name = field.__class__.__name__
|
||||
# No subclass required for text-like fields
|
||||
if not (isinstance(field, (CharField, TextField)) or\
|
||||
if not (isinstance(field, (CharField, TextField)) or
|
||||
cls_name in CUSTOM_FIELDS):
|
||||
raise ImproperlyConfigured('%s is not supported by '
|
||||
'modeltranslation.' % cls_name)
|
||||
|
|
@ -60,7 +60,9 @@ class TranslationField(Field):
|
|||
self._post_init(translated_field, language)
|
||||
|
||||
def _post_init(self, translated_field, language):
|
||||
"""Common init for subclasses of TranslationField."""
|
||||
"""
|
||||
Common init for subclasses of TranslationField.
|
||||
"""
|
||||
# Store the originally wrapped field for later
|
||||
self.translated_field = translated_field
|
||||
self.language = language
|
||||
|
|
@ -77,8 +79,8 @@ class TranslationField(Field):
|
|||
|
||||
# Copy the verbose name and append a language suffix
|
||||
# (will show up e.g. in the admin).
|
||||
self.verbose_name =\
|
||||
build_localized_verbose_name(translated_field.verbose_name, language)
|
||||
self.verbose_name = build_localized_verbose_name(
|
||||
translated_field.verbose_name, language)
|
||||
|
||||
def pre_save(self, model_instance, add):
|
||||
val = super(TranslationField, self).pre_save(model_instance, add)
|
||||
|
|
@ -103,7 +105,9 @@ class TranslationField(Field):
|
|||
return self.translated_field.get_internal_type()
|
||||
|
||||
def south_field_triple(self):
|
||||
"""Returns a suitable description of this field for South."""
|
||||
"""
|
||||
Returns a suitable description of this field for South.
|
||||
"""
|
||||
# We'll just introspect the _actual_ field.
|
||||
from south.modelsinspector import introspector
|
||||
field_class = '%s.%s' % (self.translated_field.__class__.__module__,
|
||||
|
|
@ -113,7 +117,9 @@ class TranslationField(Field):
|
|||
return (field_class, args, kwargs)
|
||||
|
||||
def formfield(self, *args, **kwargs):
|
||||
"""Preserves the widget of the translated field."""
|
||||
"""
|
||||
Preserves the widget of the translated field.
|
||||
"""
|
||||
trans_formfield = self.translated_field.formfield(*args, **kwargs)
|
||||
defaults = {'widget': type(trans_formfield.widget)}
|
||||
defaults.update(kwargs)
|
||||
|
|
@ -121,8 +127,10 @@ class TranslationField(Field):
|
|||
|
||||
|
||||
class TranslationFieldDescriptor(object):
|
||||
"""A descriptor used for the original translated field."""
|
||||
def __init__(self, name, initial_val="", fallback_value=None):
|
||||
"""
|
||||
A descriptor used for the original translated field.
|
||||
"""
|
||||
def __init__(self, name, initial_val='', fallback_value=None):
|
||||
"""
|
||||
The ``name`` is the name of the field (which is not available in the
|
||||
descriptor by default - this is Python behaviour).
|
||||
|
|
@ -144,8 +152,8 @@ class TranslationFieldDescriptor(object):
|
|||
if not instance:
|
||||
raise ValueError(u"Translation field '%s' can only be accessed "
|
||||
"via an instance not via a class." % self.name)
|
||||
loc_field_name = build_localized_fieldname(self.name,
|
||||
get_language())
|
||||
loc_field_name = build_localized_fieldname(
|
||||
self.name, get_language())
|
||||
if hasattr(instance, loc_field_name):
|
||||
if getattr(instance, loc_field_name):
|
||||
return getattr(instance, loc_field_name)
|
||||
|
|
|
|||
|
|
@ -10,18 +10,18 @@ from modeltranslation.utils import build_localized_fieldname
|
|||
|
||||
|
||||
class Command(NoArgsCommand):
|
||||
help = 'Updates the default translation fields of all or the specified'\
|
||||
'translated application using the value of the original field.'
|
||||
help = ('Updates the default translation fields of all or the specified'
|
||||
'translated application using the value of the original field.')
|
||||
|
||||
def handle(self, **options):
|
||||
print "Using default language:", DEFAULT_LANGUAGE
|
||||
for model, trans_opts in translator._registry.items():
|
||||
print "Updating data of model '%s'" % model
|
||||
for fieldname in trans_opts.fields:
|
||||
def_lang_fieldname =\
|
||||
build_localized_fieldname(fieldname, DEFAULT_LANGUAGE)
|
||||
|
||||
# We'll only update fields which do not have an existing value:
|
||||
model.objects.filter(Q(**{def_lang_fieldname: None}) |\
|
||||
Q(**{def_lang_fieldname: ""})).update(\
|
||||
**{def_lang_fieldname: F(fieldname)})
|
||||
def_lang_fieldname = build_localized_fieldname(
|
||||
fieldname, DEFAULT_LANGUAGE)
|
||||
# We'll only update fields which do not have an existing value
|
||||
model.objects.filter(
|
||||
Q(**{def_lang_fieldname: None}) |
|
||||
Q(**{def_lang_fieldname: ""})).update(
|
||||
**{def_lang_fieldname: F(fieldname)})
|
||||
|
|
|
|||
|
|
@ -7,16 +7,16 @@ from django.core.exceptions import ImproperlyConfigured
|
|||
|
||||
|
||||
if hasattr(settings, 'MODELTRANSLATION_TRANSLATION_REGISTRY'):
|
||||
TRANSLATION_REGISTRY =\
|
||||
getattr(settings, 'MODELTRANSLATION_TRANSLATION_REGISTRY', None)
|
||||
TRANSLATION_REGISTRY = getattr(
|
||||
settings, 'MODELTRANSLATION_TRANSLATION_REGISTRY', None)
|
||||
elif hasattr(settings, 'TRANSLATION_REGISTRY'):
|
||||
warn('The setting TRANSLATION_REGISTRY is deprecated, use '
|
||||
'MODELTRANSLATION_TRANSLATION_REGISTRY instead.', DeprecationWarning)
|
||||
TRANSLATION_REGISTRY = getattr(settings, 'TRANSLATION_REGISTRY', None)
|
||||
else:
|
||||
raise ImproperlyConfigured("You haven't set the "
|
||||
"MODELTRANSLATION_TRANSLATION_REGISTRY "
|
||||
"setting yet.")
|
||||
raise ImproperlyConfigured(
|
||||
"You haven't set the MODELTRANSLATION_TRANSLATION_REGISTRY "
|
||||
"setting yet.")
|
||||
|
||||
AVAILABLE_LANGUAGES = [l[0] for l in settings.LANGUAGES]
|
||||
DEFAULT_LANGUAGE = getattr(settings, 'MODELTRANSLATION_DEFAULT_LANGUAGE', None)
|
||||
|
|
@ -27,12 +27,10 @@ elif not DEFAULT_LANGUAGE:
|
|||
DEFAULT_LANGUAGE = AVAILABLE_LANGUAGES[0]
|
||||
|
||||
# FIXME: We can't seem to override this particular setting in tests.py
|
||||
CUSTOM_FIELDS =\
|
||||
getattr(settings, 'MODELTRANSLATION_CUSTOM_FIELDS', ())
|
||||
CUSTOM_FIELDS = getattr(settings, 'MODELTRANSLATION_CUSTOM_FIELDS', ())
|
||||
try:
|
||||
if sys.argv[1] == 'test':
|
||||
CUSTOM_FIELDS =\
|
||||
getattr(settings, 'MODELTRANSLATION_CUSTOM_FIELDS',
|
||||
('BooleanField',))
|
||||
CUSTOM_FIELDS = getattr(
|
||||
settings, 'MODELTRANSLATION_CUSTOM_FIELDS', ('BooleanField',))
|
||||
except IndexError:
|
||||
pass
|
||||
|
|
|
|||
|
|
@ -45,20 +45,19 @@ def add_localized_fields(model):
|
|||
localized_fields[field_name] = list()
|
||||
for l in settings.LANGUAGES:
|
||||
# Create a dynamic translation field
|
||||
translation_field = create_translation_field(model=model,\
|
||||
field_name=field_name, lang=l[0])
|
||||
translation_field = create_translation_field(
|
||||
model=model, field_name=field_name, lang=l[0])
|
||||
# Construct the name for the localized field
|
||||
localized_field_name = build_localized_fieldname(field_name, l[0])
|
||||
# Check if the model already has a field by that name
|
||||
if hasattr(model, localized_field_name):
|
||||
raise ValueError("Error adding translation field. Model '%s' "
|
||||
"already contains a field named '%s'." %\
|
||||
(instance.__class__.__name__,
|
||||
localized_field_name))
|
||||
raise ValueError(
|
||||
"Error adding translation field. Model '%s' already "
|
||||
"contains a field named '%s'." % (
|
||||
instance.__class__.__name__, localized_field_name))
|
||||
# This approach implements the translation fields as full valid
|
||||
# django model fields and therefore adds them via add_to_class
|
||||
localized_field = model.add_to_class(localized_field_name,
|
||||
translation_field)
|
||||
model.add_to_class(localized_field_name, translation_field)
|
||||
localized_fields[field_name].append(localized_field_name)
|
||||
return localized_fields
|
||||
|
||||
|
|
@ -115,10 +114,10 @@ class Translator(object):
|
|||
AlreadyRegistered.
|
||||
"""
|
||||
# Don't import the humongous validation code unless required
|
||||
if translation_opts and settings.DEBUG:
|
||||
from django.contrib.admin.validation import validate
|
||||
else:
|
||||
validate = lambda model, adminclass: None
|
||||
#if translation_opts and settings.DEBUG:
|
||||
#from django.contrib.admin.validation import validate
|
||||
#else:
|
||||
#validate = lambda model, adminclass: None
|
||||
|
||||
#if not translation_opts:
|
||||
#translation_opts = TranslationOptions
|
||||
|
|
@ -137,8 +136,8 @@ class Translator(object):
|
|||
# the created class appears to "live" in the wrong place,
|
||||
# which causes issues later on.
|
||||
options['__module__'] = __name__
|
||||
translation_opts = type("%sAdmin" % model.__name__,
|
||||
(translation_opts,), options)
|
||||
translation_opts = type(
|
||||
"%sAdmin" % model.__name__, (translation_opts,), options)
|
||||
|
||||
# Validate (which might be a no-op)
|
||||
#validate(translation_opts, model)
|
||||
|
|
@ -146,11 +145,6 @@ class Translator(object):
|
|||
# Store the translation class associated to the model
|
||||
self._registry[model] = translation_opts
|
||||
|
||||
# Get the content type of the original model and store it on the
|
||||
# translation options for faster lookup later on.
|
||||
#translation_opts.model_ct = \
|
||||
#ContentType.objects.get_for_model(model)
|
||||
|
||||
# Add the localized fields to the model and store the names of
|
||||
# these fields in the model's translation options for faster lookup
|
||||
# later on.
|
||||
|
|
@ -159,7 +153,7 @@ class Translator(object):
|
|||
# Create a reverse dict mapping the localized_fieldnames to the
|
||||
# original fieldname
|
||||
rev_dict = dict()
|
||||
for orig_name, loc_names in\
|
||||
for orig_name, loc_names in \
|
||||
translation_opts.localized_fieldnames.items():
|
||||
for ln in loc_names:
|
||||
rev_dict[ln] = orig_name
|
||||
|
|
@ -169,18 +163,18 @@ class Translator(object):
|
|||
for related_obj in model._meta.get_all_related_objects():
|
||||
delete_cache_fields(related_obj.model)
|
||||
|
||||
model_fallback_values =\
|
||||
getattr(translation_opts, 'fallback_values', None)
|
||||
model_fallback_values = getattr(
|
||||
translation_opts, 'fallback_values', None)
|
||||
for field_name in translation_opts.fields:
|
||||
if model_fallback_values is None:
|
||||
field_fallback_value = None
|
||||
elif isinstance(model_fallback_values, dict):
|
||||
field_fallback_value =\
|
||||
model_fallback_values.get(field_name, None)
|
||||
field_fallback_value = model_fallback_values.get(
|
||||
field_name, None)
|
||||
else:
|
||||
field_fallback_value = model_fallback_values
|
||||
setattr(model, field_name, TranslationFieldDescriptor(field_name,\
|
||||
fallback_value=field_fallback_value))
|
||||
setattr(model, field_name, TranslationFieldDescriptor(
|
||||
field_name, fallback_value=field_fallback_value))
|
||||
|
||||
#signals.pre_init.connect(translated_model_initializing, sender=model,
|
||||
#weak=False)
|
||||
|
|
@ -227,10 +221,11 @@ class Translator(object):
|
|||
'__module__': __name__,
|
||||
'fields': tuple(fields),
|
||||
'localized_fieldnames': localized_fieldnames,
|
||||
'localized_fieldnames_rev': localized_fieldnames_rev,
|
||||
'localized_fieldnames_rev': localized_fieldnames_rev
|
||||
}
|
||||
translation_opts = type("%sTranslation" % model.__name__,
|
||||
(TranslationOptions,), options)
|
||||
translation_opts = type(
|
||||
"%sTranslation" % model.__name__,
|
||||
(TranslationOptions,), options)
|
||||
# delete_cache_fields(model)
|
||||
return translation_opts
|
||||
raise NotRegistered('The model "%s" is not registered for '
|
||||
|
|
|
|||
|
|
@ -19,7 +19,9 @@ def get_language():
|
|||
|
||||
|
||||
def get_translation_fields(field):
|
||||
"""Returns a list of localized fieldnames for a given field."""
|
||||
"""
|
||||
Returns a list of localized fieldnames for a given field.
|
||||
"""
|
||||
return [build_localized_fieldname(field, l) for l in AVAILABLE_LANGUAGES]
|
||||
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue