diff --git a/taiga/projects/milestones/services.py b/taiga/projects/milestones/services.py index 92db010f..396787d3 100644 --- a/taiga/projects/milestones/services.py +++ b/taiga/projects/milestones/services.py @@ -24,14 +24,18 @@ from taiga.projects.issues.models import Issue from taiga.projects.tasks.models import Task from taiga.projects.userstories.models import UserStory -from . import models - def calculate_milestone_is_closed(milestone): - return (milestone.user_stories.all().count() > 0 and - all([task.status is not None and task.status.is_closed for task in milestone.tasks.all()]) and - all([user_story.is_closed for user_story in milestone.user_stories.all()]) or - all([issue.is_closed for issue in milestone.issues.all()])) + uss_check = milestone.user_stories.all().count() > 0 and all( + [task.status is not None and task.status.is_closed for task in + milestone.tasks.all()]) and all( + [user_story.is_closed for user_story in milestone.user_stories.all()]) + issues_check = milestone.issues.all().count() > 0 and all( + [issue.is_closed for issue in milestone.issues.all()]) + tasks_check = milestone.tasks.all().count() > 0 and all( + [task.is_closed for task in milestone.tasks.all()]) + + return uss_check or issues_check or tasks_check def close_milestone(milestone): diff --git a/taiga/projects/userstories/signals.py b/taiga/projects/userstories/signals.py index dc7f9151..bb9413da 100644 --- a/taiga/projects/userstories/signals.py +++ b/taiga/projects/userstories/signals.py @@ -72,7 +72,6 @@ def update_milestone_of_tasks_when_edit_us(sender, instance, created, **kwargs): def try_to_close_or_open_us_and_milestone_when_create_or_edit_us(sender, instance, created, **kwargs): if instance._importing: return - _try_to_close_or_open_us_when_create_or_edit_us(instance) _try_to_close_or_open_milestone_when_create_or_edit_us(instance) diff --git a/tests/factories.py b/tests/factories.py index daf47f25..9ce34ecf 100644 --- a/tests/factories.py +++ b/tests/factories.py @@ -626,6 +626,10 @@ def create_issue(**kwargs): return IssueFactory.create(**defaults) +class Missing: + pass + + def create_task(**kwargs): "Create a task and along with its dependencies." owner = kwargs.pop("owner", None) @@ -636,13 +640,23 @@ def create_task(**kwargs): if project is None: project = ProjectFactory.create(owner=owner) + status = kwargs.pop("status", None) + milestone = kwargs.pop("milestone", None) + defaults = { "project": project, "owner": owner, - "status": TaskStatusFactory.create(project=project), - "milestone": MilestoneFactory.create(project=project), - "user_story": UserStoryFactory.create(project=project, owner=owner), + "status": status or TaskStatusFactory.create(project=project), + "milestone": milestone or MilestoneFactory.create(project=project), } + + user_story = kwargs.pop("user_story", Missing) + + defaults["user_story"] = ( + UserStoryFactory.create(project=project, owner=owner, milestone=defaults["milestone"]) + if user_story is Missing + else user_story + ) defaults.update(kwargs) return TaskFactory.create(**defaults) diff --git a/tests/integration/test_milestones.py b/tests/integration/test_milestones.py index 873d4090..39d4a853 100644 --- a/tests/integration/test_milestones.py +++ b/tests/integration/test_milestones.py @@ -302,19 +302,15 @@ def test_api_move_tasks_to_another_sprint_close_previous(client): f.MembershipFactory.create(project=project, user=project.owner, is_admin=True) milestone1 = f.MilestoneFactory.create(project=project) - milestone2 = f.MilestoneFactory.create(project=project) closed_status = f.TaskStatusFactory.create(project=project, is_closed=True) + task1 = f.create_task(project=project, milestone=milestone1, taskboard_order=1, status=closed_status) task2 = f.create_task(project=project, milestone=milestone1, taskboard_order=2) - milestone = project.milestones.get(id=milestone1.id) - manager_tasks = milestone.tasks - count_result = manager_tasks.count() - - assert count_result == 2 + assert project.milestones.get(id=milestone1.id).tasks.count() == 2 assert not milestone1.closed url = reverse("milestones-move-tasks-to-sprint", kwargs={"pk": milestone1.pk})