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

View File

@ -1,6 +1,7 @@
"""News app common serializers."""
from django.utils.translation import gettext_lazy as _
from rest_framework import serializers
from rest_framework.fields import SerializerMethodField
from account.serializers.common import UserBaseSerializer
from gallery.models import Image
@ -151,7 +152,7 @@ class NewsBaseSerializer(ProjectModelSerializer):
'tags',
'slug',
'in_favorites',
'view_counter'
'view_counter',
)
@ -208,8 +209,8 @@ class NewsDetailSerializer(NewsBaseSerializer):
class NewsDetailWebSerializer(NewsDetailSerializer):
"""News detail serializer for web users.."""
same_theme = NewsSimilarListSerializer(many=True, read_only=True)
should_read = NewsSimilarListSerializer(many=True, read_only=True)
same_theme = SerializerMethodField()
should_read = SerializerMethodField()
agenda = AgendaSerializer()
banner = NewsBannerSerializer()
@ -223,6 +224,12 @@ class NewsDetailWebSerializer(NewsDetailSerializer):
'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):
"""News back office base serializer."""

View File

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

View File

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

View File

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