diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 0056e704..9999fa52 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -78,18 +78,47 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi return response.BadRequest(serializer.errors) @list_route(methods=["POST"]) - def bulk_update_order(self, request, **kwargs): - serializer = serializers.UpdateUserStoriesBulkSerializer(data=request.DATA) - if serializer.is_valid(): - data = serializer.data - project = Project.objects.get(id=data["project_id"]) - self.check_permissions(request, 'bulk_update_order', project) - services.update_userstories_order_in_bulk(data["bulk_stories"]) - services.snapshot_userstories_in_bulk(data["bulk_stories"], request.user) + def bulk_update_backlog_order(self, request, **kwargs): + serializer = serializers.UpdateUserStoriesOrderBulkSerializer(data=request.DATA) + if not serializer.is_valid(): + return response.BadRequest(serializer.errors) - return response.NoContent() + data = serializer.data + project = get_object_or_404(Project, pk=data["project_id"]) - return response.BadRequest(serializer.errors) + self.check_permissions(request, "bulk_update_order", project) + services.update_userstories_order_in_bulk(data["bulk_stories"], field="backlog_order") + services.snapshot_userstories_in_bulk(data["bulk_stories"], request.user) + + return response.NoContent() + + @list_route(methods=["POST"]) + def bulk_update_sprint_order(self, request, **kwargs): + serializer = serializers.UpdateUserStoriesOrderBulkSerializer(data=request.DATA) + if not serializer.is_valid(): + return response.BadRequest(serializer.errors) + + data = serializer.data + project = get_object_or_404(Project, pk=data["project_id"]) + + self.check_permissions(request, "bulk_update_order", project) + services.update_userstories_order_in_bulk(data["bulk_stories"], field="sprint_order") + services.snapshot_userstories_in_bulk(data["bulk_stories"], request.user) + return response.NoContent() + + @list_route(methods=["POST"]) + def bulk_update_kanban_order(self, request, **kwargs): + serializer = serializers.UpdateUserStoriesOrderBulkSerializer(data=request.DATA) + if not serializer.is_valid(): + return response.BadRequest(serializer.errors) + + data = serializer.data + project = get_object_or_404(Project, pk=data["project_id"]) + + self.check_permissions(request, "bulk_update_order", project) + services.update_userstories_order_in_bulk(data["bulk_stories"], field="kanban_order") + services.snapshot_userstories_in_bulk(data["bulk_stories"], request.user) + return response.NoContent() @transaction.atomic def create(self, *args, **kwargs): diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index 51d9a8a5..9cb3ba33 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -120,12 +120,15 @@ class UserStoriesBulkSerializer(ProjectExistsValidator, UserStoryStatusExistsVal bulk_stories = serializers.CharField() -class UserStoryOrderBulkSerializer(UserStoryExistsValidator, Serializer): +## Order bulk serializers + +class _UserStoryOrderBulkSerializer(UserStoryExistsValidator, Serializer): us_id = serializers.IntegerField() order = serializers.IntegerField() -class UpdateUserStoriesBulkSerializer(ProjectExistsValidator, UserStoryStatusExistsValidator, - Serializer): +class UpdateUserStoriesOrderBulkSerializer(ProjectExistsValidator, + UserStoryStatusExistsValidator, + Serializer): project_id = serializers.IntegerField() - bulk_stories = UserStoryOrderBulkSerializer(many=True) + bulk_stories = _UserStoryOrderBulkSerializer(many=True) diff --git a/taiga/projects/userstories/services.py b/taiga/projects/userstories/services.py index 202e5e92..54fb3810 100644 --- a/taiga/projects/userstories/services.py +++ b/taiga/projects/userstories/services.py @@ -48,20 +48,22 @@ def create_userstories_in_bulk(bulk_data, callback=None, precall=None, **additio return userstories -def update_userstories_order_in_bulk(bulk_data): - """Update the order of some user stories. - +def update_userstories_order_in_bulk(bulk_data:list, field:str): + """ + Update the order of some user stories. `bulk_data` should be a list of tuples with the following format: - [(, ), ...] + [(, {: , ...}), ...] """ user_story_ids = [] new_order_values = [] for us_data in bulk_data: - user_story_ids.append(us_data['us_id']) - new_order_values.append({"order": us_data['order']}) + user_story_ids.append(us_data["us_id"]) + new_order_values.append({field: us_data["order"]}) + db.update_in_bulk_with_ids(user_story_ids, new_order_values, model=models.UserStory) + def snapshot_userstories_in_bulk(bulk_data, user): user_story_ids = [] for us_data in bulk_data: