in_favorites news
This commit is contained in:
parent
2ec40ff8fe
commit
906ca921f5
|
|
@ -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)
|
||||||
|
|
|
||||||
|
|
@ -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"""
|
||||||
|
|
|
||||||
|
|
@ -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',
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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)
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user