news in_favs nested fix

This commit is contained in:
alex 2019-11-15 15:28:27 +03:00
parent 277fe8d17e
commit 71dd52c194
5 changed files with 53 additions and 45 deletions

View File

@ -95,12 +95,14 @@ class NewsQuerySet(TranslationQuerysetMixin):
# todo: filter by best score # todo: filter by best score
# todo: filter by country? # todo: filter by country?
def should_read(self, news): def should_read(self, news, user):
return self.model.objects.exclude(pk=news.pk).published(). \ return self.model.objects.exclude(pk=news.pk).published(). \
annotate_in_favorites(user). \
with_base_related().by_type(news.news_type).distinct().order_by('?') with_base_related().by_type(news.news_type).distinct().order_by('?')
def same_theme(self, news): def same_theme(self, news, user):
return self.model.objects.exclude(pk=news.pk).published(). \ return self.model.objects.exclude(pk=news.pk).published(). \
annotate_in_favorites(user). \
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')
@ -212,13 +214,11 @@ class News(BaseAttributes, TranslatedFieldsMixin):
def web_url(self): def web_url(self):
return reverse('web:news:rud', kwargs={'slug': self.slug}) return reverse('web:news:rud', kwargs={'slug': self.slug})
@property def should_read(self, user):
def should_read(self): return self.__class__.objects.should_read(self, user)[:3]
return self.__class__.objects.should_read(self)[:3]
@property def same_theme(self, user):
def same_theme(self): return self.__class__.objects.same_theme(self, user)[:3]
return self.__class__.objects.same_theme(self)[:3]
@property @property
def main_image(self): def main_image(self):

View File

@ -1,6 +1,7 @@
"""News app common serializers.""" """News app common serializers."""
from django.utils.translation import gettext_lazy as _ from django.utils.translation import gettext_lazy as _
from rest_framework import serializers from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
from account.serializers.common import UserBaseSerializer from account.serializers.common import UserBaseSerializer
from gallery.models import Image from gallery.models import Image
@ -151,7 +152,7 @@ class NewsBaseSerializer(ProjectModelSerializer):
'tags', 'tags',
'slug', 'slug',
'in_favorites', 'in_favorites',
'view_counter' 'view_counter',
) )
@ -208,8 +209,8 @@ class NewsDetailSerializer(NewsBaseSerializer):
class NewsDetailWebSerializer(NewsDetailSerializer): class NewsDetailWebSerializer(NewsDetailSerializer):
"""News detail serializer for web users..""" """News detail serializer for web users.."""
same_theme = NewsSimilarListSerializer(many=True, read_only=True) same_theme = SerializerMethodField()
should_read = NewsSimilarListSerializer(many=True, read_only=True) should_read = SerializerMethodField()
agenda = AgendaSerializer() agenda = AgendaSerializer()
banner = NewsBannerSerializer() banner = NewsBannerSerializer()
@ -223,6 +224,12 @@ class NewsDetailWebSerializer(NewsDetailSerializer):
'banner', 'banner',
) )
def get_same_theme(self, obj):
return NewsSimilarListSerializer(obj.same_theme(self.context['request'].user), many=True, read_only=True).data
def get_should_read(self, obj):
return NewsSimilarListSerializer(obj.should_read(self.context['request'].user), many=True, read_only=True).data
class NewsBackOfficeBaseSerializer(NewsBaseSerializer): class NewsBackOfficeBaseSerializer(NewsBaseSerializer):
"""News back office base serializer.""" """News back office base serializer."""

View File

@ -1,5 +1,7 @@
from pprint import pprint from pprint import pprint
from django.db.models import Count
from transfer.models import EmailAddresses, NewsletterSubscriber from transfer.models import EmailAddresses, NewsletterSubscriber
from transfer.serializers.notification import SubscriberSerializer, NewsletterSubscriberSerializer from transfer.serializers.notification import SubscriberSerializer, NewsletterSubscriberSerializer
@ -25,12 +27,12 @@ def transfer_newsletter_subscriber():
'email_address__locale', 'email_address__locale',
'created_at', 'created_at',
) )
serialized_data = NewsletterSubscriberSerializer(data=list(queryset.values()), many=True) # serialized_data = NewsletterSubscriberSerializer(data=list(queryset.values()), many=True)
if serialized_data.is_valid(): # if serialized_data.is_valid():
serialized_data.save() # serialized_data.save()
else: # else:
pprint(f'NewsletterSubscriber serializer errors: {serialized_data.errors}') # pprint(f'NewsletterSubscriber serializer errors: {serialized_data.errors}')
data_types = { data_types = {

View File

@ -1201,4 +1201,4 @@ class NewsletterSubscriber(MigrateMixin):
class Meta: class Meta:
managed = False managed = False
db_table = 'newsletter_subscriber' db_table = 'newsletter_subscriptions'

View File

@ -1,4 +1,6 @@
from rest_framework import serializers from rest_framework import serializers
from account.models import User
from notification.models import Subscriber from notification.models import Subscriber
@ -44,36 +46,33 @@ class NewsletterSubscriberSerializer(serializers.Serializer):
email_address__locale = serializers.CharField(allow_null=True) email_address__locale = serializers.CharField(allow_null=True)
created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S') created_at = serializers.DateTimeField(format='%m-%d-%Y %H:%M:%S')
# def validate(self, data): def validate(self, data):
# data.update({ data.update({
# 'reviewer': self.get_reviewer(data), 'old_id': data.pop('id'),
# 'status': Review.READY if data['aasm_state'] == 'published' else Review.TO_INVESTIGATE, 'email': data.pop('email_address__email'),
# 'published_at': data.pop('created_at'), 'ip_address': data.pop('email_address__ip'),
# 'old_id': data.pop('id'), 'country_code': data.pop('email_address__country_code'),
# 'content_object': self.get_establishment(data), 'locale': data.pop('email_address__locale'),
# }) 'created': data.pop('created_at'),
# data.pop('reviewer_id') 'user_id': self.get_user(data),
# data.pop('establishment_id') })
# data.pop('aasm_state') data.pop('email_address__account_id')
# return data return data
#
# def create(self, validated_data): # def create(self, validated_data):
# obj, _ = Review.objects.update_or_create( # obj, _ = Review.objects.update_or_create(
# old_id=validated_data['old_id'], # old_id=validated_data['old_id'],
# defaults=validated_data, # defaults=validated_data,
# ) # )
# return obj # return obj
#
# @staticmethod @staticmethod
# def get_reviewer(data): def get_user(data):
# user = User.objects.filter(old_id=data['reviewer_id']).first()
# if not user: if not data['email_address__account_id']:
# raise ValueError(f"User account not found with old_id {data['reviewer_id']}") return None
# return user
# user = User.objects.filter(old_id=data['email_address__account_id']).first()
# @staticmethod if not user:
# def get_establishment(data): raise ValueError(f"User account not found with old_id {data['email_address__account_id']}")
# establishment = Establishment.objects.filter(old_id=data['establishment_id']).first() return user.id
# if not establishment:
# raise ValueError(f"Establishment not found with old_id {data['establishment_id']}: ")
# return establishment