Commit a46ca4ba authored by Gladys Forte's avatar Gladys Forte

Merge pull request #359 in RMS/api-main-service from RMSv2 to staging

* commit '6bfc6119':
  comment
  fix date range filter
  added download for user, department and company
  comment
  dash filter
  endpoint for filters
  adjust draft archived
  change none to null
  archive form
  added is_valid template temporary
  comment
  template_object
  fix status on email, added object template_no
parents fab7e2f6 6bfc6119
......@@ -71,7 +71,8 @@ class ChangeRequestFormHeaderSerializer(
ret['requested_to_user'] = requested_to_user
ret['requested_by_user'] = requested_by_user
ret['requested_by_department'] = model_to_dict(instance.requested_by_department)
ret['template_object'] = model_to_dict(instance.template_no)
# added below
return ret
except Exception as e:
ret['action_required'] = "None"
......@@ -80,6 +81,7 @@ class ChangeRequestFormHeaderSerializer(
ret['requested_to_user'] = "None"
ret['requested_by_user'] ="None"
ret['requested_by_department'] = "None"
ret['template_object'] = "None"
return ret
......@@ -131,7 +133,23 @@ class ChangeRequestFormHeaderSerializerList(
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
if instance.status.lower() == 'draft':
existing_transaction = models.ChangeRequestHistory.objects.filter(
form_code=instance.form_code
)
if existing_transaction.count() > 0:
can_delete = False
else:
can_delete = True # hard delete
elif instance.status.lower() == 'cancelled':
can_delete = False
else:
can_delete = None
ret['can_delete'] = can_delete
return ret
except Exception as e:
ret['action_required'] = "No"
......
......@@ -437,9 +437,14 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
status=status.HTTP_200_OK)
else:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(is_active=False)
return Response(
{"message": "Change request cannot be deleted due to previous transaction/s"},
status=status.HTTP_400_BAD_REQUEST)
{"message": "Draft change request sucessfully archived"},
status=status.HTTP_200_OK)
elif current_status.status.lower() == 'cancelled':
......@@ -700,6 +705,21 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
)
# action
if action.lower() == 'approved':
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=int(next_level),
delegation='Vendor/Implementor'
).first()
if the_next_vendor:
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
if the_next_vendor == the_last_vendor:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
......@@ -730,23 +750,12 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
).update(
is_action=False
)
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=int(next_level),
delegation='Vendor/Implementor'
).first()
if the_next_vendor:
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
if the_next_vendor == the_last_vendor:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
elif action.lower() == 'rejected':
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Rejected')
# send email to vendor
if delegation.lower() == 'requestor':
......@@ -767,10 +776,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
requestor_notification_msg, action,
remarks, level
)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Rejected')
# update is_action for current level
models.ChangeRequestFormApprovers.objects.filter(
......@@ -781,15 +786,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
elif action.lower() == 'completed':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
......@@ -831,6 +827,15 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
is_action=False
)
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
......@@ -844,6 +849,10 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
elif action.lower() == 'accepted':
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Closed')
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
......@@ -853,10 +862,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
remarks, level
)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Closed')
# update is_action for current level
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
......@@ -1281,23 +1286,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
)
# data_list_attach = []
# # create form attachments
# if attach_body['attachments']:
# frm_attachments = attach_body['attachments']
# for frm_attachment in frm_attachments:
# frm_attachment['form_code'] = form_code
# frm_attachment['uploaded_by'] = id_number
# data_list_attach.append(frm_attachment)
# serializerAttach = ChangeRequestFormAttachmentsSerializer(
# data=data_list_attach, many=True)
# if serializerAttach.is_valid(raise_exception=True):
# serializerAttach.save()
message = status_message_response(
200, 'success',
'Attachments successfully updated!',
......
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Company, AllowedCompany
from app.entities.models import (
Company, AllowedCompany,
ChangeRequestFormHeader, AllowedCompany
)
from rest_framework import viewsets, status
from app.businesslayer.company.serializer import AdminCompanySerializer
from app.applicationlayer.utils import CustomPagination, status_message_response
......@@ -12,6 +15,7 @@ from app.applicationlayer.cms.master.form.company.table_filters import (
from app.helper.decorators import rms
from rest_framework.response import Response
from django.db.models import Q
from rest_framework.decorators import action
class ChangeRequestCompanyFormViewSet(viewsets.ModelViewSet):
......@@ -47,3 +51,55 @@ class ChangeRequestCompanyFormViewSet(viewsets.ModelViewSet):
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@action(
methods=['GET'], detail=False,
url_path='filter', url_name='filter'
)
def filter(self, request, *args, **kwargs):
# instance = self.get_object()
# list_his = []
queryset = self.filter_queryset(self.get_queryset())
id_number = request.user.code
forms = ChangeRequestFormHeader.objects.filter(
Q(frm_approvers__user__code=id_number) |
Q(requested_by_user=id_number) |
Q(frm_stakes__user__code=id_number)
).values()
# print(id_number)
# print(forms)
allowed = AllowedCompany.objects.filter(
id_number=id_number
).values().distinct()
forms = [data['requested_to_company_id'] for data in forms]
allowed = [data['company_pivot_id'] for data in allowed]
forms = forms + allowed
if len(forms) == 0:
queryset = queryset.filter(id=0)
else:
queryset = queryset.filter(code__in=forms)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of Company found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
......@@ -16,6 +16,11 @@ from app.applicationlayer.cms.template.details.serializers import ChangeRequestT
from django.conf import settings
from rest_framework.exceptions import ValidationError
from app.applicationlayer.cms.utils_cr import (
BadRequestException
)
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
......@@ -64,7 +69,7 @@ class ChangeRequestTemplatesSerializer(
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
# fields = '__all__'
......@@ -78,6 +83,53 @@ class ChangeRequestTemplatesSerializer(
'tmp_details')
read_only_fields = ['created', 'template_no']
# extra_kwargs = {
# "requested_to_template_id": {
# "error_messages": {
# "unique": "ssCR prefix should be unique"
# }
# }
# }
# def is_valid(self, raise_exception=False):
# assert not hasattr(self, 'restore_object'), (
# 'Serializer `%s.%s` has old-style version 2 `.restore_object()` '
# 'that is no longer compatible with REST framework 3. '
# 'Use the new-style `.create()` and `.update()` methods instead.' %
# (self.__class__.__module__, self.__class__.__name__)
# )
# assert hasattr(self, 'initial_data'), (
# 'Cannot call `.is_valid()` as no `data=` keyword argument was '
# 'passed when instantiating the serializer instance.'
# )
# if not hasattr(self, '_validated_data'):
# try:
# self._validated_data = self.run_validation(self.initial_data)
# except ValidationError as exc:
# self._validated_data = {}
# self._errors = exc.detail
# else:
# self._errors = {}
# # if validation failed
# if self._errors and raise_exception:
# error_message = {}
# message = str(self.errors)
# for k, v in self.errors.items():
# message = str(v)
# start = message.find('string=') + 8
# end = message.find(', code=') - 1
# message = message[start:end]
# error_message[str(k)] = message
# raise BadRequestException(error_message)
# return not bool(self._errors)
class ChangeRequestTemplatesSerializerList(
......
......@@ -265,11 +265,14 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
return Response(message, status=status.HTTP_200_OK)
return Response(
"Unable to edit due to existing transaction",
status=status.HTTP_400_BAD_REQUEST
message = status_message_response(
400, 'failed',
'Unable to update due to existing transaction',
''
)
return Response(message, status=status.HTTP_400_BAD_REQUEST)
@action(
methods=['GET'], detail=False,
url_path='archived', url_name='archived'
......@@ -448,7 +451,7 @@ class ChangeRequestTemplatePost(APIView):
message = {
'code': 500,
'status': 'failed',
'message': 'Request was not able to process' + str(e),
'message': str(e),
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
......@@ -234,7 +234,7 @@ def send_mail_requestor(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
cr_status = template_instance.status
# receiver details --------------------------------------------------
requestor_instance = get_account_details(requested_by_user)
......@@ -258,7 +258,7 @@ def send_mail_requestor(current_user,
name = requestor_name
action_by = sender_name
routing_level = routing_level
status = action
status = cr_status
cr_number = cr_number
cr_name = template_name
company_requestedto = company_name
......@@ -516,4 +516,8 @@ def crhistory_create_save(batch_no, main_action,
template_no=template_no
)
return True
\ No newline at end of file
return True
class BadRequestException(Exception):
pass
\ No newline at end of file
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
class headers(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['deparment'] = instance.department.name
ret['company'] = instance.department.company.name
return ret
class Meta:
model = models.User
fields = (
'code',
'name',
'email',
'contact_no'
)
from rest_framework import viewsets as meviewsets
from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer
from app.entities.models import (
User
)
# from app.applicationlayer.form_listing_ import headers
from app.applicationlayer.download.accounts.serializers import headers
from django.db.models import CharField, Value
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
# from cms.applicationlayer.utilities import logged_user
class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
queryset = User.objects.all()
serializer_class = headers
renderer_classes = (XLSXRenderer,)
filename = 'User List.xlsx'
permission_classes = (AllowAny,)
# def list(self, request, *args, **kwargs):
# # id_number = request.user.code
# self.queryset = User.objects.all()
# # print(headers)
# # print(headers)
# # headers = [data['form_code'] for data in headers]
# # form_code = stake + approver + headers
# # self.queryset = ChangeRequestFormHeader.objects.filter(
# # form_code__in=form_code,
# # deleted_at=None,
# # )
# # exclude = self.queryset.filter(
# # status='DRAFT',
# # requested_by_user__ne=id_number
# # )
# # exclude = [data['form_code'] for data in exclude]
# # self.queryset = headers
# # print(data)
# serializer = self.get_serializer(self.queryset, many=True)
# # print(serializer.data)
# return Response(serializer.data)
column_header = {
'titles': [
'ID_NUMBER',
'Name',
'Email',
'Contact Number',
'Department',
'Company'
],
'column_width': [17, 30, 17],
'height': 25,
'style': {
'alignment': {
'horizontal': 'center',
'vertical': 'center',
'wrapText': False,
'shrink_to_fit': True,
},
'border_side': {
'border_style': 'thin',
'color': 'FF000000',
},
'font': {
'name': 'Arial',
'size': 14,
'bold': True,
'color': 'FF000000',
},
},
}
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
class headers(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['modified'] = instance.modified.strftime('%Y-%m-%d-%H:%M:%S')
return ret
class Meta:
model = models.Company
fields = (
'name',
'contact_details'
)
from rest_framework import viewsets as meviewsets
from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer
from app.entities.models import (
Company
)
# from app.applicationlayer.form_listing_ import headers
from app.applicationlayer.download.company.serializers import headers
from django.db.models import CharField, Value
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
# from cms.applicationlayer.utilities import logged_user
class CompanyDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
queryset = Company.objects.all()
serializer_class = headers
renderer_classes = (XLSXRenderer,)
filename = 'Company List.xlsx'
permission_classes = (AllowAny,)
# def list(self, request, *args, **kwargs):
# id_number = request.user.code
# data = ChangeRequestFormHeader.objects.filter(
# Q(frm_approvers__user__code=id_number) |
# Q(requested_by_user=id_number) |
# Q(frm_stakes__user__code=id_number)
# ).distinct()
# # print(headers)
# # print(headers)
# # headers = [data['form_code'] for data in headers]
# # form_code = stake + approver + headers
# # self.queryset = ChangeRequestFormHeader.objects.filter(
# # form_code__in=form_code,
# # deleted_at=None,
# # )
# # exclude = self.queryset.filter(
# # status='DRAFT',
# # requested_by_user__ne=id_number
# # )
# # exclude = [data['form_code'] for data in exclude]
# # self.queryset = headers
# # print(data)
# serializer = self.get_serializer(data, many=True)
# # print(serializer.data)
# return Response(serializer.data)
column_header = {
'titles': [
'Name',
'Contact Details',
'Date Modified'
],
'column_width': [17, 30, 17],
'height': 25,
'style': {
'alignment': {
'horizontal': 'center',
'vertical': 'center',
'wrapText': False,
'shrink_to_fit': True,
},
'border_side': {
'border_style': 'thin',
'color': 'FF000000',
},
'font': {
'name': 'Arial',
'size': 14,
'bold': True,
'color': 'FF000000',
},
},
}
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
class headers(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['company'] = instance.company.name
return ret
class Meta:
model = models.Department
fields = (
'code',
'name'
)
from rest_framework import viewsets as meviewsets
from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer
from app.entities.models import (
Department
)
# from app.applicationlayer.form_listing_ import headers
from app.applicationlayer.download.department.serializers import headers
from django.db.models import CharField, Value
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
# from cms.applicationlayer.utilities import logged_user
class DepartmentDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
queryset = Department.objects.all()
serializer_class = headers
renderer_classes = (XLSXRenderer,)
filename = 'Department List.xlsx'
permission_classes = (AllowAny,)
# def list(self, request, *args, **kwargs):
# id_number = request.user.code
# data = ChangeRequestFormHeader.objects.filter(
# Q(frm_approvers__user__code=id_number) |
# Q(requested_by_user=id_number) |
# Q(frm_stakes__user__code=id_number)
# ).distinct()
# # print(headers)
# # print(headers)
# # headers = [data['form_code'] for data in headers]
# # form_code = stake + approver + headers
# # self.queryset = ChangeRequestFormHeader.objects.filter(
# # form_code__in=form_code,
# # deleted_at=None,
# # )
# # exclude = self.queryset.filter(
# # status='DRAFT',
# # requested_by_user__ne=id_number
# # )
# # exclude = [data['form_code'] for data in exclude]
# # self.queryset = headers
# # print(data)
# serializer = self.get_serializer(data, many=True)
# # print(serializer.data)
# return Response(serializer.data)
column_header = {
'titles': [
'Code',
'Name',
'Company'
],
'column_width': [17, 30, 17],
'height': 25,
'style': {
'alignment': {
'horizontal': 'center',
'vertical': 'center',
'wrapText': False,
'shrink_to_fit': True,
},
'border_side': {
'border_style': 'thin',
'color': 'FF000000',
},
'font': {
'name': 'Arial',
'size': 14,
'bold': True,
'color': 'FF000000',
},
},
}
......@@ -10,6 +10,10 @@ from app.applicationlayer.management.account.views import UserViewSet
from app.businesslayer.company.views import AdminCompanyViewSet
from app.applicationlayer.management.notification.views import NotificationsViewset
from app.applicationlayer.download.accounts.views import UserDownloadRequest
from app.applicationlayer.download.department.views import DepartmentDownloadRequest
from app.applicationlayer.download.company.views import CompanyDownloadRequest
router = routers.DefaultRouter()
......@@ -19,6 +23,9 @@ router.register(r'departments', DepartmentViewSet)
router.register(r'modules', ModuleViewSet)
router.register(r'users', UserViewSet)
router.register(r'notifications', NotificationsViewset)
router.register(r'user-download', UserDownloadRequest)
router.register(r'department-download', DepartmentDownloadRequest)
router.register(r'company-download', CompanyDownloadRequest)
urlpatterns = (
path('', include(router.urls)),
......
......@@ -108,7 +108,7 @@ def filter_base(base_queryset,
form_type):
return_queryset = base_queryset
try:
if company_requested_to:
......@@ -125,42 +125,32 @@ def filter_base(base_queryset,
return_queryset = return_queryset.filter(status='Closed')
date_modified = []
date_modified_not = []
if date_modified_from and date_modified_to:
#comment
if date_modified_from and date_modified_to:
for query in return_queryset:
created = datetime.strftime(query.created, "%Y-%m-%d")
if created >= date_modified_from and created <= date_modified_to:
date_modified.append(query.id)
return_queryset = return_queryset.filter(id__in=date_modified)
else:
date_modified_not.append(query.id)
return_queryset = return_queryset.filter(id__nin=date_modified_not)
date_required = []
date_required_not = []
return_queryset = return_queryset.filter(id__in=date_modified)
date_required = []
if date_required_from and date_required_to:
for query in return_queryset:
if query.requested_to_target_date:
requested_to_target_date = datetime.strftime(
query.requested_to_target_date,
"%Y-%m-%d")
if requested_to_target_date >= date_required_from and requested_to_target_date <= date_required_to:
date_required.append(query.id)
return_queryset = return_queryset.filter(id__in=date_required)
else:
date_required_not.append(query.id)
return_queryset = return_queryset.filter(id__nin=date_required_not)
else:
date_required_not.append(query.id)
return_queryset = return_queryset.filter(id__nin=date_required_not)
return_queryset = return_queryset.filter(
id__in=date_required
)
return_queryset
except Exception as e:
......@@ -366,8 +356,18 @@ def attachment_add_edit_delete(form_request_body,
pk=i['id']
)
data_old = {
'id': frm_instance.id,
'attachment_type': frm_instance.attachment_type,
'attachment_name': frm_instance.attachment_name,
'file_name': frm_instance.file_name,
'description': frm_instance.description,
'file_upload': frm_instance.file_upload.id
}
frm_code = {
"form_code": form_code
"form_code": form_code,
"uploaded_by": id_number
}
data = {**i, **frm_code}
......@@ -377,18 +377,20 @@ def attachment_add_edit_delete(form_request_body,
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(frm_instance)
self.perform_update(serializer)
new_instance = serializer.data
# comment
crhistory_save(
batch_no,
main_action,
enums.CREnum.UPDATE.value,
entity,
form_code,
old_instance,
new_instance
)
if not data_old == i:
self.perform_update(serializer)
new_instance = serializer.data
# comment
crhistory_save(
batch_no,
main_action,
enums.CREnum.UPDATE.value,
entity,
form_code,
old_instance,
new_instance
)
else:
frm_code = {
......
# Generated by Django 2.2 on 2019-10-09 16:40
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0016_auto_20191008_1730'),
]
operations = [
migrations.AlterModelOptions(
name='changerequesttemplateheader',
options={'ordering': ['-created']},
),
]
......@@ -531,6 +531,7 @@ class ChangeRequestTemplateHeader(BaseHeader):
class Meta:
db_table = 'change_request_template_headers'
ordering = ['-created']
def __str__(self):
return f'{self.requested_to_template_name}'
......
......@@ -3,7 +3,7 @@
<head>
<title>RMS: Acknowledgement Notification</title>
</head>
<body style="font-family: arial;">
<body style="font-family: Sans-Serif;">
<h3>Resource Management System &#40;RMS&#41;</h3>
<h3 style="color:#888888;">Change Request Acknowledgement Notification</h3><br>
......
This diff is collapsed.
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