diff -r b77683731f25 -r 10b1f6d8a5d2 web/lib/modeltranslation/admin.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/web/lib/modeltranslation/admin.py Thu Jan 21 18:41:10 2010 +0100 @@ -0,0 +1,120 @@ +# -*- coding: utf-8 -*- +from copy import deepcopy + +from django.conf import settings +from django.contrib import admin +from django.contrib.contenttypes.models import ContentType +from django.forms import widgets +from django import forms, template +from django.forms.fields import MultiValueField +from django.shortcuts import get_object_or_404, render_to_response +from django.utils.safestring import mark_safe + +from modeltranslation.translator import translator + + +class TranslationAdmin(admin.ModelAdmin): + + def patch_translation_field(self, db_field, field, **kwargs): + trans_opts = translator.get_options_for_model(self.model) + + # Hide the original field by making it non-editable. + if db_field.name in trans_opts.fields: + db_field.editable = False + + # For every localized field copy the widget from the original field + if db_field.name in trans_opts.localized_fieldnames_rev: + orig_fieldname = trans_opts.localized_fieldnames_rev[db_field.name] + orig_formfield = self.formfield_for_dbfield(self.model._meta.get_field(orig_fieldname), **kwargs) + + # In case the original form field was required, make the default + # translation field required instead. + if db_field.language == settings.LANGUAGES[0][0] and orig_formfield.required: + orig_formfield.required = False + field.required = True + + field.widget = deepcopy(orig_formfield.widget) + + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationAdmin, self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + + #def save_model(self, request, obj, form, change): + #""" + #Given a model instance save it to the database. + + #Because each translated field is wrapped with a descriptor to return + #the translated fields value (determined by the current language) we + #cannot set the field directly. + #To bypass the descriptor the assignment is done using the __dict__ + #of the object. + #""" + #trans_opts = translator.get_options_for_model(self.model) + #for field_name in trans_opts.fields: + ## Bypass the descriptor applied to the original field by setting + ## it's value via the __dict__ (which doesn't call the descriptor). + #obj.__dict__[field_name] = form.cleaned_data[field_name] + + ## Call the baseclass method + #super(TranslationAdmin, self).save_model(request, obj, form, change) + + +class TranslationTabularInline(admin.TabularInline): + + def patch_translation_field(self, db_field, field, **kwargs): + trans_opts = translator.get_options_for_model(self.model) + + # Hide the original field by making it non-editable. + if db_field.name in trans_opts.fields: + db_field.editable = False + + # For every localized field copy the widget from the original field + if db_field.name in trans_opts.localized_fieldnames_rev: + orig_fieldname = trans_opts.localized_fieldnames_rev[db_field.name] + orig_formfield = self.formfield_for_dbfield(self.model._meta.get_field(orig_fieldname), **kwargs) + + # In case the original form field was required, make the default + # translation field required instead. + if db_field.language == settings.LANGUAGES[0][0] and orig_formfield.required: + orig_formfield.required = False + field.required = True + + field.widget = deepcopy(orig_formfield.widget) + + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationTabularInline, self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + + +class TranslationStackedInline(admin.StackedInline): + + def patch_translation_field(self, db_field, field, **kwargs): + trans_opts = translator.get_options_for_model(self.model) + + # Hide the original field by making it non-editable. + if db_field.name in trans_opts.fields: + db_field.editable = False + + # For every localized field copy the widget from the original field + if db_field.name in trans_opts.localized_fieldnames_rev: + orig_fieldname = trans_opts.localized_fieldnames_rev[db_field.name] + orig_formfield = self.formfield_for_dbfield(self.model._meta.get_field(orig_fieldname), **kwargs) + + # In case the original form field was required, make the default + # translation field required instead. + if db_field.language == settings.LANGUAGES[0][0] and orig_formfield.required: + orig_formfield.required = False + field.required = True + + field.widget = deepcopy(orig_formfield.widget) + + def formfield_for_dbfield(self, db_field, **kwargs): + # Call the baseclass function to get the formfield + field = super(TranslationStackedInline, self).formfield_for_dbfield(db_field, **kwargs) + self.patch_translation_field(db_field, field, **kwargs) + return field + \ No newline at end of file