Commit 4c270bb1 authored by Gladys Forte's avatar Gladys Forte

Merge pull request #736 in RMS/api-main-service from core-dev-gladys to RMSv2

* commit '917160f1':
  Restrict a requestor to submit a CR without atleast 1 approver v3
  Do not allow adding an approver for the same level
  Restrict a requestor to submit a CR without atleast 1 approver v3
  Restrict a requestor to submit a CR without atleast 1 approver v2
parents 2694ed7f 917160f1
...@@ -22,7 +22,8 @@ from django.db import transaction, IntegrityError, connection ...@@ -22,7 +22,8 @@ from django.db import transaction, IntegrityError, connection
from app.applicationlayer.utils import (QuerySetHelper, from app.applicationlayer.utils import (QuerySetHelper,
status_message_response, status_message_response,
send_broadcast_message) send_broadcast_message)
from app.businesslayer.changerequest import change_request from app.businesslayer.changerequest import (change_request,
change_request_template)
from app.applicationlayer.cms.utils_cr import (number_generator, from app.applicationlayer.cms.utils_cr import (number_generator,
send_mail_requestor, send_mail_requestor,
...@@ -1180,8 +1181,31 @@ class ChangeRequestFormPost(APIView): ...@@ -1180,8 +1181,31 @@ class ChangeRequestFormPost(APIView):
@transaction.atomic() @transaction.atomic()
def post(self, request): def post(self, request):
form_header = request.data form_header = request.data
try: try:
frm_approvers = form_header['frm_approvers']
# Do not allow adding an approver for the same level
validation_result = change_request_template.validation_approver_same_level(frm_approvers)
if validation_result is not None:
message = {
'code': 400,
'status': 'failed',
'message': validation_result + ' is already existing for the same level of approval.',
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
# Restrict a requestor to submit a CR without atleast 1 approver
counter = change_request.validation_existing_approver(frm_approvers)
if form_header['status'].lower() == 'pending' and counter == 0:
message = {
'code': 400,
'status': 'failed',
'message': 'Please select at least 1 approver before submitting this request.',
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
data_list_approver = [] data_list_approver = []
data_list_stake = [] data_list_stake = []
data_list_attach = [] data_list_attach = []
...@@ -1228,22 +1252,10 @@ class ChangeRequestFormPost(APIView): ...@@ -1228,22 +1252,10 @@ class ChangeRequestFormPost(APIView):
# create form approvers # create form approvers
frm_approvers = form_header['frm_approvers'] frm_approvers = form_header['frm_approvers']
counter = 0
for frm_approver in frm_approvers: for frm_approver in frm_approvers:
frm_approver['form_code'] = frm_id frm_approver['form_code'] = frm_id
counter = counter + 1
data_list_approver.append(frm_approver) data_list_approver.append(frm_approver)
if counter == 2 and serializer.data['status'].lower() == 'pending':
transaction.savepoint_rollback(sp1)
message = {
'code': 400,
'status': 'failed',
'message': 'Please select at least 1 approver before submitting this request.',
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
serializerApprover = ChangeRequestFormApproversSerializer( serializerApprover = ChangeRequestFormApproversSerializer(
data=data_list_approver, many=True) data=data_list_approver, many=True)
......
...@@ -23,7 +23,8 @@ from django.db.models import Q ...@@ -23,7 +23,8 @@ from django.db.models import Q
from app.applicationlayer.utils import log_save, CustomPagination from app.applicationlayer.utils import log_save, CustomPagination
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from app.businesslayer.changerequest.change_request_template import ( from app.businesslayer.changerequest.change_request_template import (
tmp_add_edit_delete tmp_add_edit_delete,
validation_approver_same_level
) )
from app.applicationlayer.management.account.serializer import ChangeRequestList from app.applicationlayer.management.account.serializer import ChangeRequestList
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
...@@ -344,6 +345,19 @@ class ChangeRequestTemplatePost(APIView): ...@@ -344,6 +345,19 @@ class ChangeRequestTemplatePost(APIView):
template_header = request.data template_header = request.data
try: try:
tmp_approvers = template_header['tmp_approvers']
# Do not allow adding an approver for the same level
validation_result = validation_approver_same_level(tmp_approvers)
if validation_result is not None:
message = {
'code': 400,
'status': 'failed',
'message': validation_result + ' is already existing for the same level of approval.',
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
data_list_approver = [] data_list_approver = []
data_list_stake = [] data_list_stake = []
data_list_attach = [] data_list_attach = []
...@@ -365,12 +379,6 @@ class ChangeRequestTemplatePost(APIView): ...@@ -365,12 +379,6 @@ class ChangeRequestTemplatePost(APIView):
sp1 = transaction.savepoint() # nothing will save to db sp1 = transaction.savepoint() # nothing will save to db
# cr_prefix = request.data['requested_to_template_id'])
# models.ChangeRequestTemplateHeader.objects.filter(
# requested_to_template_id=cr_prefix
# )
serializer = ChangeRequestTemplatesSerializer( serializer = ChangeRequestTemplatesSerializer(
data=template_header_data) data=template_header_data)
...@@ -385,13 +393,13 @@ class ChangeRequestTemplatePost(APIView): ...@@ -385,13 +393,13 @@ class ChangeRequestTemplatePost(APIView):
for tmp_approver in tmp_approvers: for tmp_approver in tmp_approvers:
tmp_approver['template_no'] = tmp_id tmp_approver['template_no'] = tmp_id
data_list_approver.append(tmp_approver) data_list_approver.append(tmp_approver)
serializerApprover = ChangeRequestTemplateApproversSerializer( serializerApprover = ChangeRequestTemplateApproversSerializer(
data=data_list_approver, many=True) data=data_list_approver, many=True)
if serializerApprover.is_valid(raise_exception=True): if serializerApprover.is_valid(raise_exception=True):
serializerApprover.save() serializerApprover.save()
# create template stakes # create template stakes
if template_header['tmp_stakes']: if template_header['tmp_stakes']:
tmp_stakes = template_header['tmp_stakes'] tmp_stakes = template_header['tmp_stakes']
......
...@@ -768,14 +768,15 @@ def cr_routing_actions(approver_instance, current_user, move_to_level): ...@@ -768,14 +768,15 @@ def cr_routing_actions(approver_instance, current_user, move_to_level):
return True return True
def validation_existing_approver(approvers):
counter = 0
for approver in approvers:
# count all delegation not equal to Requestor and Vendor
if approver['delegation'] not in ['DELEGATION-20191119-0000002', 'DELEGATION-20191119-0000001']:
counter = counter + 1
return counter
return counter
......
...@@ -20,6 +20,9 @@ from app.entities import enums, models ...@@ -20,6 +20,9 @@ from app.entities import enums, models
from app.applicationlayer.utils import log_save, CustomPagination from app.applicationlayer.utils import log_save, CustomPagination
from app.applicationlayer.cms.template import serializers from app.applicationlayer.cms.template import serializers
import itertools
from operator import itemgetter
def tmp_add_edit_delete(tmp_request_body, def tmp_add_edit_delete(tmp_request_body,
queryset, queryset,
...@@ -101,3 +104,31 @@ def tmp_add_edit_delete(tmp_request_body, ...@@ -101,3 +104,31 @@ def tmp_add_edit_delete(tmp_request_body,
) )
return True return True
def validation_approver_same_level(approvers):
data_list_appr = []
for approver in approvers:
if 'user' in approver and 'level' in approver:
data_list_appr.append(approver)
# add checking
approvers_data = sorted(data_list_appr,
key=itemgetter('level', 'user'))
for key, value in itertools.groupby(approvers_data,
key=itemgetter('level', 'user')):
count_user_same_level = 0
for i in value:
count_user_same_level = count_user_same_level + 1
user_code = i.get('user')
if count_user_same_level > 1:
user = models.User.objects.get(code=user_code)
user_name = user.name
return user_name
return None
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment