from django.contrib.postgres.fields import JSONField from django.db import models from django.utils.translation import gettext_lazy as _ from utils.models import (ProjectBaseMixin, BaseAttributes, LocaleManagerMixin, ImageMixin) class NewsType(models.Model): """NewsType model.""" name = models.CharField(_('name'), max_length=250) class Meta: verbose_name_plural = _('news types') verbose_name = _('news type') def __str__(self): return self.name class NewsManager(LocaleManagerMixin): """Manager for model News""" class NewsQuerySet(models.QuerySet): """QuerySet for model News""" def by_type(self, news_type): """Filter News by type""" return self.filter(news_type__name=news_type) def by_country_code(self, code): """Filter collection by country code.""" return self.filter(country__code=code) def published(self): """Return only published news""" return self.filter(is_publish=True) class News(ImageMixin, BaseAttributes): """News model.""" news_type = models.ForeignKey( NewsType, verbose_name=_('news type'), on_delete=models.CASCADE) title = JSONField( _('title'), null=True, blank=True, default=None, help_text='{"en":"some text"}') subtitle = JSONField( _('subtitle'), null=True, blank=True, default=None, help_text='{"en":"some text"}' ) description = JSONField( _('description'), null=True, blank=True, default=None, help_text='{"en":"some text"}' ) start = models.DateTimeField(_('start')) end = models.DateTimeField(_('end')) playlist = models.IntegerField(_('playlist')) address = models.ForeignKey( 'location.Address', verbose_name=_('address'), blank=True, null=True, default=None, on_delete=models.CASCADE) is_publish = models.BooleanField( default=False, verbose_name=_('Publish status')) country = models.ForeignKey( 'location.Country', blank=True, null=True, verbose_name=_('country'), on_delete=models.CASCADE) is_highlighted = models.BooleanField( default=False, verbose_name=_('Is highlighted')) # TODO: metadata_keys - описание ключей для динамического построения полей метаданных # TODO: metadata_values - Описание значений для динамических полей из MetadataKeys objects = NewsManager.from_queryset(NewsQuerySet)() class Meta: verbose_name = _('news') verbose_name_plural = _('news') def __str__(self): return f'news: {self.id}'