diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index f1c5d683..0f260e2c 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -105,9 +105,21 @@ def update_userstories_order_in_bulk(bulk_data: list, field: str, project: objec def update_userstories_milestone_in_bulk(bulk_data: list, milestone: object): """ - Update the milestone of some user stories. - `bulk_data` should be a list of user story ids: + Update the milestone and the milestone order of some user stories adding the + extra orders needed to keep consistency. + `bulk_data` should be a list of dicts with the following format: + [{'us_id': , 'order': }, ...] """ + user_stories = milestone.user_stories.all() + us_orders = {us.id: getattr(us, "sprint_order") for us in user_stories} + new_us_orders = {} + for e in bulk_data: + new_us_orders[e["us_id"]] = e["order"] + # The base orders where we apply the new orders must containg all the values + us_orders[e["us_id"]] = e["order"] + + apply_order_updates(us_orders, new_us_orders) + us_milestones = {e["us_id"]: milestone.id for e in bulk_data} user_story_ids = us_milestones.keys() @@ -116,6 +128,8 @@ def update_userstories_milestone_in_bulk(bulk_data: list, milestone: object): projectid=milestone.project.pk) db.update_attr_in_bulk_for_ids(us_milestones, "milestone_id", model=models.UserStory) + db.update_attr_in_bulk_for_ids(us_orders, "sprint_order", models.UserStory) + return us_orders def snapshot_userstories_in_bulk(bulk_data, user): diff --git a/taiga/projects/userstories/validators.py b/taiga/projects/userstories/validators.py index e82b1f75..60bedaf7 100644 --- a/taiga/projects/userstories/validators.py +++ b/taiga/projects/userstories/validators.py @@ -99,6 +99,7 @@ class UpdateUserStoriesOrderBulkValidator(ProjectExistsValidator, UserStoryStatu class _UserStoryMilestoneBulkValidator(validators.Validator): us_id = serializers.IntegerField() + order = serializers.IntegerField() class UpdateMilestoneBulkValidator(ProjectExistsValidator, MilestoneExistsValidator, validators.Validator): diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index 6a095f08..b777b186 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -273,24 +273,30 @@ def test_api_update_orders_in_bulk_invalid_milestione(client): def test_api_update_milestone_in_bulk(client): project = f.create_project() f.MembershipFactory.create(project=project, user=project.owner, is_admin=True) + milestone = f.MilestoneFactory.create(project=project) us1 = f.create_userstory(project=project) us2 = f.create_userstory(project=project) - milestone = f.MilestoneFactory.create(project=project) + us3 = f.create_userstory(project=project, milestone=milestone, sprint_order=1) + us4 = f.create_userstory(project=project, milestone=milestone, sprint_order=2) url = reverse("userstories-bulk-update-milestone") data = { "project_id": project.id, "milestone_id": milestone.id, - "bulk_stories": [{"us_id": us1.id}, - {"us_id": us2.id}] + "bulk_stories": [{"us_id": us1.id, "order": 2}, + {"us_id": us2.id, "order": 3}] } client.login(project.owner) - assert project.milestones.get(id=milestone.id).user_stories.count() == 0 + assert project.milestones.get(id=milestone.id).user_stories.count() == 2 response = client.json.post(url, json.dumps(data)) assert response.status_code == 204, response.data - assert project.milestones.get(id=milestone.id).user_stories.count() == 2 + assert project.milestones.get(id=milestone.id).user_stories.count() == 4 + assert list(project.milestones.get(id=milestone.id).\ + user_stories.\ + order_by("sprint_order").\ + values_list("id", "sprint_order")) == [(us3.id, 1), (us1.id, 2), (us2.id,3), (us4.id,4)] def test_api_update_milestone_in_bulk_invalid_milestone(client): @@ -304,8 +310,8 @@ def test_api_update_milestone_in_bulk_invalid_milestone(client): data = { "project_id": project.id, "milestone_id": m2.id, - "bulk_stories": [{"us_id": us1.id}, - {"us_id": us2.id}] + "bulk_stories": [{"us_id": us1.id, "order": 1}, + {"us_id": us2.id, "order": 2}] } client.login(project.owner) @@ -326,8 +332,8 @@ def test_api_update_milestone_in_bulk_invalid_userstories(client): data = { "project_id": project.id, "milestone_id": milestone.id, - "bulk_stories": [{"us_id": us1.id}, - {"us_id": us2.id}] + "bulk_stories": [{"us_id": us1.id, "order": 1}, + {"us_id": us2.id, "order": 2}] } client.login(project.owner)