Improving milestones API a bit more
parent
8d241479fa
commit
1f8ef9bec3
|
@ -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")
|
||||||
|
|
|
@ -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())
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue