"""Tag app models.""" from django.db import models from django.utils.translation import gettext_lazy as _ from configuration.models import TranslationSettings from utils.models import TJSONField, TranslatedFieldsMixin class Tag(TranslatedFieldsMixin, models.Model): """Tag model.""" label = TJSONField(blank=True, null=True, default=None, verbose_name=_('label'), help_text='{"en-GB":"some text"}') category = models.ForeignKey('TagCategory', on_delete=models.PROTECT, null=True, related_name='tags', verbose_name=_('Category')) class Meta: """Meta class.""" verbose_name = _('Tag') verbose_name_plural = _('Tags') def __str__(self): label = 'None' lang = TranslationSettings.get_solo().default_language if self.label and lang in self.label: label = self.label[lang] return f'id:{self.id}-{label}' class TagCategoryQuerySet(models.QuerySet): """Extended queryset for TagCategory model.""" def with_base_related(self): return self.prefetch_related('tags') def for_news(self): return self.filter(news_types__isnull=True) def for_establishments(self): return self.filter(models.Q(est_subtype_tag_categories__isnull=True) | models.Q(est_type_tag_categories__isnull=True)).\ distinct() def with_related(self): return self.select_related('country').prefetch_related('tags') class TagCategory(TranslatedFieldsMixin, models.Model): """Tag base category model.""" label = TJSONField(blank=True, null=True, default=None, verbose_name=_('label'), help_text='{"en-GB":"some text"}') country = models.ForeignKey('location.Country', on_delete=models.SET_NULL, null=True, default=None) public = models.BooleanField(default=False) objects = TagCategoryQuerySet.as_manager() class Meta: """Meta class.""" verbose_name = _('Tag category') verbose_name_plural = _('Tag categories') def __str__(self): label = 'None' lang = TranslationSettings.get_solo().default_language if self.label and lang in self.label: label = self.label[lang] return f'id:{self.id}-{label}'