Move bulk userstory operations to services and add tests.

remotes/origin/enhancement/email-actions
Andrey Antukh 2013-12-09 16:34:43 +01:00
parent f31b612fa4
commit a21d8bf711
4 changed files with 114 additions and 18 deletions

View File

@ -17,6 +17,7 @@ from . import pagination
from . import serializers
from . import decorators
class CreateModelMixin(mixins.CreateModelMixin):
@transaction.atomic
def create(self, *args, **kwargs):

View File

@ -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:

View File

@ -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()

View File

@ -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)