From b2c4f79d6d606534f5d13e1400b9d8ca5580e196 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jes=C3=BAs=20Espino?= Date: Tue, 12 Nov 2013 17:53:38 +0100 Subject: [PATCH] Redesign the stats of issues --- greenmine/projects/aggregates/stats.py | 69 +++++++++++++++++--------- 1 file changed, 45 insertions(+), 24 deletions(-) diff --git a/greenmine/projects/aggregates/stats.py b/greenmine/projects/aggregates/stats.py index d0bf3603..3fcf60bf 100644 --- a/greenmine/projects/aggregates/stats.py +++ b/greenmine/projects/aggregates/stats.py @@ -59,35 +59,56 @@ def _get_milestones_stats_for_backlog(project): } -def _get_issues_assigned_to_counter(issues): - issues_per_assigned_to = _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(issues, field): - return dict( - map( - lambda x: (x[field], x[field+'__count']), - issues.values(field).order_by().annotate(Count(field)) - ) - ) +def _count_status_object(status_obj, counting_storage): + if status_obj.id in counting_storage: + counting_storage[status_obj.id]['count'] += 1 + else: + counting_storage[status_obj.id] = {} + counting_storage[status_obj.id]['count'] = 1 + counting_storage[status_obj.id]['name'] = status_obj.name + counting_storage[status_obj.id]['id'] = status_obj.id + counting_storage[status_obj.id]['color'] = status_obj.color +def _count_owned_object(user_obj, counting_storage): + if user_obj: + if user_obj.id in counting_storage: + counting_storage[user_obj.id]['count'] += 1 + else: + counting_storage[user_obj.id] = {} + counting_storage[user_obj.id]['count'] = 1 + counting_storage[user_obj.id]['username'] = user_obj.username + counting_storage[user_obj.id]['id'] = user_obj.id + counting_storage[user_obj.id]['color'] = user_obj.color + else: + if 0 in counting_storage: + counting_storage[0]['count'] += 1 + else: + counting_storage[0] = {} + counting_storage[0]['count'] = 1 + counting_storage[0]['username'] = 'Unassigned' + counting_storage[0]['id'] = 0 + counting_storage[0]['color'] = 'black' def get_stats_for_project_issues(project): - queryset = project.issues.all() project_issues_stats = { - 'total_issues': queryset.count(), - 'issues_per_type': _get_issues_counter_per_field(queryset, "type__name"), - 'issues_per_status': _get_issues_counter_per_field(queryset, "status__name"), - 'issues_per_priority': _get_issues_counter_per_field(queryset, "priority__name"), - 'issues_per_severity': _get_issues_counter_per_field(queryset, "severity__name"), - 'issues_per_owner': _get_issues_counter_per_field(queryset, "owner"), - 'issues_per_assigned_to': _get_issues_assigned_to_counter(queryset), + 'total_issues': 0, + 'issues_per_type': {}, + 'issues_per_status': {}, + 'issues_per_priority': {}, + 'issues_per_severity': {}, + 'issues_per_owner': {}, + 'issues_per_assigned_to': {}, } + + for issue in project.issues.all(): + project_issues_stats['total_issues'] += 1 + _count_status_object(issue.type, project_issues_stats['issues_per_type']) + _count_status_object(issue.status, project_issues_stats['issues_per_status']) + _count_status_object(issue.priority, project_issues_stats['issues_per_priority']) + _count_status_object(issue.severity, project_issues_stats['issues_per_severity']) + _count_owned_object(issue.owner, project_issues_stats['issues_per_owner']) + _count_owned_object(issue.assigned_to, project_issues_stats['issues_per_assigned_to']) + return project_issues_stats