From d10ad28310fa603e46fea018b2064bace8773c73 Mon Sep 17 00:00:00 2001 From: stepan323446 Date: Fri, 16 Jan 2026 12:47:44 +0100 Subject: [PATCH] score on publications --- publications/managers.py | 22 +++++++++++++++++++++- publications/serializers.py | 5 +++-- publications/views.py | 14 ++++++++++++++ 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/publications/managers.py b/publications/managers.py index 3f1061b..21a534f 100644 --- a/publications/managers.py +++ b/publications/managers.py @@ -1,8 +1,9 @@ from typing import TypeVar -from django.db.models import Avg +from django.db.models import Avg, OuterRef, IntegerField, Value, Subquery from django.db.models.functions import Coalesce from django.db import models + T = TypeVar('T') class PublicationQuerySet(models.QuerySet[T]): @@ -15,6 +16,22 @@ class PublicationQuerySet(models.QuerySet[T]): from .models import Publication qs = self return qs.filter(status=Publication.StatusVarioations.PUBLIC.value) + + def with_user_score(self, user): + from .models import Rating + + user_rating = Rating.objects.filter( + publication=OuterRef("pk"), + user=user + ).values("score")[:1] + + return self.annotate( + current_user_score=Coalesce( + Subquery(user_rating, output_field=IntegerField()), + Value(0) + ) + ) + class PublicationManager(models.Manager[T]): def get_queryset(self): @@ -23,5 +40,8 @@ class PublicationManager(models.Manager[T]): def with_related(self): return self.get_queryset().select_related('user', 'category') + def with_user_score(self, user): + return self.get_queryset().with_user_score(user) + def only_publish(self): return self.get_queryset().only_publish() \ No newline at end of file diff --git a/publications/serializers.py b/publications/serializers.py index 17b373d..528a34d 100644 --- a/publications/serializers.py +++ b/publications/serializers.py @@ -14,6 +14,7 @@ class PublicationSerializer(serializers.ModelSerializer): category_detail = CategorySerializer(source="category", read_only=True) user_detail = PublicUserSerializer(source="user", read_only=True) average_score = serializers.SerializerMethodField(read_only=True) + current_user_score = serializers.IntegerField(default=0) @extend_schema_field(serializers.FloatField()) def get_average_score(self, obj): @@ -51,9 +52,9 @@ class PublicationSerializer(serializers.ModelSerializer): class Meta: model = Publication - fields = ('pk', 'image', 'video', 'content_type', 'status', 'average_score', 'description', 'is_pinned', 'user', 'user_detail', 'category', 'category_detail','time_created', 'time_updated') + fields = ('pk', 'image', 'video', 'content_type', 'status', 'average_score', 'current_user_score', 'description', 'is_pinned', 'user', 'user_detail', 'category', 'category_detail','time_created', 'time_updated') - read_only_fields = ('time_created', 'time_updated', 'is_pinned', 'user', 'status') + read_only_fields = ('time_created', 'time_updated', 'is_pinned', 'user', 'status', 'current_user_score') class AdminPublicationSerializer(PublicationSerializer): class Meta(PublicationSerializer.Meta): diff --git a/publications/views.py b/publications/views.py index 22d60de..603d852 100644 --- a/publications/views.py +++ b/publications/views.py @@ -34,6 +34,13 @@ class PublicationsAPIView(ListCreateAPIView): ordering = ['-time_created'] search_fields = ['user__username', 'description'] + def get_queryset(self): + user: User = self.request.user + if user.is_authenticated: + return super().get_queryset().with_user_score(user) + + return super().get_queryset() + def get_permissions(self): if self.request.method == 'POST': return [IsAuthenticated()] @@ -51,6 +58,13 @@ class PublicationDetailAPIView(RetrieveAPIView): queryset = Publication.objects.with_related().only_publish() serializer_class = PublicationSerializer + def get_queryset(self): + user: User = self.request.user + if user.is_authenticated: + return super().get_queryset().with_user_score(user) + + return super().get_queryset() + @extend_schema( tags=['Publications'], methods=['GET'],