From 15d8793fe3f24b723d04d6b2d15e1d603927e606 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Fri, 18 Dec 2015 09:20:48 +0100 Subject: [PATCH] [Backport] Improving milestones API a bit more --- taiga/projects/milestones/api.py | 31 +++++++++++++++++++----- taiga/projects/milestones/serializers.py | 27 +-------------------- 2 files changed, 26 insertions(+), 32 deletions(-) diff --git a/taiga/projects/milestones/api.py b/taiga/projects/milestones/api.py index 056ed7d3..94cb04ec 100644 --- a/taiga/projects/milestones/api.py +++ b/taiga/projects/milestones/api.py @@ -15,6 +15,7 @@ # along with this program. If not, see . from django.apps import apps +from django.db.models import Prefetch from taiga.base import filters from taiga.base import response @@ -25,6 +26,8 @@ from taiga.base.utils.db import get_object_or_none from taiga.projects.notifications.mixins import WatchedResourceMixin, WatchersViewSetMixin from taiga.projects.history.mixins import HistoryResourceMixin +from taiga.projects.votes.utils import attach_total_voters_to_queryset, attach_is_voter_to_queryset +from taiga.projects.notifications.utils import attach_watchers_to_queryset, attach_is_watcher_to_queryset from . import serializers from . import models @@ -62,14 +65,30 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCrudView def get_queryset(self): qs = super().get_queryset() - qs = qs.prefetch_related("user_stories", - "user_stories__role_points", - "user_stories__role_points__points", - "user_stories__role_points__role") - qs = qs.select_related("project", - "owner") + # Userstories prefetching + UserStory = apps.get_model("userstories", "UserStory") + us_qs = UserStory.objects.prefetch_related("role_points", + "role_points__points", + "role_points__role") + us_qs = us_qs.select_related("milestone", + "project", + "status", + "owner", + "assigned_to", + "generated_from_issue") + + us_qs = self.attach_watchers_attrs_to_queryset(us_qs) + + if self.request.user.is_authenticated(): + us_qs = attach_is_voter_to_queryset(self.request.user, us_qs) + us_qs = attach_is_watcher_to_queryset(self.request.user, us_qs) + + qs = qs.prefetch_related(Prefetch("user_stories", queryset=us_qs)) + + # Milestones prefetching + qs = qs.select_related("project", "owner") qs = self.attach_watchers_attrs_to_queryset(qs) qs = qs.order_by("-estimated_start") diff --git a/taiga/projects/milestones/serializers.py b/taiga/projects/milestones/serializers.py index a622ea0f..5d3ddf7b 100644 --- a/taiga/projects/milestones/serializers.py +++ b/taiga/projects/milestones/serializers.py @@ -20,15 +20,13 @@ from taiga.base.api import serializers from taiga.base.utils import json from taiga.projects.notifications.mixins import WatchedResourceModelSerializer from taiga.projects.notifications.validators import WatchersValidator -from taiga.projects.votes.utils import attach_total_voters_to_queryset, attach_is_voter_to_queryset -from taiga.projects.notifications.utils import attach_watchers_to_queryset, attach_is_watcher_to_queryset from ..userstories.serializers import UserStoryListSerializer from . import models class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, serializers.ModelSerializer): - user_stories = serializers.SerializerMethodField("get_user_stories") + user_stories = UserStoryListSerializer(many=True, required=False, read_only=True) total_points = serializers.SerializerMethodField("get_total_points") closed_points = serializers.SerializerMethodField("get_closed_points") @@ -36,29 +34,6 @@ class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, ser model = models.Milestone read_only_fields = ("id", "created_date", "modified_date") - def get_user_stories(self, obj): - qs = obj.user_stories.prefetch_related("role_points", - "role_points__points", - "role_points__role") - - qs = qs.select_related("milestone", - "project", - "status", - "owner", - "assigned_to", - "generated_from_issue") - - request = self.context.get("request", None) - requesting_user = request and request.user or None - if requesting_user and requesting_user.is_authenticated(): - qs = attach_is_voter_to_queryset(requesting_user, qs) - qs = attach_is_watcher_to_queryset(requesting_user, qs) - - qs = attach_total_voters_to_queryset(qs) - qs = attach_watchers_to_queryset(qs) - - return UserStoryListSerializer(qs, many=True).data - def get_total_points(self, obj): return sum(obj.total_points.values())