added admin hooks/ fixed translation deletion / annotate on translations aswell/ changed ugettext import
This commit is contained in:
parent
e37ef4157b
commit
18de75ff03
|
|
@ -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''' <input onclick="trigger_lang_button(this,'./?language=%s');"%s id="debutton" name="%s" value="%s" type="button">''' % (
|
||||
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''' <input onclick="trigger_lang_button(this,'delete-translation/?language=%s');"%s id="debutton" name="%s" value="%s" type="button">''' % (
|
||||
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:
|
||||
|
|
|
|||
|
|
@ -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)])
|
||||
|
|
|
|||
Loading…
Reference in New Issue