Refactoring bulk update milestone API call
parent
f78159e564
commit
cc01ff029c
|
@ -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):
|
def update_userstories_milestone_in_bulk(bulk_data: list, milestone: object):
|
||||||
"""
|
"""
|
||||||
Update the milestone of some user stories.
|
Update the milestone and the milestone order of some user stories adding the
|
||||||
`bulk_data` should be a list of user story ids:
|
extra orders needed to keep consistency.
|
||||||
|
`bulk_data` should be a list of dicts with the following format:
|
||||||
|
[{'us_id': <value>, 'order': <value>}, ...]
|
||||||
"""
|
"""
|
||||||
|
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}
|
us_milestones = {e["us_id"]: milestone.id for e in bulk_data}
|
||||||
user_story_ids = us_milestones.keys()
|
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)
|
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_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):
|
def snapshot_userstories_in_bulk(bulk_data, user):
|
||||||
|
|
|
@ -99,6 +99,7 @@ class UpdateUserStoriesOrderBulkValidator(ProjectExistsValidator, UserStoryStatu
|
||||||
|
|
||||||
class _UserStoryMilestoneBulkValidator(validators.Validator):
|
class _UserStoryMilestoneBulkValidator(validators.Validator):
|
||||||
us_id = serializers.IntegerField()
|
us_id = serializers.IntegerField()
|
||||||
|
order = serializers.IntegerField()
|
||||||
|
|
||||||
|
|
||||||
class UpdateMilestoneBulkValidator(ProjectExistsValidator, MilestoneExistsValidator, validators.Validator):
|
class UpdateMilestoneBulkValidator(ProjectExistsValidator, MilestoneExistsValidator, validators.Validator):
|
||||||
|
|
|
@ -273,24 +273,30 @@ def test_api_update_orders_in_bulk_invalid_milestione(client):
|
||||||
def test_api_update_milestone_in_bulk(client):
|
def test_api_update_milestone_in_bulk(client):
|
||||||
project = f.create_project()
|
project = f.create_project()
|
||||||
f.MembershipFactory.create(project=project, user=project.owner, is_admin=True)
|
f.MembershipFactory.create(project=project, user=project.owner, is_admin=True)
|
||||||
|
milestone = f.MilestoneFactory.create(project=project)
|
||||||
us1 = f.create_userstory(project=project)
|
us1 = f.create_userstory(project=project)
|
||||||
us2 = 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")
|
url = reverse("userstories-bulk-update-milestone")
|
||||||
data = {
|
data = {
|
||||||
"project_id": project.id,
|
"project_id": project.id,
|
||||||
"milestone_id": milestone.id,
|
"milestone_id": milestone.id,
|
||||||
"bulk_stories": [{"us_id": us1.id},
|
"bulk_stories": [{"us_id": us1.id, "order": 2},
|
||||||
{"us_id": us2.id}]
|
{"us_id": us2.id, "order": 3}]
|
||||||
}
|
}
|
||||||
|
|
||||||
client.login(project.owner)
|
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))
|
response = client.json.post(url, json.dumps(data))
|
||||||
assert response.status_code == 204, response.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):
|
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 = {
|
data = {
|
||||||
"project_id": project.id,
|
"project_id": project.id,
|
||||||
"milestone_id": m2.id,
|
"milestone_id": m2.id,
|
||||||
"bulk_stories": [{"us_id": us1.id},
|
"bulk_stories": [{"us_id": us1.id, "order": 1},
|
||||||
{"us_id": us2.id}]
|
{"us_id": us2.id, "order": 2}]
|
||||||
}
|
}
|
||||||
|
|
||||||
client.login(project.owner)
|
client.login(project.owner)
|
||||||
|
@ -326,8 +332,8 @@ def test_api_update_milestone_in_bulk_invalid_userstories(client):
|
||||||
data = {
|
data = {
|
||||||
"project_id": project.id,
|
"project_id": project.id,
|
||||||
"milestone_id": milestone.id,
|
"milestone_id": milestone.id,
|
||||||
"bulk_stories": [{"us_id": us1.id},
|
"bulk_stories": [{"us_id": us1.id, "order": 1},
|
||||||
{"us_id": us2.id}]
|
{"us_id": us2.id, "order": 2}]
|
||||||
}
|
}
|
||||||
|
|
||||||
client.login(project.owner)
|
client.login(project.owner)
|
||||||
|
|
Loading…
Reference in New Issue