gault-millau/apps/tag/models.py
2019-10-23 13:39:45 +03:00

89 lines
3.1 KiB
Python

"""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.CASCADE,
null=True, related_name='tags',
verbose_name=_('Category'))
priority = models.IntegerField(unique=True, null=True, default=None)
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):
"""Select related objects."""
return self.prefetch_related('tags')
def with_extended_related(self):
"""Select related objects."""
return self.select_related('country')
def for_news(self):
"""Select tag categories for news."""
return self.filter(news_types__isnull=True)
def for_establishments(self):
"""Select tag categories for establishments."""
return self.filter(models.Q(establishment_types__isnull=False) |
models.Q(establishment_subtypes__isnull=False))
def by_establishment_type(self, index_name):
"""Filter by establishment type index name."""
return self.filter(establishment_types__index_name=index_name)
def with_tags(self, switcher=True):
"""Filter by existing tags."""
return self.filter(tags__isnull=not switcher)
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)
index_name = models.CharField(max_length=255, blank=True, null=True,
verbose_name=_('indexing name'), unique=True)
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}'