web/lib/modeltranslation/admin.py
changeset 5 10b1f6d8a5d2
--- /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