Move bulk userstory operations to services and add tests.
parent
f31b612fa4
commit
a21d8bf711
|
@ -17,6 +17,7 @@ from . import pagination
|
|||
from . import serializers
|
||||
from . import decorators
|
||||
|
||||
|
||||
class CreateModelMixin(mixins.CreateModelMixin):
|
||||
@transaction.atomic
|
||||
def create(self, *args, **kwargs):
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import reversion
|
||||
|
||||
from django.utils.translation import ugettext_lazy as _
|
||||
from django.contrib.contenttypes.models import ContentType
|
||||
from django.shortcuts import get_object_or_404
|
||||
|
@ -7,6 +9,7 @@ from django.shortcuts import get_object_or_404
|
|||
from rest_framework.permissions import IsAuthenticated
|
||||
from rest_framework.decorators import list_route, action
|
||||
from rest_framework.response import Response
|
||||
from rest_framework import status
|
||||
|
||||
from greenmine.base import filters
|
||||
from greenmine.base import exceptions as exc
|
||||
|
@ -18,12 +21,10 @@ from greenmine.projects.serializers import AttachmentSerializer
|
|||
from greenmine.projects.models import Attachment
|
||||
from greenmine.projects.models import Project
|
||||
|
||||
from . import serializers
|
||||
from . import models
|
||||
from . import permissions
|
||||
|
||||
import reversion
|
||||
|
||||
from . import serializers
|
||||
from . import services
|
||||
|
||||
|
||||
class UserStoryAttachmentViewSet(ModelCrudViewSet):
|
||||
|
@ -68,7 +69,7 @@ class UserStoryViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
|||
destroy_notification_template = "destroy_userstory_notification"
|
||||
|
||||
@list_route(methods=["POST"])
|
||||
def bulk_create(self, request):
|
||||
def bulk_create(self, request, **kwargs):
|
||||
bulk_stories = request.DATA.get('bulkStories', None)
|
||||
if bulk_stories is None:
|
||||
raise exc.BadRequest(detail='You need bulkStories data')
|
||||
|
@ -82,21 +83,34 @@ class UserStoryViewSet(NotificationSenderMixin, ModelCrudViewSet):
|
|||
if not has_project_perm(request.user, project, 'add_userstory'):
|
||||
raise exc.PermissionDenied("You don't have permision to create user stories")
|
||||
|
||||
result_stories = []
|
||||
bulk_stories = bulk_stories.split("\n")
|
||||
service = services.UserStoriesService()
|
||||
service.bulk_insert(project, request.user, bulk_stories)
|
||||
|
||||
for bulk_story in bulk_stories:
|
||||
bulk_story = bulk_story.strip()
|
||||
if len(bulk_story) > 0:
|
||||
result_stories.append(models.UserStory.objects.create(subject=bulk_story,
|
||||
project=project,
|
||||
owner=request.user,
|
||||
status=project.default_us_status))
|
||||
return Response(data=None, status=status.HTTP_204_NO_CONTENT)
|
||||
|
||||
# FIXME: this should use many=True on UserStorySerializer
|
||||
# instead of this unnecesary iteration
|
||||
data = map(lambda x: serializers.UserStorySerializer(x).data, result_stories)
|
||||
return Response(data)
|
||||
@list_route(methods=["POST"])
|
||||
def bulk_update_order(self, request, **kwargs):
|
||||
# bulkStories should be:
|
||||
# [[1,1],[23, 2], ...]
|
||||
|
||||
bulk_stories = request.DATA.get("bulkStories", None)
|
||||
|
||||
if bulk_stories is None:
|
||||
raise exc.BadRequest("bulkStories is missing")
|
||||
|
||||
project_id = request.DATA.get('projectId', None)
|
||||
if project_id is None:
|
||||
raise exc.BadRequest(detail='You need projectId data')
|
||||
|
||||
project = get_object_or_404(Project, id=project_id)
|
||||
|
||||
if not has_project_perm(request.user, project, 'add_userstory'):
|
||||
raise exc.PermissionDenied("You don't have permision to create user stories")
|
||||
|
||||
service = services.UserStoriesService()
|
||||
service.bulk_update_order(project, request.user, bulk_stories)
|
||||
|
||||
return Response(data=None, status=status.HTTP_204_NO_CONTENT)
|
||||
|
||||
def pre_save(self, obj):
|
||||
if not obj.id:
|
||||
|
|
|
@ -0,0 +1,33 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
from django.db import transaction
|
||||
from django.db import connection
|
||||
|
||||
from . import models
|
||||
|
||||
|
||||
class UserStoriesService(object):
|
||||
@transaction.atomic
|
||||
def bulk_insert(self, project, user, data):
|
||||
items = filter(lambda s: len(s) > 0,
|
||||
map(lambda s: s.strip(), data.split("\n")))
|
||||
|
||||
for item in items:
|
||||
models.UserStory.objects.create(subject=item, project=project, owner=user,
|
||||
status=project.default_us_status)
|
||||
|
||||
@transaction.atomic
|
||||
def bulk_update_order(self, project, user, data):
|
||||
cursor = connection.cursor()
|
||||
|
||||
sql = """
|
||||
prepare bulk_update_order as update userstories_userstory set "order" = $1
|
||||
where userstories_userstory.id = $2 and
|
||||
userstories_userstory.project_id = $3;
|
||||
"""
|
||||
|
||||
cursor.execute(sql)
|
||||
for usid, usorder in data:
|
||||
cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);",
|
||||
(usorder, usid, project.id))
|
||||
cursor.close()
|
|
@ -0,0 +1,48 @@
|
|||
# -*- coding: utf-8 -*-
|
||||
|
||||
import json
|
||||
|
||||
from django import test
|
||||
|
||||
from greenmine.base.users.tests import create_user
|
||||
from greenmine.projects.tests import create_project
|
||||
|
||||
from . import create_userstory
|
||||
from .. import services
|
||||
from .. import models
|
||||
|
||||
|
||||
class UserStoriesServiceTestCase(test.TestCase):
|
||||
fixtures = ["initial_role.json", "initial_domains.json"]
|
||||
|
||||
def setUp(self):
|
||||
self.user1 = create_user(1) # Project owner
|
||||
self.project1 = create_project(1, self.user1)
|
||||
|
||||
def test_bulk_insert(self):
|
||||
model = models.UserStory
|
||||
self.assertEqual(model.objects.count(), 0)
|
||||
|
||||
service = services.UserStoriesService()
|
||||
service.bulk_insert(self.project1, self.user1, "kk1\nkk2\n")
|
||||
|
||||
self.assertEqual(model.objects.count(), 2)
|
||||
|
||||
def test_bulk_order_update(self):
|
||||
userstory1 = create_userstory(1, self.user1, self.project1)
|
||||
userstory2 = create_userstory(2, self.user1, self.project1)
|
||||
|
||||
data = [
|
||||
[userstory1.id, 20],
|
||||
[userstory2.id, 30],
|
||||
]
|
||||
|
||||
service = services.UserStoriesService()
|
||||
service.bulk_update_order(self.project1, self.user1, data)
|
||||
|
||||
model = models.UserStory
|
||||
userstory1 = model.objects.get(pk=userstory1.id)
|
||||
userstory2 = model.objects.get(pk=userstory2.id)
|
||||
|
||||
self.assertEqual(userstory1.order, 20)
|
||||
self.assertEqual(userstory2.order, 30)
|
Loading…
Reference in New Issue