From e98b4b9e1946e2496ff50c3930cf2ed9ce4f4a05 Mon Sep 17 00:00:00 2001 From: Alejandro Alonso Date: Mon, 26 Oct 2015 10:03:30 +0100 Subject: [PATCH] Issue 3372: Velocity not calculated properly --- taiga/projects/services/stats.py | 6 ++++- tests/integration/test_stats.py | 40 +++++++++++++++++++++++++------- 2 files changed, 37 insertions(+), 9 deletions(-) diff --git a/taiga/projects/services/stats.py b/taiga/projects/services/stats.py index 998e5442..70d4cc3f 100644 --- a/taiga/projects/services/stats.py +++ b/taiga/projects/services/stats.py @@ -224,7 +224,11 @@ def get_stats_for_project(project): get(id=project.id) points = project.calculated_points - closed_points = sum(points["closed"].values()) + + closed_milestone_query = Q(role_points__user_story__milestone__closed=True) + null_milestone_query = Q(role_points__user_story__milestone__isnull=True) + closed_points = sum(project.points.filter(closed_milestone_query|null_milestone_query)\ + .exclude(value__isnull=True).values_list("value", flat=True)) closed_milestones = project.milestones.filter(closed=True).count() speed = 0 if closed_milestones != 0: diff --git a/tests/integration/test_stats.py b/tests/integration/test_stats.py index 4dfab9e4..374985c3 100644 --- a/tests/integration/test_stats.py +++ b/tests/integration/test_stats.py @@ -3,6 +3,9 @@ import pytest from .. import factories as f from tests.utils import disconnect_signals, reconnect_signals +from taiga.projects.services.stats import get_stats_for_project + + pytestmark = pytest.mark.django_db @@ -30,6 +33,8 @@ def data(): m.points2 = f.PointsFactory(project=m.project, value=2) m.points3 = f.PointsFactory(project=m.project, value=4) m.points4 = f.PointsFactory(project=m.project, value=8) + m.points5 = f.PointsFactory(project=m.project, value=16) + m.points6 = f.PointsFactory(project=m.project, value=32) m.open_status = f.UserStoryStatusFactory(is_closed=False) m.closed_status = f.UserStoryStatusFactory(is_closed=True) @@ -54,11 +59,23 @@ def data(): user_story__project=m.project, user_story__status=m.open_status, user_story__milestone=None) + # 5 and 6 are in the same milestone + m.role_points5 = f.RolePointsFactory(role=m.project.roles.all()[0], + points=m.points5, + user_story__project=m.project, + user_story__status=m.open_status) + m.role_points6 = f.RolePointsFactory(role=m.project.roles.all()[0], + points=m.points6, + user_story__project=m.project, + user_story__status=m.open_status, + user_story__milestone=m.role_points5.user_story.milestone) m.user_story1 = m.role_points1.user_story m.user_story2 = m.role_points2.user_story m.user_story3 = m.role_points3.user_story m.user_story4 = m.role_points4.user_story + m.user_story5 = m.role_points5.user_story + m.user_story6 = m.role_points6.user_story m.milestone = f.MilestoneFactory(project=m.project) @@ -66,10 +83,10 @@ def data(): def test_project_defined_points(client, data): - assert data.project.defined_points == {data.role1.pk: 15} + assert data.project.defined_points == {data.role1.pk: 63} data.role_points1.role = data.role2 data.role_points1.save() - assert data.project.defined_points == {data.role1.pk: 14, data.role2.pk: 1} + assert data.project.defined_points == {data.role1.pk: 62, data.role2.pk: 1} def test_project_closed_points(client, data): @@ -89,22 +106,29 @@ def test_project_closed_points(client, data): data.user_story4.is_closed = True data.user_story4.save() assert data.project.closed_points == {data.role1.pk: 14, data.role2.pk: 1} + #User story5 milestone isn't closed + data.user_story5.is_closed = True + data.user_story5.save() + assert data.project.closed_points == {data.role1.pk: 30, data.role2.pk: 1} + + project_stats = get_stats_for_project(data.project) + assert project_stats["closed_points"] == 15 def test_project_assigned_points(client, data): - assert data.project.assigned_points == {} + assert data.project.assigned_points == {data.role1.pk: 48} data.role_points1.role = data.role2 data.role_points1.save() - assert data.project.assigned_points == {} + assert data.project.assigned_points == {data.role1.pk: 48} data.user_story1.milestone = data.milestone data.user_story1.save() - assert data.project.assigned_points == {data.role2.pk: 1} + assert data.project.assigned_points == {data.role1.pk: 48, data.role2.pk: 1} data.user_story2.milestone = data.milestone data.user_story2.save() - assert data.project.assigned_points == {data.role1.pk: 2, data.role2.pk: 1} + assert data.project.assigned_points == {data.role1.pk: 50, data.role2.pk: 1} data.user_story3.milestone = data.milestone data.user_story3.save() - assert data.project.assigned_points == {data.role1.pk: 6, data.role2.pk: 1} + assert data.project.assigned_points == {data.role1.pk: 54, data.role2.pk: 1} data.user_story4.milestone = data.milestone data.user_story4.save() - assert data.project.assigned_points == {data.role1.pk: 14, data.role2.pk: 1} + assert data.project.assigned_points == {data.role1.pk: 62, data.role2.pk: 1}