[Backport] Improving milestones API a bit more

remotes/origin/logger
Alejandro Alonso 2015-12-18 09:20:48 +01:00
parent 4ffc983e77
commit 15d8793fe3
2 changed files with 26 additions and 32 deletions

View File

@ -15,6 +15,7 @@
# along with this program. If not, see <http://www.gnu.org/licenses/>. # along with this program. If not, see <http://www.gnu.org/licenses/>.
from django.apps import apps from django.apps import apps
from django.db.models import Prefetch
from taiga.base import filters from taiga.base import filters
from taiga.base import response 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.notifications.mixins import WatchedResourceMixin, WatchersViewSetMixin
from taiga.projects.history.mixins import HistoryResourceMixin 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 serializers
from . import models from . import models
@ -62,14 +65,30 @@ class MilestoneViewSet(HistoryResourceMixin, WatchedResourceMixin, ModelCrudView
def get_queryset(self): def get_queryset(self):
qs = super().get_queryset() 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", # Userstories prefetching
"owner") 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 = self.attach_watchers_attrs_to_queryset(qs)
qs = qs.order_by("-estimated_start") qs = qs.order_by("-estimated_start")

View File

@ -20,15 +20,13 @@ from taiga.base.api import serializers
from taiga.base.utils import json from taiga.base.utils import json
from taiga.projects.notifications.mixins import WatchedResourceModelSerializer from taiga.projects.notifications.mixins import WatchedResourceModelSerializer
from taiga.projects.notifications.validators import WatchersValidator 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 ..userstories.serializers import UserStoryListSerializer
from . import models from . import models
class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, serializers.ModelSerializer): 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") total_points = serializers.SerializerMethodField("get_total_points")
closed_points = serializers.SerializerMethodField("get_closed_points") closed_points = serializers.SerializerMethodField("get_closed_points")
@ -36,29 +34,6 @@ class MilestoneSerializer(WatchersValidator, WatchedResourceModelSerializer, ser
model = models.Milestone model = models.Milestone
read_only_fields = ("id", "created_date", "modified_date") 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): def get_total_points(self, obj):
return sum(obj.total_points.values()) return sum(obj.total_points.values())