Generating initial issues stats on the api

remotes/origin/enhancement/email-actions
Jesús Espino 2013-11-08 14:22:11 +01:00
parent 76abf20444
commit cb6c1f9748
1 changed files with 30 additions and 1 deletions

View File

@ -1,6 +1,6 @@
# -*- coding: utf-8 -*- # -*- 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 django.shortcuts import get_object_or_404
from rest_framework.permissions import IsAuthenticated from rest_framework.permissions import IsAuthenticated
@ -82,6 +82,35 @@ class ProjectViewSet(ModelCrudViewSet):
'client-increment': client_increment, '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): def get_queryset(self):
qs = super(ProjectViewSet, self).get_queryset() qs = super(ProjectViewSet, self).get_queryset()
qs = qs.filter(Q(owner=self.request.user) | qs = qs.filter(Q(owner=self.request.user) |