From e236d9ca970dad17fbe1c3bdd2c15eb3639348ec Mon Sep 17 00:00:00 2001 From: Marsel Date: Mon, 2 Dec 2024 19:12:42 +0300 Subject: [PATCH 1/2] Fix export users activity --- users/services/users_activity.py | 54 ++++++++++++++++++++++++++------ 1 file changed, 44 insertions(+), 10 deletions(-) diff --git a/users/services/users_activity.py b/users/services/users_activity.py index 71f6a95b..4d536011 100644 --- a/users/services/users_activity.py +++ b/users/services/users_activity.py @@ -4,12 +4,15 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import ( + Q, Count, + Value, QuerySet, OuterRef, Subquery, IntegerField, ) +from django.db.models.functions import Coalesce from users.models import CustomUser from news.models import News @@ -90,18 +93,33 @@ def __prepare_user_data(self, user: CustomUser) -> dict[str, Any]: def __get_user_queryset(self) -> QuerySet[CustomUser]: user_content_type = ContentType.objects.get_for_model(CustomUser) - projects_in_program_subqury = ( + projects_in_program_subquery = ( PartnerProgramUserProfile.objects .filter(user_id=OuterRef("id")) .exclude(project=None) - .annotate(count=Count("id")) - .values("count") + .values("user_id") + .annotate(total=Count("id")) + .values("total") ) - posts_count_subqury = ( + posts_count_subquery = ( News.objects .filter(content_type=user_content_type, object_id=OuterRef("id")) - .annotate(count=Count("id")) - .values("count") + .values("object_id") + .annotate(total=Count("id")) + .values("total") + ) + likes_count_subquery = ( + CustomUser.objects + .filter(likes__user_id=OuterRef("id")) + .annotate(total_likes=Count("likes")) + .values("total_likes") + ) + + projects_in_program_subquery = ( + CustomUser.objects + .filter(partner_program_profiles__user_id=OuterRef("id")) + .annotate(total_proj=Count("id")) + .values("total_proj") ) users: QuerySet[CustomUser] = ( @@ -116,11 +134,27 @@ def __get_user_queryset(self) -> QuerySet[CustomUser]: "partner_program_profiles__partner_program", ) .annotate( - likes_count=Count("likes"), projects_count=Count("leaders_projects"), - program_profiles_count=Count("partner_program_profiles"), - projects_in_program=Subquery(projects_in_program_subqury, output_field=IntegerField()), - posts_count=Subquery(posts_count_subqury, output_field=IntegerField()), + likes_count=Coalesce( + Subquery(likes_count_subquery, output_field=IntegerField()), + Value(0), + output_field=IntegerField(), + ), + program_profiles_count=Coalesce( + Subquery(projects_in_program_subquery, output_field=IntegerField()), + Value(0), + output_field=IntegerField(), + ), + projects_in_program=Coalesce( + Subquery(projects_in_program_subquery, output_field=IntegerField()), + Value(0), + output_field=IntegerField(), + ), + posts_count=Coalesce( + Subquery(posts_count_subquery, output_field=IntegerField()), + Value(0), + output_field=IntegerField(), + ), ) ) return users From 6310bfc825d0cc0a8c216761a3c2904742fd9286 Mon Sep 17 00:00:00 2001 From: Marsel Date: Mon, 2 Dec 2024 19:14:10 +0300 Subject: [PATCH 2/2] Flake8 fix --- users/services/users_activity.py | 1 - 1 file changed, 1 deletion(-) diff --git a/users/services/users_activity.py b/users/services/users_activity.py index 4d536011..1f3a7ffa 100644 --- a/users/services/users_activity.py +++ b/users/services/users_activity.py @@ -4,7 +4,6 @@ from django.contrib.contenttypes.models import ContentType from django.db.models import ( - Q, Count, Value, QuerySet,