django-parlor

Django model translations with even less nasty hacks.
git clone https://git.ce9e.org/django-parlor.git

commit
5a96ff555e209e53c1a251eaf1872b1a92a5c35b
parent
a6309429137149d3e468b4fea43a9955c275394b
Author
Tobias Bengfort <tobias.bengfort@posteo.de>
Date
2025-08-07 07:01
refactor: rm TranslationFallback

Diffstat

M parlor/models.py 26 +++++++++-----------------

1 files changed, 9 insertions, 17 deletions


diff --git a/parlor/models.py b/parlor/models.py

@@ -1,13 +1,7 @@
    1    -1 from django.core.exceptions import ObjectDoesNotExist
    2     1 from django.db import models
    3     2 from django.utils.translation import get_language
    4     3 
    5     4 
    6    -1 class TranslationFallback:
    7    -1     def __getattr__(self, key):
    8    -1         return 'not translated'
    9    -1 
   10    -1 
   11     5 class TranslatableModel(models.Model):
   12     6     class Meta:
   13     7         abstract = True
@@ -15,20 +9,15 @@ class TranslatableModel(models.Model):
   15     9     @property
   16    10     def translation(self):
   17    11         if not self.pk:
   18    -1             return TranslationFallback()
   19    -1 
   20    -1         lang = get_language()
   -1    12             raise self.translations.model.DoesNotExist
   21    13 
   22    14         translation = self.__dict__.get('_translation')
   23    -1         if translation and translation.language_code == lang:
   -1    15         if translation and translation.language_code == get_language():
   24    16             return translation
   25    17 
   26    -1         try:
   27    -1             translation = self.translations.get(language_code=lang)
   28    -1             self.__dict__['_translation'] = translation
   29    -1             return translation
   30    -1         except ObjectDoesNotExist:
   31    -1             return TranslationFallback()
   -1    18         translation = self.translations.get(language_code=get_language())
   -1    19         self.__dict__['_translation'] = translation
   -1    20         return translation
   32    21 
   33    22     def refresh_from_db(self, *args, **kwargs):
   34    23         self.__dict__.pop('_translation', None)
@@ -37,7 +26,10 @@ class TranslatableModel(models.Model):
   37    26     def __getattr__(self, key):
   38    27         fields = self.translations.model._meta.get_fields()
   39    28         if key in (f.attname for f in fields):
   40    -1             return getattr(self.translation, key)
   -1    29             try:
   -1    30                 return getattr(self.translation, key)
   -1    31             except self.translations.model.DoesNotExist:
   -1    32                 return 'not translated'
   41    33         else:
   42    34             raise AttributeError
   43    35