Commit f0ee6fd3 authored by Gladys Forte's avatar Gladys Forte

save or submit initial

parent f150778f
......@@ -2,6 +2,9 @@ from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
class ChangeRequestFormApproversSerializer(
......@@ -12,13 +15,17 @@ class ChangeRequestFormApproversSerializer(
try:
user = instance.user
user_details = get_account_details(user)
name = user_details['name']
group = user_details['groups'][0]['name']
company = user_details['groups'][0]['company__name']
user_details = get_account_details(user.code)
name = user_details.values_list('name', flat=True)[0]
dept_code = user_details.values_list('department', flat=True)[0]
department_details = get_dept_details(dept_code)
department = department_details.values_list('name', flat=True)[0]
comp_code = department_details.values_list('company', flat=True)[0]
company_details = get_companies_details(comp_code)
company = company_details.values_list('name', flat=True)[0]
ret['name'] = name
ret['department'] = group
ret['department'] = department
ret['company'] = company
return ret
......@@ -31,7 +38,7 @@ class ChangeRequestFormApproversSerializer(
class Meta:
model = models.ChangeRequestFormApprovers
fields = '__all__'
read_only_fields = ['created', 'archived_at', 'code']
read_only_fields = ['created', 'code']
class ChangeRequestFormStakeHoldersSerializer(
......@@ -40,7 +47,7 @@ class ChangeRequestFormStakeHoldersSerializer(
class Meta:
model = models.ChangeRequestFormStakeHolders
fields = '__all__'
read_only_fields = ['created', 'archived_at', 'code']
read_only_fields = ['created', 'code']
class ChangeRequestFormAttachmentsSerializer(
......@@ -49,7 +56,7 @@ class ChangeRequestFormAttachmentsSerializer(
class Meta:
model = models.ChangeRequestFormAttachments
fields = '__all__'
read_only_fields = ['created', 'archived_at', 'code']
read_only_fields = ['created', 'code']
class ChangeRequestFormDetailsSerializer(
......@@ -58,7 +65,7 @@ class ChangeRequestFormDetailsSerializer(
class Meta:
model = models.ChangeRequestFormDetails
fields = '__all__'
read_only_fields = ['created', 'archived_at', 'code']
read_only_fields = ['created', 'code']
class ChangeRequestFormHeaderSerializer(
......@@ -77,12 +84,10 @@ class ChangeRequestFormHeaderSerializer(
ret = super().to_representation(instance)
try:
user = self.context['request'].user
print(user.code)
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
Q(archived_at=None) &
Q(form_code=ret['form_code'])
(Q(action='') | Q(action=None))
).order_by('level')
......
......@@ -265,7 +265,6 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
def retrieve(self, request, *args, **kwargs):
instance = self.queryset.filter(
archived_at=None,
form_code=str(self.kwargs.get('form_code'))
).first()
serializer = self.get_serializer(instance)
......@@ -435,18 +434,41 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
# get request data
id = request.data['id']
current_user = request.data['user']
# current_user = self.request.user
form_code = request.data['form_code']
delegation = request.data['delegation']
action = request.data['action']
level = request.data['level']
next_level = int(request.data['level']) + 1
remarks = request.data['remarks']
# get old data
old_instance = models.ChangeRequestFormApprovers.objects.filter(
pk=id).values()
old_instance = list(old_instance)
# update current row in routing table
models.ChangeRequestFormApprovers.objects.filter(
pk=id).update(action=action,
remarks=remarks,
action_date=datetime.now())
# get new data
new_instance = models.ChangeRequestFormApprovers.objects.filter(
pk=id).values()
new_instance = list(new_instance)
crenum = action.upper()
# save history in form approver
crhistory_save(
crenum,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
form_code,
old_instance,
new_instance
)
# get details of next approver/s
next_approver = models.ChangeRequestFormApprovers.objects.filter(
......@@ -470,8 +492,7 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
# LOOP on next approver for sending email
for n_approver in next_approver:
print(n_approver.user.code)
if n_approver.delegation.lower() == 'vendor/implementor':
notification_msg = VENDOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
......@@ -479,7 +500,7 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
n_approver.user.code, form_code, delegation,
notification_msg
)
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=str(next_level))
......@@ -489,12 +510,13 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
elif action.lower() == 'rejected':
# send email to vendor
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action,
notification_msg, action,
remarks, level
)
......@@ -511,37 +533,29 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
elif action.lower() == 'completed':
models.ChangeRequestFormApprovers.objects.filter(
Q(archived_at=None) & Q(level=str(next_level))
).update(
date_sent=datetime.now().strftime('%Y-%m-%d, %H:%M:%S')
)
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
requestor_email_code = REQUESTOR_COMPLETION_MESSAGE.split(';')[1]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'acknowledged':
models.ChangeRequestFormApprovers.objects.filter(
Q(level=str(next_level))
).update(
date_sent=datetime.now()
)
# models.ChangeRequestFormApprovers.objects.filter(
# level=str(next_level)
# ).update(
# date_sent=datetime.now().strftime('%Y-%m-%d, %H:%M:%S')
# )
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
requestor_email_code = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[1]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
requestor_notification_msg, action,
remarks, level
)
......@@ -549,29 +563,50 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
requestor_email_code = VENDOR_ACCEPTANCE_MESSAGE.split(';')[1]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
requestor_notification_msg, action,
remarks, level
)
# elif action.lower() == 'cancelled':
elif action.lower() == 'cancelled':
# changed form status to cancelled
# action_cancelled(self, request, *args, **kwargs)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).update(status='Cancelled')
# headers = self.get_success_headers(serializer.data)
return Response(
"Action performed",
status=status.HTTP_200_OK
)
# return Response(
# serializer.data, status=status.HTTP_201_CREATED
# )
@action(
methods=['PATCH'], detail=True,
url_path='save', url_name='save'
)
def save(self, request, *args, **kwargs):
form_code = kwargs['form_code']
return Response(
"Action performed",
"Change request form successfully re routed",
status=status.HTTP_200_OK
)
@action(
methods=['PATCH'], detail=True,
url_path='submit', url_name='submit'
)
def submit(self, request, *args, **kwargs):
form_code = kwargs['form_code']
return Response(
"Change request form successfully re routed",
status=status.HTTP_200_OK
)
class ChangeRequestFormApproversViewset(meviewsets.ModelViewSet):
......@@ -634,9 +669,7 @@ class ChangeRequestFormApproversViewset(meviewsets.ModelViewSet):
# )
def list(self, request, *args, **kwargs):
self.queryset = self.queryset.filter(archived_at=None)
self.queryset = QuerySetHelper.Sort(self)
self.queryset = QuerySetHelper.Filter(self)
return super(ChangeRequestFormApproversViewset, self).list(request)
def retrieve(self, request, *args, **kwargs):
......@@ -841,17 +874,38 @@ class ChangeRequestFormPost(APIView):
requested_to_template_id=generate_tmp)
# create template approvers
counter = 0
for frm_approver in frm_approvers:
frm_approver['form_code'] = frm_id
counter = counter + 1
data_list_approver.append(frm_approver)
counter = counter + 1
vendor_data = {
'level': counter,
'delegation': 'Vendor/Implementor',
'user': form_header['requested_to_user'],
'form_code': frm_id
}
data_list_approver.append(vendor_data)
counter = counter + 1
requestor_data = {
'level': counter,
'delegation': 'Requestor',
'user': form_header['requested_by_user'],
'form_code': frm_id
}
data_list_approver.append(requestor_data)
serializerApprover = serializers.ChangeRequestFormApproversSerializer(
data=data_list_approver, many=True)
if serializerApprover.is_valid(raise_exception=True):
serializerApprover.save()
# create template stakes
for frm_stake in frm_stakes:
......
......@@ -91,8 +91,6 @@ class UserList(APIView):
return self.paginator.get_paginated_response(data)
class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateHeader.objects.all()
......@@ -129,7 +127,7 @@ class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
@transaction.atomic
def partial_update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
......@@ -141,7 +139,7 @@ class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
if not tmp_no_exists:
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
......
......@@ -88,7 +88,8 @@ class QuerySetHelper:
def ApproverStatus(status):
choices = ["pending", "rejected", "approved", "completed", "cancelled", 'acknowledged', 'accepted']
choices = ["pending", "rejected", "approved", "completed", "cancelled",
'acknowledged', 'accepted']
if status not in choices:
return False
else:
......@@ -110,7 +111,7 @@ def get_template_instance(form_code):
return template_instance
def send_mail_vendor(current_user,
def send_mail_vendor(requestor,
form_code,
delegation,
msg,
......@@ -127,54 +128,59 @@ def send_mail_vendor(current_user,
requested_to_department = template_instance.requested_to_department.code
requested_by_user = template_instance.requested_by_user.code
requested_to_priority = template_instance.requested_to_priority
vendor_instance = models.ChangeRequestFormApprovers.objects.filter(
Q(delegation="Vendor/Implementor") &
Q(form_code=form_code)
).first()
status = template_instance.status
requested_to_user = template_instance.requested_to_user.code
# receiver details
vendor = get_account_details(vendor_instance.user)
requestor_name = vendor['name']
requestor_email = vendor['email']
requestor_account_id = vendor['id_number']
vendor_instance = get_account_details(requested_to_user)
vendor_name = vendor_instance.values_list('name', flat=True)[0]
vendor_email = vendor_instance.values_list('email', flat=True)[0]
vendor_code = vendor_instance.values_list('code', flat=True)[0]
# sender details
sender_instance = get_account_details(current_user)
sender_account_username = sender_instance['username']
sender_account_id = sender_instance['id_number']
sender_name = sender_instance['name']
group = get_dept_details(requested_to_department)
group_name = group['name']
sender_instance = get_account_details(requestor)
sender_name = sender_instance.values_list('name', flat=True)[0]
sender_code = sender_instance.values_list('code', flat=True)[0]
sender_email = sender_instance.values_list('email', flat=True)[0]
# department details
department = get_dept_details(requested_to_department)
dept_name = department.values_list('name', flat=True)[0]
company = get_companies_details(requested_to_company)
company_name = company['name']
company_name = company.values_list('name', flat=True)[0]
container = receiver_body(
sender_account_id, requestor_account_id, code,
requestor_email, app, "False", requestor_name, routing_level,
action, cr_number, template_name, company_name, group_name,
requested_to_priority, cr_link
)
# call sender email
if action.lower() == 'rejected':
new_body = {"rejected_by": requestor_name,
"remarks": remarks}
elif action.lower() == 'accepted':
new_body = {"approved_by": requestor_name}
data = {**container, **new_body}
email_status = requests.post(EMAIL, data=data)
name = vendor_name
action_by = sender_name
routing_level = routing_level
status = status
cr_number = cr_number
cr_name = template_name
company_requestedto = company_name
department_requestedto = dept_name
priority_level = requested_to_priority
url = cr_link
remarks = remarks
recipient = vendor_email
action_type = action
delegation_type = delegation
admin = sender_email
args = [name, action_by, routing_level, status, cr_number, cr_name,
company_requestedto, department_requestedto, priority_level,
url, remarks, recipient, action_type, delegation_type, admin]
main_threading(args, sender.routing_table_actions)
message = f"{sender_name} {msg} ({template_name})"
send_notification(
form_code, cr_number,
requestor_account_id, requestor_name,
message, app,
sender_account_id, sender_account_username
)
# create notification
notification_create(form_code, message, vendor_code,
sender_code)
def send_mail_requestor(current_user,
......@@ -228,11 +234,12 @@ def send_mail_requestor(current_user,
recipient = requestor_email
action_type = action
delegation_type = delegation
admin = sender_email
args = [name, action_by, routing_level, status, cr_number, cr_name,
company_requestedto, department_requestedto, priority_level,
url, recipient, action_type, admin]
url, remarks, recipient, action_type, delegation_type, admin]
main_threading(args, sender.routing_table_actions)
......
......@@ -21,20 +21,17 @@ def list_by_user(user_id_number):
try:
approver = models.ChangeRequestFormApprovers.objects.filter(
Q(user=user_id_number) &
Q(archived_at=None)
Q(user=user_id_number)
)
approver = [data.form_code for data in approver]
stake = models.ChangeRequestFormStakeHolders.objects.filter(
Q(user=user_id_number) &
Q(archived_at=None)
Q(user=user_id_number)
)
stake = [data.form_code for data in stake]
headers = models.ChangeRequestFormHeader.objects.filter(
archived_at=None,
requested_by_user=user_id_number
)
headers = [data.form_code for data in headers]
......@@ -61,8 +58,7 @@ def list_by_user(user_id_number):
form_code = list(set(stake + approver + headers))
return_queryset = models.ChangeRequestFormHeader.objects.filter(
form_code__in=form_code,
archived_at=None,
form_code__in=form_code
)
exclude = return_queryset.filter(
status__iexact='Draft',
......
......@@ -92,6 +92,12 @@ class CREnum(Enum):
RESUBMIT = "RESUBMIT"
SUBMIT = "SUBMIT"
SAVE = "SAVE"
APPROVED = "APPROVED"
COMPLETED = "COMPLETED"
CANCELLED = "CANCELLED"
ACCEPTED = "ACCEPTED"
ACKNOWLEDGED = "ACKNOWLEDGED"
REJECTED = "REJECTED"
class CREntitiesEnum(Enum):
......
......@@ -478,7 +478,9 @@ def admin_changepassword(args):
# # html_message=FC
# # )
# RMS-CRAPPROVED ; RMS-CRACKNOWLEDGE ; RMS-CRCOMPLETED ; RMS-CRACCEPTED
# RMS-CRAPPROVED ; RMS-CRACKNOWLEDGE ; RMS-CRCOMPLETED ; RMS-CRACCEPTED ;
# RMS-CRREJECTED ; RMS-CRREJECTED-VENDOR
def routing_table_actions(args):
name = args[0]
action_by = args[1]
......@@ -490,92 +492,31 @@ def routing_table_actions(args):
department_requestedto = args[7]
priority_level = args[8]
url = args[9]
remarks = args[10]
recipient = args[10]
action_type = args[11]
admin = args[12]
recipient = args[11]
action_type = args[12]
delegation_type = args[13]
admin = args[14]
if action_type.lower() == 'approved':
if args[12].lower() == 'approved':
email_template = 'RMS-CRAPPROVED.html'
subject = 'Resource Management System - Change Request Approved'
elif action_type.lower() == 'acknowledged':
elif args[12].lower() == 'acknowledged':
email_template = 'RMS-CRACKNOWLEDGE.html'
subject = 'Resource Management System - Change Request Acknowledged'
elif action_by.lower() == 'completed':
elif args[12].lower() == 'completed':
email_template = 'RMS-CRCOMPLETED.html'
subject = 'Resource Management System - Change Request Completed'
elif action_type.lower() == 'accepted':
elif args[12].lower() == 'accepted':
email_template = 'RMS-CRACCEPTED.html'
subject = 'Resource Management System - Change Request Accepted'
F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, email_template), 'r')
FC = F.read()
FC = FC.replace('{name}', name)
FC = FC.replace('{action_by}', action_by)
FC = FC.replace('{routing_level}', routing_level)
FC = FC.replace('{status}', status)
FC = FC.replace('{cr_number}', cr_number)
FC = FC.replace('{cr_name}', cr_name)
FC = FC.replace('{company_requestedto}', company_requestedto)
FC = FC.replace('{department_requestedto}', department_requestedto)
FC = FC.replace('{priority_level}', priority_level)
FC = FC.replace('{url}', url)
try:
send_mail(
subject=subject,
message='',
from_email=settings.EMAIL_DEFAULT_SENDER,
recipient_list=(recipient,),
html_message=FC,
fail_silently=False
)
models.EmailLogs.objects.create(
template=email_template,
recipients=recipient,
content=FC,
is_sent=True,
createdby=admin,
modifiedby=admin
)
except Exception as e:
models.EmailLogs.objects.create(
template=email_template,
recipients=recipient,
content=FC,
is_sent=False,
createdby=admin,
modifiedby=admin
)
return True
# RMS-CRREJECTED ; RMS-CRREJECTED-VENDOR
def routing_table_actions_rejected(args):
name = args[0]
action_by = args[1]
routing_level = args[2]
status = args[3]
cr_number = args[4]
cr_name = args[5]
company_requestedto = args[6]
department_requestedto = args[7]
priority_level = args[8]
url = args[9]
remarks = args[10]
recipient = args[11]
rejected_type = args[12]
admin = args[13]
if rejected_type == 'requestor':
email_template = 'RMS-CRREJECTED.html'
subject = 'Resource Management System - Change Request Rejected'
elif rejected_type == 'vendor':
email_template = 'RMS-CRREJECTED-VENDOR.html'
elif args[12].lower() == 'rejected':
subject = 'Resource Management System - Change Request Rejected'
if args[13].lower() == 'requestor':
email_template = 'RMS-CRREJECTED.html'
elif args[13].lower() == 'vendor/implementor':
email_template = 'RMS-CRREJECTED-VENDOR.html'
F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, email_template), 'r')
......@@ -591,7 +532,9 @@ def routing_table_actions_rejected(args):
FC = FC.replace('{department_requestedto}', department_requestedto)
FC = FC.replace('{priority_level}', priority_level)
FC = FC.replace('{url}', url)
FC = FC.replace('{remarks}', remarks)
if args[11].lower() == 'rejected':
FC = FC.replace('{remarks}', remarks)
try:
send_mail(
......
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