--- /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