"""Review app models.""" from django.contrib.contenttypes import fields as generic from django.core.validators import MinValueValidator, MaxValueValidator from django.db import models from django.utils.translation import gettext_lazy as _ from utils.models import BaseAttributes, TranslatedFieldsMixin from utils.models import TJSONField class ReviewQuerySet(models.QuerySet): """QuerySets for model Review""" def by_reviewer(self, user): """Return reviews by user""" return self.filter(reviewer=user) def by_vintage(self, year: int): """Return reviews by year""" return self.filter(vintage=year) def by_status(self, status): """Filter by status""" return self.filter(status=status) def published(self): """Return published reviews""" return self.filter(status=Review.READY) class Review(BaseAttributes, TranslatedFieldsMixin): """Review model""" TO_INVESTIGATE = 0 TO_REVIEW = 1 READY = 2 REVIEW_STATUSES = ( (TO_INVESTIGATE, _('To investigate')), (TO_REVIEW, _('To review')), (READY, _('Ready')), ) reviewer = models.ForeignKey('account.User', related_name='reviews', on_delete=models.CASCADE, verbose_name=_('Reviewer')) text = TJSONField( _('text'), null=True, blank=True, default=None, help_text='{"en-GB":"Text review"}') content_type = models.ForeignKey(generic.ContentType, on_delete=models.CASCADE) object_id = models.PositiveIntegerField() content_object = generic.GenericForeignKey('content_type', 'object_id') language = models.ForeignKey('translation.Language', on_delete=models.CASCADE, related_name='reviews', verbose_name=_('Review language')) status = models.PositiveSmallIntegerField(choices=REVIEW_STATUSES, default=TO_INVESTIGATE) child = models.ForeignKey('self', blank=True, default=None, null=True, on_delete=models.CASCADE, verbose_name=_('Child review')) published_at = models.DateTimeField(verbose_name=_('Publish datetime'), blank=True, default=None, null=True, help_text=_('Review published datetime')) vintage = models.IntegerField(verbose_name=_('Year of review'), validators=[MinValueValidator(1900), MaxValueValidator(2100)]) country = models.ForeignKey('location.Country', on_delete=models.CASCADE, related_name='country', verbose_name=_('Country'), null=True) old_id = models.PositiveIntegerField(_('old id'), blank=True, null=True, default=None) objects = ReviewQuerySet.as_manager() class Meta: """Meta class.""" verbose_name = _('Review') verbose_name_plural = _('Reviews')