web/lib/modeltranslation/admin.py
author ymh <ymh.work@gmail.com>
Thu, 21 Jan 2010 18:41:10 +0100
changeset 5 10b1f6d8a5d2
permissions -rw-r--r--
first debug version

# -*- 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