Refactoring bulk update milestone API call

remotes/origin/issue/4795/notification_even_they_are_disabled
Alejandro Alonso 2016-07-29 09:27:36 +02:00 committed by David Barragán Merino
parent f78159e564
commit cc01ff029c
3 changed files with 32 additions and 11 deletions

View File

@ -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):

View File

@ -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):

View File

@ -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)