From cb6c1f9748661a91b12571d97b3b9fba80fb8fc3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Fri, 8 Nov 2013 14:22:11 +0100 Subject: [PATCH] Generating initial issues stats on the api --- greenmine/projects/api.py | 31 ++++++++++++++++++++++++++++++- 1 file changed, 30 insertions(+), 1 deletion(-) diff --git a/greenmine/projects/api.py b/greenmine/projects/api.py index d74fef68..ecd268c2 100644 --- a/greenmine/projects/api.py +++ b/greenmine/projects/api.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -from django.db.models import Q +from django.db.models import Q, Count from django.shortcuts import get_object_or_404 from rest_framework.permissions import IsAuthenticated @@ -82,6 +82,35 @@ class ProjectViewSet(ModelCrudViewSet): 'client-increment': client_increment, } + @detail_route(methods=['get']) + def issues_stats(self, request, pk=None): + project = get_object_or_404(models.Project, pk=pk) + project_issues_stats = { + 'total_issues': project.issues.all().count(), + 'issues_per_type': self._get_issues_counter_per_field(project.issues.all(), "type__name"), + 'issues_per_status': self._get_issues_counter_per_field(project.issues.all(), "status__name"), + 'issues_per_priority': self._get_issues_counter_per_field(project.issues.all(), "priority__name"), + 'issues_per_severity': self._get_issues_counter_per_field(project.issues.all(), "severity__name"), + 'issues_per_owner': self._get_issues_counter_per_field(project.issues.all(), "owner"), + 'issues_per_assigned_to': self._get_issues_assigned_to_counter(project.issues.all()), + } + return Response(project_issues_stats) + + def _get_issues_assigned_to_counter(self, issues): + issues_per_assigned_to = self._get_issues_counter_per_field(issues, "assigned_to") + if None in issues_per_assigned_to: + del issues_per_assigned_to[None] + issues_per_assigned_to["Unassigned"] = issues.count() - sum(issues_per_assigned_to.values()) + return issues_per_assigned_to + + def _get_issues_counter_per_field(self, issues, field): + return dict( + map( + lambda x: (x[field], x[field+'__count']), + issues.values(field).order_by().annotate(Count(field)) + ) + ) + def get_queryset(self): qs = super(ProjectViewSet, self).get_queryset() qs = qs.filter(Q(owner=self.request.user) |