mirror of
https://github.com/Hopiu/django-modeltranslation.git
synced 2026-04-10 00:20:59 +00:00
- Validated codebase against pep8 and pyflakes.
- Fixed an undefined name bug in add_localized_fields error message when a model already has a field by the name that is added. - Fixed redefined method name in ModeltranslationWithFileFields test class.
This commit is contained in:
parent
cda6ae19c8
commit
3acfa09dbc
9 changed files with 72 additions and 69 deletions
|
|
@ -46,10 +46,10 @@ def autodiscover():
|
|||
if sys.argv[1] in ('runserver', 'runserver_plus'):
|
||||
translated_model_names = ', '.join(
|
||||
t.__name__ for t in translator._registry.keys())
|
||||
print('modeltranslation: Registered %d models for '
|
||||
'translation (%s) [pid:%d].' % (
|
||||
len(translator._registry), translated_model_names,
|
||||
os.getpid()))
|
||||
print('modeltranslation: Registered %d models for translation '
|
||||
'(%s) [pid:%d].' % (
|
||||
len(translator._registry), translated_model_names,
|
||||
os.getpid()))
|
||||
except IndexError:
|
||||
pass
|
||||
|
||||
|
|
@ -63,8 +63,6 @@ def handle_translation_registrations(*args, **kwargs):
|
|||
but know nothing of modeltranslation.
|
||||
"""
|
||||
import inspect
|
||||
import os
|
||||
from django.conf import settings
|
||||
from modeltranslation.settings import ENABLE_REGISTRATIONS
|
||||
|
||||
if not ENABLE_REGISTRATIONS:
|
||||
|
|
@ -81,8 +79,8 @@ def handle_translation_registrations(*args, **kwargs):
|
|||
stack = inspect.stack()
|
||||
|
||||
for stack_info in stack[1:]:
|
||||
if 'handle_translation_registrations' in stack_info[3] \
|
||||
and __file__ == stack_info[2]:
|
||||
if ('handle_translation_registrations' in stack_info[3] and
|
||||
__file__ == stack_info[2]):
|
||||
return
|
||||
|
||||
# Trigger autodiscover, causing any TranslationOption initialization
|
||||
|
|
|
|||
|
|
@ -24,7 +24,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin):
|
|||
def _declared_fieldsets(self):
|
||||
# Take custom modelform fields option into account
|
||||
if not self.fields and hasattr(
|
||||
self.form, '_meta') and self.form._meta.fields:
|
||||
self.form, '_meta') and self.form._meta.fields:
|
||||
self.fields = self.form._meta.fields
|
||||
if self.fieldsets:
|
||||
return self._patch_fieldsets(self.fieldsets)
|
||||
|
|
@ -135,7 +135,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin):
|
|||
Code shared among get_form and get_formset.
|
||||
"""
|
||||
if not self.exclude and hasattr(
|
||||
self.form, '_meta') and self.form._meta.exclude:
|
||||
self.form, '_meta') and self.form._meta.exclude:
|
||||
# Take the custom ModelForm's Meta.exclude into account only if the
|
||||
# ModelAdmin doesn't define its own.
|
||||
kwargs.update({'exclude': getattr(
|
||||
|
|
@ -182,7 +182,7 @@ class TranslationBaseModelAdmin(BaseModelAdmin):
|
|||
excl_languages = exclude_languages
|
||||
exclude = []
|
||||
for orig_fieldname, translation_fields in \
|
||||
self.trans_opts.localized_fieldnames.iteritems():
|
||||
self.trans_opts.localized_fieldnames.iteritems():
|
||||
for tfield in translation_fields:
|
||||
language = tfield.split('_')[-1]
|
||||
if language in excl_languages and tfield not in exclude:
|
||||
|
|
|
|||
|
|
@ -157,8 +157,9 @@ class TranslationFieldDescriptor(object):
|
|||
|
||||
def __get__(self, instance, owner):
|
||||
if not instance:
|
||||
raise ValueError(u"Translation field '%s' can only be accessed "
|
||||
"via an instance not via a class." % self.name)
|
||||
raise ValueError(
|
||||
"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())
|
||||
if hasattr(instance, loc_field_name):
|
||||
|
|
|
|||
|
|
@ -58,8 +58,9 @@ class Command(BaseCommand):
|
|||
for model in all_models:
|
||||
try:
|
||||
options = translator.get_options_for_model(model)
|
||||
# options returns full-wide spectrum of localized fields but
|
||||
# we only to synchronize the local fields attached to the model.
|
||||
# Options returns full-wide spectrum of localized fields but
|
||||
# we only want to synchronize the local fields attached to the
|
||||
# model.
|
||||
local_field_names = [field.name for field
|
||||
in model._meta.local_fields]
|
||||
translatable_fields = [field for field
|
||||
|
|
@ -109,7 +110,7 @@ class Command(BaseCommand):
|
|||
db_table_fields = self.get_table_fields(db_table)
|
||||
for lang_code, lang_name in settings.LANGUAGES:
|
||||
if build_localized_fieldname(
|
||||
field_name, lang_code) not in db_table_fields:
|
||||
field_name, lang_code) not in db_table_fields:
|
||||
yield lang_code
|
||||
|
||||
def get_sync_sql(self, field_name, missing_langs, model):
|
||||
|
|
@ -131,7 +132,8 @@ class Command(BaseCommand):
|
|||
"ALTER TABLE %s ADD COLUMN %s;" % (
|
||||
qn(db_table), ' '.join(field_sql)))
|
||||
if not f.null and lang == settings.LANGUAGE_CODE:
|
||||
sql_output.append("ALTER TABLE %s MODIFY COLUMN %s %s %s;" % \
|
||||
(qn(db_table), qn(f.column), col_type,
|
||||
style.SQL_KEYWORD('NOT NULL')))
|
||||
sql_output.append(
|
||||
("ALTER TABLE %s MODIFY COLUMN %s %s %s;" % (
|
||||
qn(db_table), qn(f.column), col_type,
|
||||
style.SQL_KEYWORD('NOT NULL'))))
|
||||
return sql_output
|
||||
|
|
|
|||
|
|
@ -1,8 +1,6 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from django.conf import settings
|
||||
from django.db.models import F, Q
|
||||
from django.core.management.base import (BaseCommand, CommandError,
|
||||
NoArgsCommand)
|
||||
from django.core.management.base import NoArgsCommand
|
||||
|
||||
from modeltranslation.settings import DEFAULT_LANGUAGE
|
||||
from modeltranslation.translator import translator
|
||||
|
|
|
|||
|
|
@ -83,7 +83,7 @@ translator.translator.register(TestModelWithFallback2,
|
|||
|
||||
class TestModelWithFileFields(models.Model):
|
||||
title = models.CharField(ugettext_lazy('title'), max_length=255)
|
||||
file = models.FileField(upload_to='test', null=True, blank=True)
|
||||
file = models.FileField(upload_to='test', null=True, blank=True)
|
||||
image = models.ImageField(upload_to='test', null=True, blank=True)
|
||||
|
||||
|
||||
|
|
@ -249,8 +249,8 @@ class ModeltranslationWithFileFields(ModeltranslationTestBase):
|
|||
self.failUnless('file_en' in field_names)
|
||||
inst.delete()
|
||||
|
||||
def test_translated_models(self):
|
||||
f_en = ContentFile("Just a really good file")
|
||||
def test_translated_models_instance(self):
|
||||
#f_en = ContentFile("Just a really good file")
|
||||
inst = TestModelWithFileFields(title="Testtitle", file=None)
|
||||
|
||||
trans_real.activate("en")
|
||||
|
|
@ -265,7 +265,7 @@ class ModeltranslationWithFileFields(ModeltranslationTestBase):
|
|||
trans_real.activate("de")
|
||||
inst.title = 'title_de'
|
||||
|
||||
inst.file = 'a_de'
|
||||
inst.file = 'a_de'
|
||||
inst.file.save('b_de', ContentFile('file in german'))
|
||||
|
||||
inst.image = 'i_de.jpg'
|
||||
|
|
@ -291,6 +291,7 @@ class ModeltranslationWithFileFields(ModeltranslationTestBase):
|
|||
|
||||
inst.delete()
|
||||
|
||||
|
||||
class ModeltranslationTestRule1(ModeltranslationTestBase):
|
||||
"""
|
||||
Rule 1: Reading the value from the original field returns the value in
|
||||
|
|
@ -820,6 +821,7 @@ class TestModelMultitableD(TestModelMultitableB):
|
|||
|
||||
class TestModelAbstractA(models.Model):
|
||||
titlea = models.CharField(ugettext_lazy('title a'), max_length=255)
|
||||
|
||||
class Meta:
|
||||
abstract = True
|
||||
|
||||
|
|
@ -919,9 +921,10 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
pass
|
||||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
['title_de', 'title_en', 'text_de', 'text_en',
|
||||
'url_de', 'url_en', 'email_de', 'email_en'])
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(),
|
||||
['title_de', 'title_en', 'text_de', 'text_en', 'url_de', 'url_en',
|
||||
'email_de', 'email_en'])
|
||||
|
||||
def test_default_fieldsets(self):
|
||||
class TestModelAdmin(TranslationAdmin):
|
||||
|
|
@ -932,9 +935,10 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
# translation fields are included in fields
|
||||
fields = ['title_de', 'title_en', 'text_de', 'text_en',
|
||||
'url_de', 'url_en', 'email_de', 'email_en']
|
||||
self.assertEqual(ma.get_fieldsets(request),
|
||||
[(None, {'fields': fields})])
|
||||
self.assertEqual(ma.get_fieldsets(request, self.test_obj),
|
||||
self.assertEqual(
|
||||
ma.get_fieldsets(request), [(None, {'fields': fields})])
|
||||
self.assertEqual(
|
||||
ma.get_fieldsets(request, self.test_obj),
|
||||
[(None, {'fields': fields})])
|
||||
|
||||
def test_field_arguments(self):
|
||||
|
|
@ -944,8 +948,8 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['title_de', 'title_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
def test_field_arguments_restricted_on_form(self):
|
||||
# Using `fields`.
|
||||
|
|
@ -955,8 +959,8 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['title_de', 'title_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
# Using `fieldsets`.
|
||||
class TestModelAdmin(TranslationAdmin):
|
||||
|
|
@ -964,8 +968,8 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
# Using `exclude`.
|
||||
class TestModelAdmin(TranslationAdmin):
|
||||
|
|
@ -973,18 +977,18 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['title_de', 'title_en', 'text_de', 'text_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), fields)
|
||||
|
||||
# You can also pass a tuple to `exclude`.
|
||||
class TestModelAdmin(TranslationAdmin):
|
||||
exclude = ('url', 'email')
|
||||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
# Using `fields` and `exclude`.
|
||||
class TestModelAdmin(TranslationAdmin):
|
||||
|
|
@ -992,8 +996,8 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
exclude = ['url']
|
||||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
['title_de', 'title_en'])
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), ['title_de', 'title_en'])
|
||||
|
||||
def test_field_arguments_restricted_on_custom_form(self):
|
||||
# Using `fields`.
|
||||
|
|
@ -1007,10 +1011,10 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['url_de', 'url_en', 'email_de', 'email_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
# Using `exclude`.
|
||||
class TestModelForm(forms.ModelForm):
|
||||
|
|
@ -1023,10 +1027,10 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['title_de', 'title_en', 'text_de', 'text_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
# If both, the custom form an the ModelAdmin define an `exclude`
|
||||
# option, the ModelAdmin wins. This is Django behaviour.
|
||||
|
|
@ -1037,10 +1041,10 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['title_de', 'title_en', 'text_de', 'text_en', 'email_de',
|
||||
'email_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
# Same for `fields`.
|
||||
class TestModelForm(forms.ModelForm):
|
||||
|
|
@ -1054,10 +1058,10 @@ class TranslationAdminTest(ModeltranslationTestBase):
|
|||
|
||||
ma = TestModelAdmin(TestModel, self.site)
|
||||
fields = ['email_de', 'email_en']
|
||||
self.assertEqual(ma.get_form(request).base_fields.keys(),
|
||||
fields)
|
||||
self.assertEqual(ma.get_form(request,
|
||||
self.test_obj).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request).base_fields.keys(), fields)
|
||||
self.assertEqual(
|
||||
ma.get_form(request, self.test_obj).base_fields.keys(), fields)
|
||||
|
||||
def test_inline_fieldsets(self):
|
||||
class DataModel(models.Model):
|
||||
|
|
|
|||
|
|
@ -1,9 +1,10 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
from django.conf.urls import *
|
||||
from django.conf.urls import include, patterns, url
|
||||
from django.contrib import admin
|
||||
|
||||
|
||||
urlpatterns = patterns('',
|
||||
urlpatterns = patterns(
|
||||
'',
|
||||
url(r'^set_language/$', 'django.views.i18n.set_language', {},
|
||||
name='set_language'),
|
||||
url(r'^admin/', include(admin.site.urls)),)
|
||||
|
|
|
|||
|
|
@ -2,8 +2,7 @@
|
|||
from django.conf import settings
|
||||
from django.db.models.base import ModelBase
|
||||
|
||||
from modeltranslation.fields import (TranslationField,
|
||||
TranslationFieldDescriptor,
|
||||
from modeltranslation.fields import (TranslationFieldDescriptor,
|
||||
create_translation_field)
|
||||
from modeltranslation.utils import build_localized_fieldname
|
||||
|
||||
|
|
@ -54,7 +53,7 @@ def add_localized_fields(model):
|
|||
raise ValueError(
|
||||
"Error adding translation field. Model '%s' already "
|
||||
"contains a field named '%s'." % (
|
||||
instance.__class__.__name__, localized_field_name))
|
||||
model._meta.object_name, localized_field_name))
|
||||
# This approach implements the translation fields as full valid
|
||||
# django model fields and therefore adds them via add_to_class
|
||||
model.add_to_class(localized_field_name, translation_field)
|
||||
|
|
@ -144,7 +143,7 @@ class Translator(object):
|
|||
# original fieldname
|
||||
rev_dict = dict()
|
||||
for orig_name, loc_names in \
|
||||
translation_opts.localized_fieldnames.items():
|
||||
translation_opts.localized_fieldnames.items():
|
||||
for ln in loc_names:
|
||||
rev_dict[ln] = orig_name
|
||||
translation_opts.localized_fieldnames_rev = rev_dict
|
||||
|
|
|
|||
|
|
@ -38,7 +38,7 @@ build_localized_verbose_name = lazy(_build_localized_verbose_name, unicode)
|
|||
|
||||
def _join_css_class(bits, offset):
|
||||
if ('-'.join(bits[-offset:]) in
|
||||
[l[0] for l in global_settings.LANGUAGES]):
|
||||
[l[0] for l in global_settings.LANGUAGES]):
|
||||
return '%s-%s' % ('_'.join(bits[:len(bits) - offset]),
|
||||
'_'.join(bits[-offset:]))
|
||||
return ''
|
||||
|
|
|
|||
Loading…
Reference in a new issue