From ee24fd7da11cc6210dc046ea77569bee459fc15f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?David=20Barrag=C3=A1n=20Merino?= Date: Sat, 14 Dec 2013 15:26:30 +0100 Subject: [PATCH] Created methods to order status, points, types, severities and priorities in bulk --- greenmine/projects/api.py | 196 +++++++++++++++++++++++++++++++++ greenmine/projects/services.py | 147 +++++++++++++++++++++++++ 2 files changed, 343 insertions(+) create mode 100644 greenmine/projects/services.py diff --git a/greenmine/projects/api.py b/greenmine/projects/api.py index b9e1f430..54cbe04a 100644 --- a/greenmine/projects/api.py +++ b/greenmine/projects/api.py @@ -4,8 +4,10 @@ import uuid from django.db.models import Q from django.utils.translation import ugettext_lazy as _ +from django.shortcuts import get_object_or_404 from rest_framework.permissions import IsAuthenticated, AllowAny +from rest_framework.decorators import list_route from rest_framework.response import Response from rest_framework.decorators import detail_route from rest_framework import viewsets @@ -15,6 +17,7 @@ from djmail.template_mail import MagicMailBuilder from greenmine.base import filters from greenmine.base import exceptions as exc +from greenmine.base.permissions import has_project_perm from greenmine.base.api import ModelCrudViewSet, ModelListViewSet, RetrieveModelMixin from greenmine.base.domains import get_active_domain from greenmine.base.notifications.api import NotificationSenderMixin @@ -23,6 +26,7 @@ from greenmine.projects.aggregates.tags import get_all_tags from . import serializers from . import models from . import permissions +from . import services from .aggregates import stats from .aggregates import filters as filters_aggr @@ -159,6 +163,30 @@ class PointsViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ('project',) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_points should be: + # [[1,1],[23, 2], ...] + + bulk_points = request.DATA.get("bulk_points", None) + + if bulk_points is None: + raise exc.BadRequest(_("bulk_points parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_points'): + raise exc.PermissionDenied(_("You don't have permisions to change points.")) + + service = services.PointsService() + service.bulk_update_order(project, request.user, bulk_points) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + class UserStoryStatusViewSet(ModelCrudViewSet): model = models.UserStoryStatus @@ -167,6 +195,30 @@ class UserStoryStatusViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ('project',) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_userstory_statuses should be: + # [[1,1],[23, 2], ...] + + bulk_userstory_statuses = request.DATA.get("bulk_userstory_statuses", None) + + if bulk_userstory_statuses is None: + raise exc.BadRequest(_("bulk_userstory_statuses parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_userstorystatus'): + raise exc.PermissionDenied(_("You don't have permisions to change user_story_statuses.")) + + service = services.UserStoryStatusesService() + service.bulk_update_order(project, request.user, bulk_userstory_statuses) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + # Tasks commin ViewSets @@ -177,6 +229,30 @@ class TaskStatusViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ("project",) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_task_statuses should be: + # [[1,1],[23, 2], ...] + + bulk_task_statuses = request.DATA.get("bulk_task_statuses", None) + + if bulk_task_statuses is None: + raise exc.BadRequest(_("bulk_task_statuses parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_taskstatus'): + raise exc.PermissionDenied(_("You don't have permisions to change task_statuses.")) + + service = services.TaskStatusesService() + service.bulk_update_order(project, request.user, bulk_task_statuses) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + # Issues common ViewSets @@ -187,6 +263,30 @@ class SeverityViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ("project",) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_severities should be: + # [[1,1],[23, 2], ...] + + bulk_severities = request.DATA.get("bulk_severities", None) + + if bulk_severities is None: + raise exc.BadRequest(_("bulk_severities parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_severity'): + raise exc.PermissionDenied(_("You don't have permisions to change severities.")) + + service = services.SeveritiesService() + service.bulk_update_order(project, request.user, bulk_severities) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + class PriorityViewSet(ModelCrudViewSet): model = models.Priority @@ -195,6 +295,30 @@ class PriorityViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ("project",) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_priorities should be: + # [[1,1],[23, 2], ...] + + bulk_priorities = request.DATA.get("bulk_priorities", None) + + if bulk_priorities is None: + raise exc.BadRequest(_("bulk_priorities parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_priority'): + raise exc.PermissionDenied(_("You don't have permisions to change priorities.")) + + service = services.PrioritiesService() + service.bulk_update_order(project, request.user, bulk_priorities) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + class IssueTypeViewSet(ModelCrudViewSet): model = models.IssueType @@ -203,6 +327,30 @@ class IssueTypeViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ("project",) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_issue_types should be: + # [[1,1],[23, 2], ...] + + bulk_issue_types = request.DATA.get("bulk_issue_types", None) + + if bulk_issue_types is None: + raise exc.BadRequest(_("bulk_riorities parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_issuetype'): + raise exc.PermissionDenied(_("You don't have permisions to change issue_types.")) + + service = services.IssueTypesService() + service.bulk_update_order(project, request.user, bulk_issue_types) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + class IssueStatusViewSet(ModelCrudViewSet): model = models.IssueStatus @@ -211,6 +359,30 @@ class IssueStatusViewSet(ModelCrudViewSet): filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ("project",) + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_issue_statuses should be: + # [[1,1],[23, 2], ...] + + bulk_issue_statuses = request.DATA.get("bulk_issue_statuses", None) + + if bulk_issue_statuses is None: + raise exc.BadRequest(_("bulk_riorities parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_issuestatus'): + raise exc.PermissionDenied(_("You don't have permisions to change issue_statuses.")) + + service = services.IssueStatusesService() + service.bulk_update_order(project, request.user, bulk_issue_statuses) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) + # Questions commin ViewSets @@ -220,3 +392,27 @@ class QuestionStatusViewSet(ModelCrudViewSet): permission_classes = (IsAuthenticated, permissions.QuestionStatusPermission) filter_backends = (filters.IsProjectMemberFilterBackend,) filter_fields = ("project",) + + @list_route(methods=["POST"]) + def bulk_update_order(self, request, **kwargs): + # bulk_question_statuses should be: + # [[1,1],[23, 2], ...] + + bulk_question_statuses = request.DATA.get("bulk_question_statuses", None) + + if bulk_question_statuses is None: + raise exc.BadRequest(_("bulk_question_statuses parameter is mandatory")) + + project_id = request.DATA.get('project', None) + if project_id is None: + raise exc.BadRequest(_("project parameter ir mandatory")) + + project = get_object_or_404(models.Project, id=project_id) + + if not has_project_perm(request.user, project, 'change_questionstatus'): + raise exc.PermissionDenied(_("You don't have permisions to change question_statuses.")) + + service = services.QuestionStatusesService() + service.bulk_update_order(project, request.user, bulk_question_statuses) + + return Response(data=None, status=status.HTTP_204_NO_CONTENT) diff --git a/greenmine/projects/services.py b/greenmine/projects/services.py new file mode 100644 index 00000000..f3ef642c --- /dev/null +++ b/greenmine/projects/services.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- + +from django.db import transaction +from django.db import connection + +from . import models +class UserStoryStatusesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_userstorystatus set "order" = $1 + where projects_userstorystatus.id = $2 and + projects_userstorystatus.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + + +class PointsService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_points set "order" = $1 + where projects_points.id = $2 and + projects_points.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + +class TaskStatusesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_taskstatus set "order" = $1 + where projects_taskstatus.id = $2 and + projects_taskstatus.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + + +class IssueStatusesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_issuestatus set "order" = $1 + where projects_issuestatus.id = $2 and + projects_issuestatus.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + + +class IssueTypesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_issuetype set "order" = $1 + where projects_issuetype.id = $2 and + projects_issuetype.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + + +class PrioritiesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_priority set "order" = $1 + where projects_priority.id = $2 and + projects_priority.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + + +class SeveritiesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_severity set "order" = $1 + where projects_severity.id = $2 and + projects_severity.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close() + + +class QuestionStatusesService(object): + @transaction.atomic + def bulk_update_order(self, project, user, data): + cursor = connection.cursor() + + sql = """ + prepare bulk_update_order as update projects_questionstatus set "order" = $1 + where projects_questionstatus.id = $2 and + projects_questionstatus.project_id = $3; + """ + + cursor.execute(sql) + for id, order in data: + cursor.execute("EXECUTE bulk_update_order (%s, %s, %s);", + (order, id, project.id)) + cursor.close()