diff --git a/taiga/projects/userstories/models.py b/taiga/projects/userstories/models.py index f9688380..54458b3c 100644 --- a/taiga/projects/userstories/models.py +++ b/taiga/projects/userstories/models.py @@ -126,9 +126,15 @@ class UserStory(OCCModelMixin, WatchedModelMixin, BlockedMixin, TaggedMixin, mod return self.role_points def get_total_points(self): + not_null_role_points = self.role_points.select_related("points").\ + exclude(points__value__isnull=True) + + #If we only have None values the sum should be None + if not not_null_role_points: + return None + total = 0.0 - for rp in self.role_points.select_related("points"): - if rp.points.value: - total += rp.points.value + for rp in not_null_role_points: + total += rp.points.value return total diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index 8fbb33ab..83c35c65 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -200,3 +200,34 @@ def test_archived_filter(client): data = {"is_archived": 1} response = client.get(url, data) assert len(json.loads(response.content)) == 1 + +def test_get_total_points(client): + project = f.ProjectFactory.create() + + role1 = f.RoleFactory.create(project=project) + role2 = f.RoleFactory.create(project=project) + + points1 = f.PointsFactory.create(project=project, value=None) + points2 = f.PointsFactory.create(project=project, value=1) + points3 = f.PointsFactory.create(project=project, value=2) + + us_with_points = f.UserStoryFactory.create(project=project) + us_with_points.role_points.all().delete() + f.RolePointsFactory.create(user_story=us_with_points, role=role1, points=points2) + f.RolePointsFactory.create(user_story=us_with_points, role=role2, points=points3) + + assert us_with_points.get_total_points() == 3.0 + + us_without_points = f.UserStoryFactory.create(project=project) + us_without_points.role_points.all().delete() + f.RolePointsFactory.create(user_story=us_without_points, role=role1, points=points1) + f.RolePointsFactory.create(user_story=us_without_points, role=role2, points=points1) + + assert us_without_points.get_total_points() is None + + us_mixed = f.UserStoryFactory.create(project=project) + us_mixed.role_points.all().delete() + f.RolePointsFactory.create(user_story=us_mixed, role=role1, points=points1) + f.RolePointsFactory.create(user_story=us_mixed, role=role2, points=points2) + + assert us_mixed.get_total_points() == 1.0