"""Translation app models.""" from django.contrib.postgres.fields import JSONField from django.db import models from django.utils.translation import gettext_lazy as _ from django.apps import apps from utils.models import ProjectBaseMixin, LocaleManagerMixin class LanguageQuerySet(models.QuerySet): """QuerySet for model Language""" def active(self, switcher=True): """Filter only active users.""" return self.filter(is_active=switcher) def by_locale(self, locale: str) -> models.QuerySet: """Filter by locale""" return self.filter(locale=locale) def by_title(self, title: str) -> models.QuerySet: """Filter by title""" return self.filter(title=title) class Language(models.Model): """Language model.""" title = models.CharField(max_length=255, verbose_name=_('Language title')) locale = models.CharField(max_length=10, verbose_name=_('Locale identifier')) old_id = models.IntegerField(null=True, blank=True, default=None) is_active = models.BooleanField(_('is active'), default=True) objects = LanguageQuerySet.as_manager() class Meta: """Meta class.""" verbose_name = _('Language') verbose_name_plural = _('Languages') unique_together = ('title', 'locale') def __str__(self): """String method""" return f'{self.title} ({self.locale})' class SiteInterfaceDictionaryManager(LocaleManagerMixin): """Extended manager for SiteInterfaceDictionary model.""" def update_or_create_for_tag(self, tag, translations: dict): Tag = apps.get_model('tag', 'Tag') """Creates or updates translation for EXISTING in DB Tag""" if not tag.pk or not isinstance(tag, Tag): raise NotImplementedError if tag.translation: tag.translation.text = translations tag.translation.page = 'tag' tag.translation.keywords = f'tag-{tag.pk}' else: trans = SiteInterfaceDictionary({ 'text': translations, 'page': 'tag', 'keywords': f'tag-{tag.pk}' }) trans.save() tag.translation = trans tag.save() def update_or_create_for_tag_category(self, tag_category, translations: dict): """Creates or updates translation for EXISTING in DB TagCategory""" TagCategory = apps.get_model('tag', 'TagCategory') if not tag_category.pk or not isinstance(tag_category, TagCategory): raise NotImplementedError if tag_category.translation: tag_category.translation.text = translations tag_category.translation.page = 'tag' tag_category.translation.keywords = f'tag_category-{tag_category.pk}' else: trans = SiteInterfaceDictionary({ 'text': translations, 'page': 'tag', 'keywords': f'tag_category-{tag_category.pk}' }) trans.save() tag_category.translation = trans tag_category.save() class SiteInterfaceDictionary(ProjectBaseMixin): """Site interface dictionary model.""" page = models.CharField(max_length=255, db_index=True, verbose_name=_('Page')) keywords = models.CharField(max_length=255, verbose_name='Keywords') text = JSONField(_('Text'), null=True, blank=True, default=None, help_text='{"en-GB":"some text"}') objects = SiteInterfaceDictionaryManager() class Meta: """Meta class.""" verbose_name = _('Site interface dictionary') verbose_name_plural = _('Site interface dictionary') def __str__(self): return f'{self.page}: {self.keywords}'