Issue 3372: Velocity not calculated properly
parent
53723fe6a1
commit
e98b4b9e19
|
@ -224,7 +224,11 @@ def get_stats_for_project(project):
|
||||||
get(id=project.id)
|
get(id=project.id)
|
||||||
|
|
||||||
points = project.calculated_points
|
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()
|
closed_milestones = project.milestones.filter(closed=True).count()
|
||||||
speed = 0
|
speed = 0
|
||||||
if closed_milestones != 0:
|
if closed_milestones != 0:
|
||||||
|
|
|
@ -3,6 +3,9 @@ import pytest
|
||||||
from .. import factories as f
|
from .. import factories as f
|
||||||
from tests.utils import disconnect_signals, reconnect_signals
|
from tests.utils import disconnect_signals, reconnect_signals
|
||||||
|
|
||||||
|
from taiga.projects.services.stats import get_stats_for_project
|
||||||
|
|
||||||
|
|
||||||
pytestmark = pytest.mark.django_db
|
pytestmark = pytest.mark.django_db
|
||||||
|
|
||||||
|
|
||||||
|
@ -30,6 +33,8 @@ def data():
|
||||||
m.points2 = f.PointsFactory(project=m.project, value=2)
|
m.points2 = f.PointsFactory(project=m.project, value=2)
|
||||||
m.points3 = f.PointsFactory(project=m.project, value=4)
|
m.points3 = f.PointsFactory(project=m.project, value=4)
|
||||||
m.points4 = f.PointsFactory(project=m.project, value=8)
|
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.open_status = f.UserStoryStatusFactory(is_closed=False)
|
||||||
m.closed_status = f.UserStoryStatusFactory(is_closed=True)
|
m.closed_status = f.UserStoryStatusFactory(is_closed=True)
|
||||||
|
@ -54,11 +59,23 @@ def data():
|
||||||
user_story__project=m.project,
|
user_story__project=m.project,
|
||||||
user_story__status=m.open_status,
|
user_story__status=m.open_status,
|
||||||
user_story__milestone=None)
|
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_story1 = m.role_points1.user_story
|
||||||
m.user_story2 = m.role_points2.user_story
|
m.user_story2 = m.role_points2.user_story
|
||||||
m.user_story3 = m.role_points3.user_story
|
m.user_story3 = m.role_points3.user_story
|
||||||
m.user_story4 = m.role_points4.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)
|
m.milestone = f.MilestoneFactory(project=m.project)
|
||||||
|
|
||||||
|
@ -66,10 +83,10 @@ def data():
|
||||||
|
|
||||||
|
|
||||||
def test_project_defined_points(client, 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.role = data.role2
|
||||||
data.role_points1.save()
|
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):
|
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.is_closed = True
|
||||||
data.user_story4.save()
|
data.user_story4.save()
|
||||||
assert data.project.closed_points == {data.role1.pk: 14, data.role2.pk: 1}
|
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):
|
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.role = data.role2
|
||||||
data.role_points1.save()
|
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.milestone = data.milestone
|
||||||
data.user_story1.save()
|
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.milestone = data.milestone
|
||||||
data.user_story2.save()
|
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.milestone = data.milestone
|
||||||
data.user_story3.save()
|
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.milestone = data.milestone
|
||||||
data.user_story4.save()
|
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}
|
||||||
|
|
Loading…
Reference in New Issue