diff --git a/CHANGES.rst b/CHANGES.rst index 3e63f6a..4b4a23d 100644 --- a/CHANGES.rst +++ b/CHANGES.rst @@ -4,6 +4,12 @@ Changelog Here you can see the full list of changes between each SQLAlchemy-Utils release. +0.29.6 (2015-02-03) +^^^^^^^^^^^^^^^^^^^ + +- Added customizable TranslationHybrid default value + + 0.29.5 (2015-02-03) ^^^^^^^^^^^^^^^^^^^ diff --git a/docs/internationalization.rst b/docs/internationalization.rst index f6188b7..24d9197 100644 --- a/docs/internationalization.rst +++ b/docs/internationalization.rst @@ -90,4 +90,29 @@ Translation hybrids can also be used as expressions. session.query(Article).filter(Article.name['en'] == 'Some article') + +By default if no value is found for either current or default locale the +translation hybrid returns `None`. You can customize this value with `default_value` parameter +of translation_hybrid. In the following example we make translation hybrid fallback to empty string instead of `None`. + +:: + + translation_hybrid = TranslationHybrid( + current_locale=get_locale, + default_locale='en', + default_value='' + ) + + + class Article(Base): + __tablename__ = 'article' + + id = Column(Integer, primary_key=True) + name_translations = Column(HSTORE) + + name = translation_hybrid(name_translations, default) + + + Article().name # '' + .. _SQLAlchemy-i18n: https://github.com/kvesteri/sqlalchemy-i18n diff --git a/sqlalchemy_utils/__init__.py b/sqlalchemy_utils/__init__.py index 4d6a665..0d1eb70 100644 --- a/sqlalchemy_utils/__init__.py +++ b/sqlalchemy_utils/__init__.py @@ -87,7 +87,7 @@ from .types import ( from .models import Timestamp -__version__ = '0.29.5' +__version__ = '0.29.6' __all__ = ( diff --git a/sqlalchemy_utils/i18n.py b/sqlalchemy_utils/i18n.py index 0d77186..129f86b 100644 --- a/sqlalchemy_utils/i18n.py +++ b/sqlalchemy_utils/i18n.py @@ -26,9 +26,10 @@ except ImportError: class TranslationHybrid(object): - def __init__(self, current_locale, default_locale): + def __init__(self, current_locale, default_locale, default_value=None): self.current_locale = current_locale self.default_locale = default_locale + self.default_value = default_value def cast_locale(self, obj, locale): """ @@ -60,7 +61,7 @@ class TranslationHybrid(object): try: return getattr(obj, attr.key)[default_locale] except (TypeError, KeyError): - return None + return self.default_value return getter def setter_factory(self, attr): diff --git a/tests/test_translation_hybrid.py b/tests/test_translation_hybrid.py index 6dc6cb6..a11e402 100644 --- a/tests/test_translation_hybrid.py +++ b/tests/test_translation_hybrid.py @@ -33,6 +33,11 @@ class TestTranslationHybrid(TestCase): city = self.City() assert city.name is None + def test_custom_default_value(self): + self.translation_hybrid.default_value = 'Some value' + city = self.City() + assert city.name is 'Some value' + def test_fall_back_to_default_translation(self): city = self.City(name_translations={'en': 'Helsinki'}) self.translation_hybrid.current_locale = 'sv'