diff --git a/simple_translation/admin.py b/simple_translation/admin.py
index 25b7afa..73ed255 100644
--- a/simple_translation/admin.py
+++ b/simple_translation/admin.py
@@ -1,12 +1,13 @@
import os
-from django.utils.translation import ugettext_lazy as _
+from django.utils.translation import ugettext as _
from django.conf import settings
+from django.db import router
from django.contrib import admin
from django.forms.models import model_to_dict, fields_for_model, save_instance, construct_instance, InlineForeignKeyField
from django import forms
-from django.forms.models import ModelForm, ModelFormMetaclass, modelform_factory
+from django.forms.models import ModelForm, ModelFormMetaclass, modelform_factory, model_to_dict
from django.forms.util import ErrorList
from django.utils.safestring import mark_safe
@@ -46,48 +47,55 @@ class TranslationModelForm(ModelForm):
__metaclass__ = TranslationModelFormMetaclass
def __init__(self, data=None, files=None, auto_id='id_%s', prefix=None,
- initial=None, error_class=ErrorList, label_suffix=':',
+ initial={}, error_class=ErrorList, label_suffix=':',
empty_permitted=False, instance=None):
-
- super(TranslationModelForm, self).__init__(data=data, files=files, auto_id=auto_id, prefix=prefix,
- initial=initial, error_class=error_class, label_suffix=label_suffix,
- empty_permitted=empty_permitted, instance=instance)
-
+
model = self._meta.model
child_model = self.child_form_class._meta.model
translation_info = translation_pool.get_info(model)
+ current_language = self.base_fields['language'].initial
if instance and instance.pk:
try:
child_instance = child_model.objects.get(**{
translation_info['translation_model_fk']: instance.pk,
- translation_info['language_field']: self.current_language})
+ translation_info['language_field']: current_language})
except child_model.DoesNotExist:
child_instance = child_model(**{
- translation_info['language_field']: self.current_language})
+ translation_info['language_field']: current_language})
else:
- child_instance = child_model(**{translation_info['language_field']: self.current_language})
-
+ child_instance = child_model(**{translation_info['language_field']: current_language})
+
+ initial.update(model_to_dict(child_instance))
+
self.child_form = self.child_form_class(data=data, files=files, auto_id=auto_id, prefix=prefix,
initial=initial, error_class=error_class, label_suffix=label_suffix,
empty_permitted=empty_permitted, instance=child_instance)
+
+ super(TranslationModelForm, self).__init__(data=data, files=files, auto_id=auto_id, prefix=prefix,
+ initial=initial, error_class=error_class, label_suffix=label_suffix,
+ empty_permitted=empty_permitted, instance=instance)
+
+
def full_clean(self):
super(TranslationModelForm, self).full_clean()
self.child_form.full_clean()
if self.child_form._errors:
- del self.cleaned_data
self._update_errors(self.child_form._errors)
+ del self.cleaned_data
def translation_modelform_factory(model, form=TranslationModelForm, fields=None, exclude=None,
formfield_callback=None):
# Create the inner Meta class. FIXME: ideally, we should be able to
# construct a ModelForm without creating and passing in a temporary
# inner class.
-
+ translation_info = translation_pool.get_info(model)
+ translation_model = translation_info['model']
+ translation_fields = [f[0].name for f in translation_model._meta.get_fields_with_model()]
# Build up a list of attributes that the Meta object will have.
attrs = {'model': model}
if fields is not None:
- attrs['fields'] = fields
+ attrs['fields'] = [ field for field in fields if not field in translation_fields]
if exclude is not None:
attrs['exclude'] = exclude
@@ -168,8 +176,8 @@ class LanguageWidget(forms.HiddenInput):
buttons.append(u''' ''' % (
lang[0], button_classes, lang[0], lang[1]))
- lang_descr = u'Delete: "%s" translation.' % force_unicode(lang_dict[str(value)])
- if self.translation.pk:
+ lang_descr = _('Delete: "%s" translation.') % force_unicode(lang_dict[str(value)])
+ if self.translation.pk and len(translation_pool.annotate_with_translations(self.translation).translations) > 1:
buttons.append(u''' ''' % (
value, u'', 'dellang', lang_descr ))
@@ -246,22 +254,26 @@ def make_translation_admin(admin):
"formfield_callback": curry(self.formfield_for_dbfield, request=request),
}
defaults.update(kwargs)
- form = translation_modelform_factory(self.model, **defaults)
+ new_form = translation_modelform_factory(self.model, **defaults)
current_language = get_language_from_request(request)
- form.current_language = current_language
translation_obj = self.get_translation(request, obj)
- form.base_fields['language'].widget = LanguageWidget(translation=translation_obj)
- form.base_fields['language'].initial = current_language
+ new_form.base_fields['language'].widget = LanguageWidget(translation=translation_obj)
+ new_form.base_fields['language'].initial = current_language
- return form
-
- def save_model(self, request, obj, form, change):
- super(RealTranslationAdmin, self).save_model(request, obj, form, change)
+ return new_form
- translation_obj = form.child_form.save(commit=False)
+ def save_translated_form(self, request, obj, form, change):
+ return form.child_form.save(commit=False)
+
+ def save_translated_model(self, request, obj, translation_obj, form, change):
setattr(translation_obj, self.translation_model_fk, obj)
translation_obj.save()
+ def save_model(self, request, obj, form, change):
+ super(RealTranslationAdmin, self).save_model(request, obj, form, change)
+ translation_obj = self.save_translated_form(request, obj, form, change)
+ self.save_translated_model(request, obj, translation_obj, form, change)
+
def placeholder_plugin_filter(self, request, queryset):
language = get_language_from_request(request)
return queryset.filter(language=language)
@@ -309,8 +321,8 @@ def make_translation_admin(admin):
raise Http404(_('There only exists one translation for this page'))
translationobj = get_object_or_404(self.translation_model, **{self.translation_model_fk + '__id': object_id, 'language': language})
-
- deleted_objects, perms_needed = get_deleted_objects([translationobj], translationopts, request.user, self.admin_site)
+ using = router.db_for_write(self.model)
+ deleted_objects, perms_needed = get_deleted_objects([translationobj], translationopts, request.user, self.admin_site, using)
if request.method == 'POST':
if perms_needed:
diff --git a/simple_translation/translation_pool.py b/simple_translation/translation_pool.py
index 0402a39..463e50d 100644
--- a/simple_translation/translation_pool.py
+++ b/simple_translation/translation_pool.py
@@ -39,7 +39,7 @@ class TranslationPool(object):
if rel.model == translated_model:
self.translated_models[translation_of_model]['translation_model_fk'] = rel.field.name
self.translated_models[translation_of_model]['translation_accessor'] = rel.get_accessor_name()
-
+
self.translated_models[translation_of_model]['translation_filter'] = translated_model.__name__.lower()
self.translated_models[translation_of_model]['language_field'] = language_field
@@ -50,17 +50,24 @@ class TranslationPool(object):
return list_or_instance
if isinstance(list_or_instance, models.Model):
model = list_or_instance.__class__
- list_or_instance.translations = list(getattr(list_or_instance, \
- self.translated_models[model]['translation_accessor']).all())
+ instance = list_or_instance
+ if self.is_registered_translation(model):
+ instance = getattr(list_or_instance, self.get_info(model)['translation_model_fk'])
+ list_or_instance.translations = list(getattr(instance, \
+ self.get_info(model)['translation_accessor']).all())
return list_or_instance
else:
result_list = list_or_instance
if not len(result_list):
return result_list
model = list_or_instance[0].__class__
-
- translated_model = self.translated_models[model]['model']
- translation_model_fk = self.translated_models[model]['translation_model_fk']
+
+ info = self.get_info(model)
+ translated_model = info['model']
+ if self.is_registered_translation(model):
+ translation_model_fk = self.translated_models[model]['translation_model_fk']
+ else:
+ translation_model_fk = self.translated_models[model]['translation_model_fk']
id_list = [r.pk for r in result_list]
pk_index_map = dict([(pk, index) for index, pk in enumerate(id_list)])