Commit 59fbdf26 authored by Gladys Forte's avatar Gladys Forte

Merge pull request #105 in RMS/api-main-service from gladys-dev2 to RMSv2

* commit 'a0f98277':
  notif model update
parents b81bd499 a0f98277
......@@ -117,4 +117,4 @@ class ChangeRequestFormHeaderSerializer(
'template_no', 'frm_approvers', 'frm_stakes',
'frm_attachments', 'frm_details')
read_only_fields = ['created', 'archived_at', 'form_code']
read_only_fields = ['created', 'form_code']
......@@ -24,9 +24,11 @@ from app.applicationlayer.utils import QuerySetHelper
from app.businesslayer.changerequest import change_request
from app.applicationlayer.cms.utils_cr import (number_generator,
send_mail_requestor,
next_appover_email)
next_approver_email,
crhistory_save)
from app.entities import enums
from django.forms.models import model_to_dict
import json
APPROVER_MESSAGE = settings.APPROVER_MESSAGE
......@@ -273,15 +275,64 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
url_path='re_route', url_name='re_route'
)
def re_route(self, request, *args, **kwargs):
form_code = kwargs['form_code']
# get old data
old_instance = models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).values()
old_instance = list(old_instance)
# update status to pending
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).update(status='Pending')
# get new data
new_instance = models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).values()
new_instance = list(new_instance)
models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code).update(action=None, remarks=None,
date_sent=None, created=None)
# save history in form header
crhistory_save(
enums.CREnum.REROUTE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
# get all approvers of form
approvers = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code)
for approver in approvers:
# get old data
old_instance = models.ChangeRequestFormApprovers.objects.filter(
code=approver.code).values()
old_instance = list(old_instance)
# reset details
models.ChangeRequestFormApprovers.objects.filter(
code=approver.code).update(action=None, remarks=None,
date_sent=None, created=None)
# get new data
new_instance = models.ChangeRequestFormApprovers.objects.filter(
code=approver.code).values()
new_instance = list(new_instance)
# save history in form approver
crhistory_save(
enums.CREnum.REROUTE.value,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
form_code,
old_instance,
new_instance
)
return Response(
"Change request form successfully re routed",
......@@ -295,26 +346,78 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
def re_submit(self, request, *args, **kwargs):
form_code = kwargs['form_code']
# get old data
old_instance = models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).values()
old_instance = list(old_instance)
# get template no
tmp_no = models.ChangeRequestFormHeader.objects.values_list(
'template_no', flat=True).get(form_code=form_code)
# count total records in cr
frm_count = models.ChangeRequestFormHeader.objects.all().count()
frm_count = frm_count + 1
# get prefix of template
CR_Prefix = models.ChangeRequestTemplateHeader.objects.values_list(
'requested_to_template_id', flat=True).get(template_no=tmp_no)
# generate new template id
generate_tmp = number_generator(CR_Prefix, frm_count)
# update form header to draft and update new template id
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).update(requested_to_template_id=generate_tmp,
status='Draft')
# get new data
new_instance = models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).values()
new_instance = list(new_instance)
# save history in form header
crhistory_save(
enums.CREnum.RESUBMIT.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
# get all approvers of form
approvers = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code)
models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code).update(action=None, remarks=None,
date_sent=None, created=None)
for approver in approvers:
# get old data
old_instance = models.ChangeRequestFormApprovers.objects.filter(
code=approver.code).values()
old_instance = list(old_instance)
# reset details
models.ChangeRequestFormApprovers.objects.filter(
code=approver.code).update(action=None, remarks=None,
date_sent=None, created=None)
# get new data
new_instance = models.ChangeRequestFormApprovers.objects.filter(
code=approver.code).values()
new_instance = list(new_instance)
# save history in form approver
crhistory_save(
enums.CREnum.RESUBMIT.value,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
form_code,
old_instance,
new_instance
)
return Response(
"Change request form successfully resubmitted",
......@@ -327,7 +430,7 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
url_path='actions', url_name='actions'
)
def actions(self, request, *args, **kwargs):
id = request.data['id']
current_user = request.data['user']
......@@ -337,44 +440,41 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
level = request.data['level']
next_level = int(request.data['level']) + 1
remarks = request.data['remarks']
print("level 1")
next_approver = models.ChangeRequestFormApprovers.objects.filter(
level=str(next_level),
form_code=form_code
)
print("level 2")
if action.lower() == 'approved':
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=str(next_level))
).update(
date_sent=datetime.now()
)
# EMAIL CODE FOR REQUESTOR
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
requestor_email_code = REQUESTOR_MESSAGE.split(';')[1]
# EMAIL CODE FOR APPROVER
# NOTIF MSG FOR APPROVER
notification_msg = APPROVER_MESSAGE.split(';')[0]
email_code = APPROVER_MESSAGE.split(';')[1]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
requestor_notification_msg, action,
remarks, level
)
print("level 3")
for n_approver in next_approver:
print(n_approver.user)
if n_approver.delegation.lower() == 'vendor/implementor':
notification_msg = VENDOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
email_code = VENDOR_ACKNOWLEDGE_MESSAGE.split(';')[1]
next_appover_email(
next_approver_email(
n_approver.user, form_code, delegation,
notification_msg, action, email_code
notification_msg, action
)
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=str(next_level))
).update(
date_sent=datetime.now()
)
elif action.lower() == 'rejected':
......@@ -452,14 +552,14 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
# action_cancelled(self, request, *args, **kwargs)
headers = self.get_success_headers(serializer.data)
# headers = self.get_success_headers(serializer.data)
return Response(
serializer.data, status=status.HTTP_201_CREATED
)
# return Response(
# serializer.data, status=status.HTTP_201_CREATED
# )
return Response(
"Change request form successfully re routed",
"Action performed",
status=status.HTTP_200_OK
)
......@@ -524,168 +624,6 @@ class ChangeRequestFormApproversViewset(meviewsets.ModelViewSet):
# headers=headers
# )
@action(
methods=['PATCH'], detail=False,
url_path='approved', url_name='approved'
)
def approved(self, request, *args, **kwargs):
objectid = request.data['id']
instance = models.ChangeRequestFormApprovers.objects.filter(
id=objectid
)
instance = instance.first()
current_remarks = instance.remarks
instance.update(
set__archived_at=datetime.utcnow()
)
request.data['created'] = datetime.now().strftime('%Y-%m-%d, %H:%M:%S') # correct
print("hello")
print(request.data['remarks'])
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
#------------
id = serializer.data['id']
current_user = request.data['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']
next_approver = models.ChangeRequestFormApprovers.objects.filter(
level=str(next_level),
form_code=form_code,
archived_at=None
)
if action.lower() == 'approved':
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_MESSAGE.split(';')[0]
requestor_email_code = REQUESTOR_MESSAGE.split(';')[1]
# EMAIL CODE FOR APPROVER
notification_msg = APPROVER_MESSAGE.split(';')[0]
email_code = APPROVER_MESSAGE.split(';')[1]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
remarks, level
)
for n_approver in next_approver:
print(n_approver.user)
if n_approver.delegation.lower() == 'vendor/implementor':
notification_msg = VENDOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
email_code = VENDOR_ACKNOWLEDGE_MESSAGE.split(';')[1]
next_appover_email(
n_approver.user.code, form_code, delegation,
notification_msg, action, email_code
)
elif action.lower() == 'rejected':
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
email_code = VENDOR_REJECT_MESSAGE.split(';')[1]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
remarks, level
)
else:
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
requestor_email_code = REQUESTOR_REJECT_MESSAGE.split(';')[1]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action, requestor_email_code,
remarks, level
)
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,
remarks, level
)
elif action.lower() == 'acknowledged':
# models.ChangeRequestFormApprovers.objects.filter(
# level=str(next_level)
# ).update(
# date_sent=datetime.now().strftime('%Y-%m-%d, %H:%M:%S')
# )
# 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,
remarks, level
)
elif action.lower() == 'accepted':
# 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,
remarks, level
)
# elif action.lower() == 'cancelled':
# action_cancelled(self, request, *args, **kwargs)
headers = self.get_success_headers(serializer.data)
return Response(
serializer.data, status=status.HTTP_201_CREATED
)
#------------
def list(self, request, *args, **kwargs):
self.queryset = self.queryset.filter(archived_at=None)
self.queryset = QuerySetHelper.Sort(self)
......@@ -835,7 +773,7 @@ class ChangeRequestFormDetailsViewset(meviewsets.ModelViewSet):
class ChangeRequestFormPost(APIView):
# @transaction.atomic()
@transaction.atomic()
def post(self, request):
form_header = request.data
......
......@@ -6,7 +6,7 @@ import requests
from app.entities import models
from datetime import timedelta
from django.db.models import Q
from app.applicationlayer.utils import main_threading
from app.applicationlayer.utils import main_threading, notification_create
from app.helper.email_service import sender
CR_FRONT_LINK = settings.CR_FRONT_LINK
......@@ -249,12 +249,11 @@ def send_mail_vendor(receiver,
)
def send_mail_requestor(receiver,
def send_mail_requestor(current_user,
form_code,
delegation,
msg,
action,
code,
remarks,
routing_level):
......@@ -273,9 +272,10 @@ def send_mail_requestor(receiver,
requestor_instance = get_account_details(requested_by_user)
requestor_name = requestor_instance.values_list('name', flat=True)[0]
requestor_email = requestor_instance.values_list('email', flat=True)[0]
requestor_code = requestor_instance.values_list('code', flat=True)[0]
# sender details --------------------------------------------------
sender_instance = get_account_details(receiver)
sender_instance = get_account_details(current_user)
sender_email = sender_instance.values_list('email', flat=True)[0]
sender_name = sender_instance.values_list('name', flat=True)[0]
......@@ -307,34 +307,20 @@ def send_mail_requestor(receiver,
url, recipient, action_type, admin]
main_threading(args, sender.routing_table_actions)
# if action.lower() == 'approved':
# new_body = {"approved_by": sender_name}
# elif action.lower() == 'rejected':
# new_body = {"rejected_by": sender_name,
# "remarks": remarks}
# elif action.lower() == 'completed':
# new_body = {"completed_by": sender_name}
# elif action.lower() == 'acknowledged':
# new_body = {"acknowledge_by": sender_name}
# data = {**data, **new_body}
message = f"{sender_name} {msg} ({template_name})"
# message = f"{sender_name} {msg} ({template_name})"
# create notification
# notif = send_notification(
# form_code, cr_number,
# requestor_account_id, requestor_name,
# message, app,
# sender_account_id, sender_account_username
# )
notification_create(form_code, message, requestor_code,
current_user)
def next_appover_email(receiver, form_code, delegation, msg, action, code):
def next_approver_email(receiver, form_code, delegation, msg, action, code):
cr_link = f'{CR_FRONT_LINK}/{form_code}'
template_instance = get_template_instance(form_code)
app = 'cms'
cr_number = template_instance.requested_to_template_id
template_name = template_instance.requested_to_template_name
requested_to_company = template_instance.requested_to_company
......@@ -456,4 +442,5 @@ def crhistory_save(action, entity, form_code, fromValue, toValue):
fromValue=fromValue,
toValue=toValue
)
return True
\ No newline at end of file
......@@ -64,7 +64,7 @@ class DepartmentViewSet(viewsets.ModelViewSet):
@decorators.error_safe
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
new_instance = model_to_dict(instance)
self.perform_destroy(instance)
......
from django.conf import settings
from websocket import create_connection
import json
from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
REALTIMESERVER_IP = settings.REALTIMESERVER_IP
def send_broadcast_message(room_name, sender, message):
# ws = create_connection(f"ws://{REALTIMESERVER_IP}/ws/realtimeserver/{room_name}/")
ws = create_connection(f"ws://{REALTIMESERVER_IP}/ws/chat/{room_name}/")
data = {
'sender': sender,
'message': message
}
ws.send(json.dumps(data))
ws.close()
class CustomPagination(PageNumberPagination):
page_size = 10
......
......@@ -14,14 +14,11 @@ from rest_framework import status
from django.conf import settings
from app.applicationlayer.management.notification.utils_notif import (
send_broadcast_message,
CustomPagination)
from app.applicationlayer.utils import (status_message_response)
from rest_framework.exceptions import ValidationError
from django.shortcuts import render, redirect, get_object_or_404
from rest_framework.decorators import action
from rest_framework.views import APIView
from app.applicationlayer.utils import (status_message_response)
class NotificationsViewset(meviewsets.ModelViewSet):
......@@ -141,47 +138,6 @@ class NotificationsViewset(meviewsets.ModelViewSet):
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def create(self, request, *args, **kwargs):
serializer = serializers.NotificationSerializer(data=request.data)
try:
if serializer.is_valid():
serializer.save()
message = {
'code': 201,
'status': 'success',
'message': 'Notification created.',
'results': serializer.data
}
ROOM = serializer.data['account_no']
SENDER = serializer.data['sender_account_no']
send_broadcast_message(
ROOM,
SENDER,
'NEW NOTIFICATIONS'
)
return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e:
message = {
'code': 400,
'status': 'failed',
'message': str(e),
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
message = {
'code': 500,
'status': 'failed',
'message': 'Request was not able to process' + str(e.__class__)
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
def index(request):
return render(request, 'chat/index.html', {})
......
......@@ -3,9 +3,14 @@ from rest_framework.pagination import PageNumberPagination
from rest_framework.response import Response
from functools import wraps
from app.entities import enums
from app.entities.models import EntityLog
from app.entities.models import EntityLog, Notification
from django.forms.models import model_to_dict
from django.conf import settings
from websocket import create_connection
import json
from rest_framework import status
REALTIMESERVER_IP = settings.REALTIMESERVER_IP
class CustomPagination(PageNumberPagination):
page_size = 5
......@@ -119,3 +124,54 @@ def main_threading(args, func_name):
)
t1.start()
return True
# notification
def send_broadcast_message(room_name, sender, message):
ws = create_connection(f"ws://{REALTIMESERVER_IP}/ws/chat/{room_name}/")
data = {
'sender': sender,
'message': message
}
ws.send(json.dumps(data))
ws.close()
def notification_create(form_code, message, account_no, sender_account_no):
# try:
v = Notification.objects.create(
form_code=form_code,
notif_type='TASK',
message=message,
is_read=False,
app='APP-20190909-0000002',
account_no=account_no,
sender_account_no=sender_account_no
)
print(v)
# ROOM = account_no
# SENDER = sender_account_no
# send_broadcast_message(
# ROOM,
# SENDER,
# 'NEW NOTIFICATIONS'
# )
# message = {
# 'code': 200,
# 'status': 'success',
# 'message': 'Notification successfully created!',
# }
# return Response(message, status=status.HTTP_200_OK)
return True
# except Exception as e:
# message = {
# 'code': 500,
# 'status': 'failed',
# 'message': 'Request was not able to process' + str(e.__class__)
# }
# return Response(message,
# status=status.HTTP_500_INTERNAL_SERVER_ERROR)
\ No newline at end of file
......@@ -84,6 +84,16 @@ CR HISTORY ENUMS
*********
'''
class CREnum(Enum):
ADD = "ADD"
UPDATE = "UPDATE"
DELETED = "DELETED"
REROUTE = "REROUTE"
RESUBMIT = "RESUBMIT"
SUBMIT = "SUBMIT"
SAVE = "SAVE"
class CREntitiesEnum(Enum):
CR_FRM_APPROVER = "CR_FRM_APPROVER"
CR_FRM_ATTACHMENT = "CR_FRM_ATTACHMENT"
......
# Generated by Django 2.2 on 2019-09-17 16:20
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0012_auto_20190913_1704'),
]
operations = [
migrations.AlterField(
model_name='changerequesthistory',
name='action',
field=models.CharField(max_length=50),
),
migrations.AlterField(
model_name='changerequesthistory',
name='entity',
field=models.CharField(max_length=50),
),
migrations.AlterField(
model_name='notification',
name='account_no',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AlterField(
model_name='notification',
name='app',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AlterField(
model_name='notification',
name='form_code',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AlterField(
model_name='notification',
name='sender_account_no',
field=models.CharField(blank=True, max_length=255, null=True),
),
]
......@@ -857,14 +857,8 @@ CR HISTORY
class ChangeRequestHistory(AuditClass):
action = models.CharField(
choices=[
(tag.value, tag.value) for tag in enums.LogEnum],
default=enums.LogEnum.ADD.value,
max_length=50)
entity = models.CharField(
choices=[
(tag.value, tag.value) for tag in enums.CREntitiesEnum],
default=enums.CREntitiesEnum.CR_FRM_HEADER.value,
max_length=50)
form_code = models.CharField(
max_length=255,
......@@ -872,7 +866,7 @@ class ChangeRequestHistory(AuditClass):
null=True)
fromValue = models.TextField(blank=True, null=True)
toValue = models.TextField(blank=True, null=True)
def __str__(self):
return self.entity
......@@ -890,24 +884,23 @@ class Notification(models.Model):
code = models.CharField(
unique=True,
max_length=255) # primary key
form_code = models.ForeignKey(
ChangeRequestFormHeader,
on_delete=models.DO_NOTHING,
to_field='form_code')
app = models.ForeignKey(
Application,
on_delete=models.DO_NOTHING,
to_field='code')
form_code = models.CharField(
null=True,
blank=True,
max_length=255)
app = models.CharField(
null=True,
blank=True,
max_length=255)
notif_type = models.CharField(
choices=[(tag.value, tag.value) for tag in enums.NotifTypeEnum],
default=enums.NotifTypeEnum.TASK.value,
max_length=20
)
account_no = models.ForeignKey(
User,
on_delete=models.DO_NOTHING,
to_field='code',
related_name='receiver_account_no')
account_no = models.CharField(
null=True,
blank=True,
max_length=255)
message = models.CharField(
max_length=255,
null=True,
......@@ -915,10 +908,10 @@ class Notification(models.Model):
is_read = models.BooleanField(
default=False,
null=True)
sender_account_no = models.ForeignKey(
User, on_delete=models.DO_NOTHING,
to_field='code',
related_name='sender_account_no')
sender_account_no = models.CharField(
null=True,
blank=True,
max_length=255)
created = models.DateTimeField(auto_now_add=True)
modified = models.DateTimeField(auto_now=True)
......
......@@ -498,13 +498,13 @@ def routing_table_actions(args):
if action_type.lower() == 'approved':
email_template = 'RMS-CRAPPROVED.html'
subject = 'Resource Management System - Change Request Approved'
elif action_type == 'acknowledged':
elif action_type.lower() == 'acknowledged':
email_template = 'RMS-CRACKNOWLEDGE.html'
subject = 'Resource Management System - Change Request Acknowledged'
elif action_by == 'completed':
elif action_by.lower() == 'completed':
email_template = 'RMS-CRCOMPLETED.html'
subject = 'Resource Management System - Change Request Completed'
elif action_type == 'accepted':
elif action_type.lower() == 'accepted':
email_template = 'RMS-CRACCEPTED.html'
subject = 'Resource Management System - Change Request Accepted'
......
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