in_favorites news

This commit is contained in:
alex 2019-11-13 19:33:09 +03:00
parent 2ec40ff8fe
commit 906ca921f5
4 changed files with 31 additions and 7 deletions

View File

@ -100,7 +100,6 @@ class User(AbstractUser):
newsletter = models.NullBooleanField(default=True) newsletter = models.NullBooleanField(default=True)
old_id = models.IntegerField(null=True, blank=True, default=None) old_id = models.IntegerField(null=True, blank=True, default=None)
EMAIL_FIELD = 'email' EMAIL_FIELD = 'email'
USERNAME_FIELD = 'username' USERNAME_FIELD = 'username'
REQUIRED_FIELDS = ['email'] REQUIRED_FIELDS = ['email']
@ -261,15 +260,23 @@ class User(AbstractUser):
def favorite_establishment_ids(self): def favorite_establishment_ids(self):
"""Return establishment IDs that in favorites for current user.""" """Return establishment IDs that in favorites for current user."""
return self.favorites.by_content_type(app_label='establishment', return self.favorites.by_content_type(app_label='establishment',
model='establishment')\ model='establishment') \
.values_list('object_id', flat=True) .values_list('object_id', flat=True)
@property @property
def favorite_recipe_ids(self): def favorite_recipe_ids(self):
"""Return recipe IDs that in favorites for current user.""" """Return recipe IDs that in favorites for current user."""
return self.favorites.by_content_type(app_label='recipe', return self.favorites.by_content_type(app_label='recipe',
model='recipe')\ model='recipe') \
.values_list('object_id', flat=True) .values_list('object_id', flat=True)
@property
def favorite_news_ids(self):
"""Return news IDs that in favorites for current user."""
return self.favorites.by_content_type(
app_label='news',
model='news',
).values_list('object_id', flat=True)
class UserRole(ProjectBaseMixin): class UserRole(ProjectBaseMixin):
@ -277,4 +284,4 @@ class UserRole(ProjectBaseMixin):
user = models.ForeignKey(User, verbose_name=_('User'), on_delete=models.CASCADE) user = models.ForeignKey(User, verbose_name=_('User'), on_delete=models.CASCADE)
role = models.ForeignKey(Role, verbose_name=_('Role'), on_delete=models.SET_NULL, null=True) role = models.ForeignKey(Role, verbose_name=_('Role'), on_delete=models.SET_NULL, null=True)
establishment = models.ForeignKey(Establishment, verbose_name=_('Establishment'), establishment = models.ForeignKey(Establishment, verbose_name=_('Establishment'),
on_delete=models.SET_NULL, null=True, blank=True) on_delete=models.SET_NULL, null=True, blank=True)

View File

@ -1,6 +1,7 @@
"""News app models.""" """News app models."""
from django.contrib.contenttypes import fields as generic from django.contrib.contenttypes import fields as generic
from django.db import models from django.db import models
from django.db.models import Case, When
from django.utils import timezone from django.utils import timezone
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework.reverse import reverse from rest_framework.reverse import reverse
@ -79,6 +80,19 @@ class NewsQuerySet(TranslationQuerysetMixin):
with_base_related().by_type(news.news_type). \ with_base_related().by_type(news.news_type). \
by_tags(news.tags.all()).distinct().order_by('-start') by_tags(news.tags.all()).distinct().order_by('-start')
def annotate_in_favorites(self, user):
"""Annotate flag in_favorites"""
favorite_news_ids = []
if user.is_authenticated:
favorite_news_ids = user.favorite_news_ids
return self.annotate(
in_favorites=Case(
When(id__in=favorite_news_ids, then=True),
default=False,
output_field=models.BooleanField(default=False)
)
)
class Agenda(ProjectBaseMixin, TranslatedFieldsMixin): class Agenda(ProjectBaseMixin, TranslatedFieldsMixin):
"""News agenda model""" """News agenda model"""

View File

@ -135,6 +135,7 @@ class NewsBaseSerializer(ProjectModelSerializer):
subtitle_translated = TranslatedField() subtitle_translated = TranslatedField()
news_type = NewsTypeSerializer(read_only=True) news_type = NewsTypeSerializer(read_only=True)
tags = TagBaseSerializer(read_only=True, many=True) tags = TagBaseSerializer(read_only=True, many=True)
in_favorites = serializers.BooleanField(allow_null=True)
class Meta: class Meta:
"""Meta class.""" """Meta class."""
@ -148,6 +149,7 @@ class NewsBaseSerializer(ProjectModelSerializer):
'news_type', 'news_type',
'tags', 'tags',
'slug', 'slug',
'in_favorites',
) )

View File

@ -22,7 +22,8 @@ class NewsMixinView:
"""Override get_queryset method.""" """Override get_queryset method."""
qs = models.News.objects.published() \ qs = models.News.objects.published() \
.with_base_related() \ .with_base_related() \
.order_by('-is_highlighted', '-created') .order_by('-is_highlighted', '-created') \
.annotate_in_favorites(self.request.user)
country_code = self.request.country_code country_code = self.request.country_code
if country_code: if country_code:
qs = qs.by_country_code(country_code) qs = qs.by_country_code(country_code)