diff --git a/taiga/projects/userstories/api.py b/taiga/projects/userstories/api.py index 2027273b..64b9e2fa 100644 --- a/taiga/projects/userstories/api.py +++ b/taiga/projects/userstories/api.py @@ -18,15 +18,12 @@ from django.db import transaction from django.utils.translation import ugettext as _ from django.shortcuts import get_object_or_404 -from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from rest_framework import status -from taiga.base import filters +from taiga.base import filters, response from taiga.base import exceptions as exc from taiga.base.decorators import list_route -from taiga.base.decorators import action -from taiga.base.permissions import has_project_perm from taiga.base.api import ModelCrudViewSet from taiga.projects.notifications import WatchedResourceMixin @@ -68,30 +65,18 @@ class UserStoryViewSet(OCCResourceMixin, HistoryResourceMixin, WatchedResourceMi @list_route(methods=["POST"]) def bulk_create(self, request, **kwargs): - bulk_stories = request.DATA.get('bulkStories', None) - if bulk_stories is None: - raise exc.BadRequest(_('bulkStories parameter is mandatory')) - - project_id = request.DATA.get('projectId', None) - if project_id is None: - raise exc.BadRequest(_('projectId parameter is mandatory')) - - project = get_object_or_404(Project, id=project_id) - - status_id = request.DATA.get('statusId', None) - if status_id: - status = get_object_or_404(UserStoryStatus, id=status_id) - else: - status = project.default_us_status - - self.check_permissions(request, 'bulk_create', project) - - user_stories = services.create_userstories_in_bulk( - bulk_stories, callback=self.post_save, project=project, owner=request.user, - status=status) - - user_stories_serialized = self.serializer_class(user_stories, many=True) - return Response(data=user_stories_serialized.data) + serializer = serializers.UserStoriesBulkSerializer(data=request.DATA) + if serializer.is_valid(): + data = serializer.data + project = Project.objects.get(id=data["project_id"]) + self.check_permissions(request, 'bulk_create', project) + user_stories = services.create_userstories_in_bulk( + data["bulk_stories"], project=project, owner=request.user, + status_id=data.get("status_id", project.default_us_status_id), + callback=self.post_save) + user_stories_serialized = self.serializer_class(user_stories, many=True) + return response.Ok(user_stories_serialized.data) + return response.BadRequest(serializer.errors) @list_route(methods=["POST"]) def bulk_update_order(self, request, **kwargs): diff --git a/taiga/projects/userstories/serializers.py b/taiga/projects/userstories/serializers.py index c3175942..294a776e 100644 --- a/taiga/projects/userstories/serializers.py +++ b/taiga/projects/userstories/serializers.py @@ -20,6 +20,7 @@ from rest_framework import serializers from taiga.base.serializers import PickleField, NeighborsSerializerMixin from taiga.mdrender.service import render as mdrender +from taiga.projects.validators import ProjectExistsValidator from . import models @@ -108,3 +109,9 @@ class NeighborUserStorySerializer(serializers.ModelSerializer): model = models.UserStory fields = ("id", "ref", "subject") depth = 0 + + +class UserStoriesBulkSerializer(ProjectExistsValidator, serializers.Serializer): + project_id = serializers.IntegerField() + status_id = serializers.IntegerField(required=False) + bulk_stories = serializers.CharField() diff --git a/tests/integration/test_userstories.py b/tests/integration/test_userstories.py index 50efcc7c..2a6a1551 100644 --- a/tests/integration/test_userstories.py +++ b/tests/integration/test_userstories.py @@ -70,9 +70,9 @@ def test_api_create_in_bulk_with_status(client): project = f.create_project() url = reverse("userstories-bulk-create") data = { - "bulkStories": "Story #1\nStory #2", - "projectId": project.id, - "statusId": project.default_us_status.id + "bulk_stories": "Story #1\nStory #2", + "project_id": project.id, + "status_id": project.default_us_status.id } client.login(project.owner)