diff --git a/apps/news/models.py b/apps/news/models.py index 94b43d0a..550d5baa 100644 --- a/apps/news/models.py +++ b/apps/news/models.py @@ -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): diff --git a/apps/news/serializers.py b/apps/news/serializers.py index fc03a704..7638847f 100644 --- a/apps/news/serializers.py +++ b/apps/news/serializers.py @@ -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.""" diff --git a/apps/notification/transfer_data.py b/apps/notification/transfer_data.py index cc5542b4..487501c3 100644 --- a/apps/notification/transfer_data.py +++ b/apps/notification/transfer_data.py @@ -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 = { diff --git a/apps/transfer/models.py b/apps/transfer/models.py index 25fdb527..29ccb4bd 100644 --- a/apps/transfer/models.py +++ b/apps/transfer/models.py @@ -1201,4 +1201,4 @@ class NewsletterSubscriber(MigrateMixin): class Meta: managed = False - db_table = 'newsletter_subscriber' + db_table = 'newsletter_subscriptions' diff --git a/apps/transfer/serializers/notification.py b/apps/transfer/serializers/notification.py index dc685a0c..7eb7bdac 100644 --- a/apps/transfer/serializers/notification.py +++ b/apps/transfer/serializers/notification.py @@ -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