commit
34bf9309fe
|
@ -1,5 +1,10 @@
|
||||||
# Changelog #
|
# Changelog
|
||||||
|
|
||||||
|
## 3.2.2 (2018-03-15)
|
||||||
|
|
||||||
|
### Misc
|
||||||
|
|
||||||
|
- Minor bug fixes.
|
||||||
|
|
||||||
## 3.2.0 Betula nana (2018-03-07)
|
## 3.2.0 Betula nana (2018-03-07)
|
||||||
|
|
||||||
|
|
|
@ -24,7 +24,7 @@ from taiga.projects import models
|
||||||
from contextlib import suppress
|
from contextlib import suppress
|
||||||
|
|
||||||
|
|
||||||
def apply_order_updates(base_orders: dict, new_orders: dict):
|
def apply_order_updates(base_orders: dict, new_orders: dict, *, remove_equal_original=False):
|
||||||
"""
|
"""
|
||||||
`base_orders` must be a dict containing all the elements that can be affected by
|
`base_orders` must be a dict containing all the elements that can be affected by
|
||||||
order modifications.
|
order modifications.
|
||||||
|
@ -36,6 +36,7 @@ def apply_order_updates(base_orders: dict, new_orders: dict):
|
||||||
The elements where no order update is needed will be removed.
|
The elements where no order update is needed will be removed.
|
||||||
"""
|
"""
|
||||||
updated_order_ids = set()
|
updated_order_ids = set()
|
||||||
|
original_orders = {k:v for k,v in base_orders.items()}
|
||||||
|
|
||||||
# Remove the elements from new_orders non existint in base_orders
|
# Remove the elements from new_orders non existint in base_orders
|
||||||
invalid_keys = new_orders.keys() - base_orders.keys()
|
invalid_keys = new_orders.keys() - base_orders.keys()
|
||||||
|
@ -68,6 +69,11 @@ def apply_order_updates(base_orders: dict, new_orders: dict):
|
||||||
removing_keys = [id for id in base_orders if id not in updated_order_ids]
|
removing_keys = [id for id in base_orders if id not in updated_order_ids]
|
||||||
[base_orders.pop(id, None) for id in removing_keys]
|
[base_orders.pop(id, None) for id in removing_keys]
|
||||||
|
|
||||||
|
# Remove elements that are equal to the original
|
||||||
|
if remove_equal_original:
|
||||||
|
common_keys = original_orders.keys() & base_orders.keys()
|
||||||
|
[base_orders.pop(id, None) for id in common_keys if base_orders[id] == original_orders[id]]
|
||||||
|
|
||||||
|
|
||||||
def update_projects_order_in_bulk(bulk_data: list, field: str, user):
|
def update_projects_order_in_bulk(bulk_data: list, field: str, user):
|
||||||
"""
|
"""
|
||||||
|
|
|
@ -94,7 +94,7 @@ def update_userstories_order_in_bulk(bulk_data: list, field: str, project: objec
|
||||||
|
|
||||||
us_orders = {us.id: getattr(us, field) for us in user_stories}
|
us_orders = {us.id: getattr(us, field) for us in user_stories}
|
||||||
new_us_orders = {e["us_id"]: e["order"] for e in bulk_data}
|
new_us_orders = {e["us_id"]: e["order"] for e in bulk_data}
|
||||||
apply_order_updates(us_orders, new_us_orders)
|
apply_order_updates(us_orders, new_us_orders, remove_equal_original=True)
|
||||||
|
|
||||||
user_story_ids = us_orders.keys()
|
user_story_ids = us_orders.keys()
|
||||||
events.emit_event_for_ids(ids=user_story_ids,
|
events.emit_event_for_ids(ids=user_story_ids,
|
||||||
|
|
|
@ -125,8 +125,6 @@ class UpdateUserStoriesOrderBulkValidator(ProjectExistsValidator, validators.Val
|
||||||
|
|
||||||
def validate_bulk_stories(self, attrs, source):
|
def validate_bulk_stories(self, attrs, source):
|
||||||
filters = {"project__id": attrs["project_id"]}
|
filters = {"project__id": attrs["project_id"]}
|
||||||
if "status_id" in attrs:
|
|
||||||
filters["status__id"] = attrs["status_id"]
|
|
||||||
if "milestone_id" in attrs:
|
if "milestone_id" in attrs:
|
||||||
filters["milestone__id"] = attrs["milestone_id"]
|
filters["milestone__id"] = attrs["milestone_id"]
|
||||||
|
|
||||||
|
|
|
@ -60,11 +60,11 @@ def test_update_userstories_order_in_bulk():
|
||||||
project = f.ProjectFactory.create()
|
project = f.ProjectFactory.create()
|
||||||
us1 = f.UserStoryFactory.create(project=project, backlog_order=1)
|
us1 = f.UserStoryFactory.create(project=project, backlog_order=1)
|
||||||
us2 = f.UserStoryFactory.create(project=project, backlog_order=2)
|
us2 = f.UserStoryFactory.create(project=project, backlog_order=2)
|
||||||
data = [{"us_id": us1.id, "order": 1}, {"us_id": us2.id, "order": 2}]
|
data = [{"us_id": us1.id, "order": 2}, {"us_id": us2.id, "order": 1}]
|
||||||
|
|
||||||
with mock.patch("taiga.projects.userstories.services.db") as db:
|
with mock.patch("taiga.projects.userstories.services.db") as db:
|
||||||
services.update_userstories_order_in_bulk(data, "backlog_order", project)
|
services.update_userstories_order_in_bulk(data, "backlog_order", project)
|
||||||
db.update_attr_in_bulk_for_ids.assert_called_once_with({us1.id: 1, us2.id: 2},
|
db.update_attr_in_bulk_for_ids.assert_called_once_with({us2.id: 1, us1.id: 2},
|
||||||
"backlog_order",
|
"backlog_order",
|
||||||
models.UserStory)
|
models.UserStory)
|
||||||
|
|
||||||
|
@ -264,17 +264,14 @@ def test_api_update_orders_in_bulk_invalid_status(client):
|
||||||
response = client.json.post(url1, json.dumps(data))
|
response = client.json.post(url1, json.dumps(data))
|
||||||
assert response.status_code == 400, response.data
|
assert response.status_code == 400, response.data
|
||||||
assert "status_id" in response.data
|
assert "status_id" in response.data
|
||||||
assert "bulk_stories" in response.data
|
|
||||||
|
|
||||||
response = client.json.post(url2, json.dumps(data))
|
response = client.json.post(url2, json.dumps(data))
|
||||||
assert response.status_code == 400, response.data
|
assert response.status_code == 400, response.data
|
||||||
assert "status_id" in response.data
|
assert "status_id" in response.data
|
||||||
assert "bulk_stories" in response.data
|
|
||||||
|
|
||||||
response = client.json.post(url3, json.dumps(data))
|
response = client.json.post(url3, json.dumps(data))
|
||||||
assert response.status_code == 400, response.data
|
assert response.status_code == 400, response.data
|
||||||
assert "status_id" in response.data
|
assert "status_id" in response.data
|
||||||
assert "bulk_stories" in response.data
|
|
||||||
|
|
||||||
|
|
||||||
def test_api_update_orders_in_bulk_invalid_milestione(client):
|
def test_api_update_orders_in_bulk_invalid_milestione(client):
|
||||||
|
|
|
@ -186,3 +186,14 @@ def test_apply_order_invalid_new_order():
|
||||||
"e": 5,
|
"e": 5,
|
||||||
"f": 6
|
"f": 6
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def test_apply_order_not_include_noop():
|
||||||
|
orders = {
|
||||||
|
"a": 1,
|
||||||
|
}
|
||||||
|
new_orders = {
|
||||||
|
"a": 1,
|
||||||
|
}
|
||||||
|
apply_order_updates(orders, new_orders, remove_equal_original=True)
|
||||||
|
assert orders == {}
|
||||||
|
|
Loading…
Reference in New Issue