From 18de75ff035e2e4bc14aa7efccfeb3c4c7de68c0 Mon Sep 17 00:00:00 2001 From: fivethreeo Date: Mon, 17 Jan 2011 17:07:46 +0100 Subject: [PATCH] added admin hooks/ fixed translation deletion / annotate on translations aswell/ changed ugettext import --- simple_translation/admin.py | 68 +++++++++++++++----------- simple_translation/translation_pool.py | 19 ++++--- 2 files changed, 53 insertions(+), 34 deletions(-) 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)])