Add rating value in news

This commit is contained in:
Виктор Гладких 2019-10-03 14:46:34 +03:00
parent 295bda4b4f
commit 14cf7d7b1b
3 changed files with 12 additions and 5 deletions

View File

@ -5,6 +5,8 @@ from django.utils import timezone
from django.utils.translation import gettext_lazy as _
from rest_framework.reverse import reverse
from utils.models import BaseAttributes, TJSONField, TranslatedFieldsMixin
from django.contrib.contenttypes.models import ContentType
from rating.models import Rating
from random import sample as random_sample
@ -27,6 +29,9 @@ class NewsType(models.Model):
class NewsQuerySet(models.QuerySet):
"""QuerySet for model News"""
def rating_value(self):
return self.annotate(rating=models.Count('ratings'))
def with_base_related(self):
"""Return qs with related objects."""
return self.select_related('news_type', 'country').prefetch_related('tags')
@ -132,6 +137,8 @@ class News(BaseAttributes, TranslatedFieldsMixin):
verbose_name=_('country'))
tags = generic.GenericRelation(to='main.MetaDataContent')
ratings = generic.GenericRelation(Rating)
objects = NewsQuerySet.as_manager()
class Meta:

View File

@ -76,5 +76,5 @@ class NewsBackOfficeRUDView(NewsBackOfficeMixinView,
serializer_class = serializers.NewsBackOfficeDetailSerializer
def get(self, request, pk, *args, **kwargs):
add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news')
add_rating(remote_addr=request.META.get('REMOTE_ADDR'), pk=pk, model='news', app_label='news',)
return self.retrieve(request, *args, **kwargs)

View File

@ -4,18 +4,18 @@ from rating.models import Rating
from django.contrib.contenttypes.models import ContentType
def add_rating(remote_addr, pk, model):
def add_rating(remote_addr, pk, model, app_label):
add.apply_async(
(remote_addr, pk, model), countdown=60 * 60
(remote_addr, pk, model, app_label), countdown=60 * 60
)
@task
def add(remote_addr, pk, model):
def add(remote_addr, pk, model, app_label):
rating = Rating()
rating.ip = remote_addr
rating.object_id = pk
rating.content_type = ContentType.objects.get(model=model)
rating.content_type = ContentType.objects.get(app_label=app_label, model=model)
rating.save()