Skip to content

Commit

Permalink
Refactoring bulk update milestone API call
Browse files Browse the repository at this point in the history
  • Loading branch information
superalex authored and bameda committed Aug 3, 2016
1 parent f78159e commit cc01ff0
Show file tree
Hide file tree
Showing 3 changed files with 32 additions and 11 deletions.
18 changes: 16 additions & 2 deletions taiga/projects/userstories/services.py
Expand Up @@ -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': <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}
user_story_ids = us_milestones.keys()

Expand All @@ -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):
Expand Down
1 change: 1 addition & 0 deletions taiga/projects/userstories/validators.py
Expand Up @@ -99,6 +99,7 @@ def validate(self, data):

class _UserStoryMilestoneBulkValidator(validators.Validator):
us_id = serializers.IntegerField()
order = serializers.IntegerField()


class UpdateMilestoneBulkValidator(ProjectExistsValidator, MilestoneExistsValidator, validators.Validator):
Expand Down
24 changes: 15 additions & 9 deletions tests/integration/test_userstories.py
Expand Up @@ -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):
Expand All @@ -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)
Expand All @@ -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)
Expand Down

0 comments on commit cc01ff0

Please sign in to comment.