From abea9835a78512b740c1ff548ff1f8b2aa184904 Mon Sep 17 00:00:00 2001 From: Dirk Eschler Date: Fri, 12 Oct 2012 08:27:22 +0000 Subject: [PATCH] Added support for FileField and ImageField. Resolves issue 30 (thanks to Bruno Tavares and Maxime Haineault). --- AUTHORS.txt | 1 + CHANGELOG.txt | 3 +++ modeltranslation/fields.py | 31 +++++++++++++++++++------------ 3 files changed, 23 insertions(+), 12 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index da14577..88b9959 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -10,3 +10,4 @@ Jaap Roes Bojan Mihelac Sébastien Fievet Jacek Tomaszewski +Bruno Tavares diff --git a/CHANGELOG.txt b/CHANGELOG.txt index 6128fb2..8b880c0 100644 --- a/CHANGELOG.txt +++ b/CHANGELOG.txt @@ -1,6 +1,9 @@ v0.4.0-alpha1 ============= + ADDED: Support for FileField and ImageField. + (thanks to Bruno Tavares, + resolves issue 30) ADDED: New management command sync_database_fields to sync the database after a new model has been registered or a new language has been added. (thanks to Sébastien Fievet and the authors of django-transmeta, diff --git a/modeltranslation/fields.py b/modeltranslation/fields.py index 974f0f6..f641313 100644 --- a/modeltranslation/fields.py +++ b/modeltranslation/fields.py @@ -1,17 +1,17 @@ # -*- coding: utf-8 -*- -import sys -from warnings import warn - -from django.conf import settings from django.core.exceptions import ImproperlyConfigured -from django.db.models.fields import Field, CharField, TextField +from django.db.models.fields import CharField, TextField +from django.db.models.fields.files import FileField, ImageField -from modeltranslation.settings import * +from modeltranslation.settings import CUSTOM_FIELDS, DEFAULT_LANGUAGE from modeltranslation.utils import (get_language, build_localized_fieldname, build_localized_verbose_name) +SUPPORTED_FIELDS = (CharField, TextField, FileField, ImageField,) + + def create_translation_field(model, field_name, lang): """ Translation field factory. Returns a ``TranslationField`` based on a @@ -22,20 +22,26 @@ def create_translation_field(model, field_name, lang): MODELTRANSLATION_CUSTOM_FIELDS = ('MyField', 'MyOtherField',) - If the class is neither a subclass of CharField or TextField, nor + If the class is neither a subclass of fields in ``SUPPORTED_FIELDS``, nor in ``CUSTOM_FIELDS`` an ``ImproperlyConfigured`` exception will be raised. """ field = model._meta.get_field(field_name) cls_name = field.__class__.__name__ - # No subclass required for text-like fields - if not (isinstance(field, (CharField, TextField)) or + if not (isinstance(field, SUPPORTED_FIELDS) or cls_name in CUSTOM_FIELDS): raise ImproperlyConfigured('%s is not supported by ' 'modeltranslation.' % cls_name) - return TranslationField(translated_field=field, language=lang) + translation_class = field_factory(field.__class__) + return translation_class(translated_field=field, language=lang) -class TranslationField(Field): +def field_factory(baseclass): + class TranslationFieldSpecific(TranslationField, baseclass): + pass + return TranslationFieldSpecific + + +class TranslationField(object): """ The translation field functions as a proxy to the original field which is wrapped. @@ -83,7 +89,8 @@ class TranslationField(Field): translated_field.verbose_name, language) def pre_save(self, model_instance, add): - val = super(TranslationField, self).pre_save(model_instance, add) + val = super(self.translated_field.__class__, self).pre_save( + model_instance, add) if DEFAULT_LANGUAGE == self.language and not add: # Rule is: 3. Assigning a value to a translation field of the # default language also updates the original field