gault-millau/apps/review/models.py
2019-09-25 19:39:37 +03:00

74 lines
2.8 KiB
Python

"""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)])
objects = ReviewQuerySet.as_manager()
class Meta:
"""Meta class."""
verbose_name = _('Review')
verbose_name_plural = _('Reviews')