Commit 991e441c authored by Gladys Forte's avatar Gladys Forte

Merge branch 'RMSv2' into 'core-dev'

Rm sv2

See merge request rms/Backend/api-main-service!811
parents 7e202dd4 eea1c456
FROM python:3.6
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ADD . /code
COPY . /code
WORKDIR /code
RUN pip install -r requirements/local.txt
EXPOSE 7020
RUN python manage.py migrate
...@@ -38,8 +38,6 @@ class Login(ObtainAuthToken): ...@@ -38,8 +38,6 @@ class Login(ObtainAuthToken):
return Response({ return Response({
'token': token.key, 'token': token.key,
# 'user_id': user.pk,
# 'email': user.email
}) })
except Exception as e: except Exception as e:
return Response( return Response(
...@@ -84,7 +82,6 @@ class RefreshToken(APIView): ...@@ -84,7 +82,6 @@ class RefreshToken(APIView):
class CurrentUser(APIView): class CurrentUser(APIView):
# @decorators.error_safe
def get(self, request, token=None, *args, **kwargs): def get(self, request, token=None, *args, **kwargs):
serializer = UserManagementRetreiveSerializer serializer = UserManagementRetreiveSerializer
...@@ -108,7 +105,6 @@ class CurrentUser(APIView): ...@@ -108,7 +105,6 @@ class CurrentUser(APIView):
class ForgotPassword(APIView): class ForgotPassword(APIView):
permission_classes = (AllowAny,) permission_classes = (AllowAny,)
# @decorators.error_safe
@transaction.atomic @transaction.atomic
def post(self, request, *args, **kwargs): def post(self, request, *args, **kwargs):
email = request.data['email'] email = request.data['email']
......
from django.apps import AppConfig
class AuthenticationConfig(AppConfig):
name = 'authentication'
from django.db import models
# Create your models here.
from django.shortcuts import render
# Create your views here.
...@@ -2,6 +2,7 @@ from rest_framework import serializers ...@@ -2,6 +2,7 @@ from rest_framework import serializers
from app.entities.models import AllowedCompany from app.entities.models import AllowedCompany
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
class AllowedCompanySerializer(serializers.ModelSerializer): class AllowedCompanySerializer(serializers.ModelSerializer):
def to_representation(self, instance): def to_representation(self, instance):
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import AllowedCompany from app.entities.models import AllowedCompany
from django.db.models import Q from django.db.models import Q
......
# from rest_framework.views import APIView
from rest_framework import status, viewsets from rest_framework import status, viewsets
from rest_framework.response import Response from rest_framework.response import Response
from app.entities import enums
from app.entities.models import AllowedCompany from app.entities.models import AllowedCompany
from app.applicationlayer.utils import CustomPagination, status_message_response from app.applicationlayer.utils import (CustomPagination,
# from rest_framework.exceptions import ParseError status_message_response)
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
...@@ -20,7 +18,6 @@ from django.db import IntegrityError ...@@ -20,7 +18,6 @@ from django.db import IntegrityError
class AllowedCompanyViewSet(viewsets.ModelViewSet): class AllowedCompanyViewSet(viewsets.ModelViewSet):
# queryset = AllowedCompany.objects.all()
queryset = AllowedCompany.objects.select_related( queryset = AllowedCompany.objects.select_related(
'id_number', 'company_pivot', 'group_pivots' 'id_number', 'company_pivot', 'group_pivots'
).all() ).all()
...@@ -35,7 +32,6 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet): ...@@ -35,7 +32,6 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
'group_pivots__code' 'group_pivots__code'
) )
# @decorators.rms.user_list
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
......
from app.entities import models from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, views from rest_framework import status, views
from django.db.models import Q from django.db.models import Q
import requests
from django.conf import settings from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
...@@ -27,7 +23,7 @@ class CancelTriggerAPIView(views.APIView): ...@@ -27,7 +23,7 @@ class CancelTriggerAPIView(views.APIView):
list_of_emails = [] list_of_emails = []
for data in today_mail: for data in today_mail:
if data.is_sent == False and data.form_code.status == 'Pending' and data.frm_approver.is_action == True: if data.is_sent is False and data.form_code.status == 'Pending' and data.frm_approver.is_action is True:
cr_link = f'{CR_FRONT_LINK}/{data.form_code}' cr_link = f'{CR_FRONT_LINK}/{data.form_code}'
......
from app.entities import models from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, views from rest_framework import status, views
from django.db.models import Q from django.db.models import Q
import requests
from django.conf import settings from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
...@@ -28,7 +24,7 @@ class OverdueTriggerAPIView(views.APIView): ...@@ -28,7 +24,7 @@ class OverdueTriggerAPIView(views.APIView):
list_of_emails = [] list_of_emails = []
for data in today_mail: for data in today_mail:
if data.is_sent == False and (data.form_code.status == 'Pending' or if data.is_sent is False and (data.form_code.status == 'Pending' or
data.form_code.status == 'Approved' or data.form_code.status == 'Approved' or
data.form_code.status == 'Rejected'): data.form_code.status == 'Rejected'):
......
from app.entities import models from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, views from rest_framework import status, views
from django.db.models import Q from django.db.models import Q
import requests
from django.conf import settings from django.conf import settings
from datetime import timedelta from datetime import timedelta
from app.helper.email_service import sender from app.helper.email_service import sender
...@@ -30,7 +27,7 @@ class ReminderTriggerAPIView(views.APIView): ...@@ -30,7 +27,7 @@ class ReminderTriggerAPIView(views.APIView):
list_of_emails = [] list_of_emails = []
for data in today_mail: for data in today_mail:
if data.frm_approver.is_action == True and data.form_code.status == 'Pending': if data.frm_approver.is_action is True and data.form_code.status == 'Pending':
# common details # common details
cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}' cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}'
......
from app.entities import models from app.entities import models
from rest_framework import serializers from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class ChangeRequestFormApproversSerializer( class ChangeRequestFormApproversSerializer(
...@@ -8,7 +7,7 @@ class ChangeRequestFormApproversSerializer( ...@@ -8,7 +7,7 @@ class ChangeRequestFormApproversSerializer(
): ):
def to_representation(self, instance): def to_representation(self, instance):
ret = super().to_representation(instance) ret = super().to_representation(instance)
print(instance)
try: try:
ret['company'] = { ret['company'] = {
"id": instance.user.department.company.id, "id": instance.user.department.company.id,
...@@ -38,17 +37,17 @@ class ChangeRequestFormApproversSerializer( ...@@ -38,17 +37,17 @@ class ChangeRequestFormApproversSerializer(
if instance.form_code.status == 'Draft': if instance.form_code.status == 'Draft':
if instance.tmp_approver: if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.user:
ret['editable_user'] = False ret['editable_user'] = False
else: else:
ret['editable_user'] = True ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.company:
ret['editable_comp'] = False ret['editable_comp'] = False
else: else:
ret['editable_comp'] = True ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.department:
ret['editable_dept'] = False ret['editable_dept'] = False
else: else:
ret['editable_dept'] = True ret['editable_dept'] = True
...@@ -58,13 +57,12 @@ class ChangeRequestFormApproversSerializer( ...@@ -58,13 +57,12 @@ class ChangeRequestFormApproversSerializer(
else: else:
ret['editable_deleg'] = True ret['editable_deleg'] = True
# print(instance.tmp_approver.delegation.name) if instance.tmp_approver.delegation:
# comment if instance.tmp_approver.delegation.name.lower() == 'requestor':
# if instance.tmp_approver.delegation.name.lower() == 'requestor': ret['editable_user'] = False
# ret['editable_user'] = False ret['editable_comp'] = False
# ret['editable_comp'] = False ret['editable_dept'] = False
# ret['editable_dept'] = False ret['editable_deleg'] = False
# ret['editable_deleg'] = False
else: else:
ret['editable_user'] = True ret['editable_user'] = True
...@@ -84,13 +82,13 @@ class ChangeRequestFormApproversSerializer( ...@@ -84,13 +82,13 @@ class ChangeRequestFormApproversSerializer(
if instance.form_code.status == 'Draft': if instance.form_code.status == 'Draft':
if instance.tmp_approver: if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.user:
ret['editable_user'] = False ret['editable_user'] = False
else: else:
ret['user'] = None ret['user'] = None
ret['editable_user'] = True ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.company:
ret['company'] = { ret['company'] = {
"id": instance.tmp_approver.company.id, "id": instance.tmp_approver.company.id,
"code": instance.tmp_approver.company.code, "code": instance.tmp_approver.company.code,
...@@ -102,7 +100,7 @@ class ChangeRequestFormApproversSerializer( ...@@ -102,7 +100,7 @@ class ChangeRequestFormApproversSerializer(
ret['company'] = None ret['company'] = None
ret['editable_comp'] = True ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.department:
ret['department'] = { ret['department'] = {
"id": instance.tmp_approver.department.id, "id": instance.tmp_approver.department.id,
"code": instance.tmp_approver.department.code, "code": instance.tmp_approver.department.code,
...@@ -125,12 +123,12 @@ class ChangeRequestFormApproversSerializer( ...@@ -125,12 +123,12 @@ class ChangeRequestFormApproversSerializer(
ret['delegation'] = None ret['delegation'] = None
ret['editable_deleg'] = True ret['editable_deleg'] = True
# print(instance.tmp_approver.delegation.name) if instance.tmp_approver.delegation:
# if instance.tmp_approver.delegation.name.lower() == 'requestor': if instance.tmp_approver.delegation.name.lower() == 'requestor':
# ret['editable_user'] = False ret['editable_user'] = False
# ret['editable_comp'] = False ret['editable_comp'] = False
# ret['editable_dept'] = False ret['editable_dept'] = False
# ret['editable_deleg'] = False ret['editable_deleg'] = False
else: else:
ret['editable_user'] = True ret['editable_user'] = True
......
...@@ -13,7 +13,6 @@ from app.applicationlayer.utils import ( ...@@ -13,7 +13,6 @@ from app.applicationlayer.utils import (
class ChangeRequestFormApproversViewset(viewsets.ModelViewSet): class ChangeRequestFormApproversViewset(viewsets.ModelViewSet):
# queryset = models.ChangeRequestFormApprovers.objects.all().order_by('level')
queryset = models.ChangeRequestFormApprovers.objects.select_related( queryset = models.ChangeRequestFormApprovers.objects.select_related(
'form_code', 'tmp_approver' 'form_code', 'tmp_approver'
).all().order_by('level') ).all().order_by('level')
......
from app.entities import models from app.entities import models
from rest_framework import serializers from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class ChangeRequestFormAttachmentsSerializer( class ChangeRequestFormAttachmentsSerializer(
...@@ -17,6 +16,7 @@ class ChangeRequestFormAttachmentsSerializer( ...@@ -17,6 +16,7 @@ class ChangeRequestFormAttachmentsSerializer(
"contact_no": instance.uploaded_by.contact_no "contact_no": instance.uploaded_by.contact_no
} }
ret['uploaded_by'] = user_object ret['uploaded_by'] = user_object
ret['file_upload'] = self.context['request'].build_absolute_uri( ret['file_upload'] = self.context['request'].build_absolute_uri(
instance.file_upload.url.url) instance.file_upload.url.url)
ret['file_upload_id'] = instance.file_upload.id ret['file_upload_id'] = instance.file_upload.id
...@@ -28,7 +28,6 @@ class ChangeRequestFormAttachmentsSerializer( ...@@ -28,7 +28,6 @@ class ChangeRequestFormAttachmentsSerializer(
read_only_fields = ['created', 'code'] read_only_fields = ['created', 'code']
class ChangeRequestFormAttachmentsFileUploadSerializer( class ChangeRequestFormAttachmentsFileUploadSerializer(
serializers.ModelSerializer serializers.ModelSerializer
): ):
......
from app.entities import models from app.entities import models
from rest_framework import serializers from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class ChangeRequestFormDetailsSerializer( class ChangeRequestFormDetailsSerializer(
......
...@@ -13,7 +13,6 @@ from app.applicationlayer.utils import ( ...@@ -13,7 +13,6 @@ from app.applicationlayer.utils import (
class ChangeRequestFormDetailsViewset(viewsets.ModelViewSet): class ChangeRequestFormDetailsViewset(viewsets.ModelViewSet):
# queryset = models.ChangeRequestFormDetails.objects.all()
queryset = models.ChangeRequestFormDetails.objects.select_related( queryset = models.ChangeRequestFormDetails.objects.select_related(
'form_code' 'form_code'
).all() ).all()
......
from rest_framework import viewsets as meviewsets
from rest_framework.viewsets import ReadOnlyModelViewSet from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer from drf_renderer_xlsx.renderers import XLSXRenderer
from app.entities.models import ( from app.entities.models import (
ChangeRequestFormHeader, ChangeRequestFormHeader,
ChangeRequestFormApprovers,
ChangeRequestFormStakeHolders,
AllowedCompany AllowedCompany
) )
# from app.applicationlayer.form_listing_ import headers
from app.applicationlayer.cms.form.download.serializers import headers from app.applicationlayer.cms.form.download.serializers import headers
from django.db.models import CharField, Value
from django.db.models import Q from django.db.models import Q
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework.permissions import AllowAny from rest_framework.permissions import AllowAny
# from cms.applicationlayer.utilities import logged_user
class DownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet): class DownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
......
...@@ -98,7 +98,7 @@ class ChangeRequestFormHeaderSerializer( ...@@ -98,7 +98,7 @@ class ChangeRequestFormHeaderSerializer(
ret['template_object'] = "None" ret['template_object'] = "None"
return ret return ret
# 'company_desc', 'department_desc', 'requested_desc',
class Meta: class Meta:
model = models.ChangeRequestFormHeader model = models.ChangeRequestFormHeader
# fields = '__all__' # fields = '__all__'
......
import configparser import configparser
import shutil import shutil
import os import os
from django.shortcuts import render
from rest_framework import viewsets from rest_framework import viewsets
from rest_framework.views import APIView from rest_framework.views import APIView
from app.entities import models from app.entities import models
from datetime import datetime from datetime import datetime
from datetime import timedelta
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, views from rest_framework import status, views
from rest_framework.decorators import action from rest_framework.decorators import action
from django.http import Http404
from django.db.models import Q from django.db.models import Q
import requests
from django.conf import settings from django.conf import settings
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from django.db import transaction, IntegrityError, connection from django.db import transaction
from app.applicationlayer.utils import (QuerySetHelper, from app.applicationlayer.utils import (status_message_response,
status_message_response, send_broadcast_message,
send_broadcast_message) CustomPagination,
from app.businesslayer.changerequest import change_request model_to_dict,
main_threading,
from app.applicationlayer.cms.utils_cr import (number_generator, error_message)
send_mail_requestor,
next_approver_email, from app.businesslayer.changerequest import (change_request,
change_request_template)
from app.applicationlayer.cms.utils_cr import (next_approver_email,
crhistory_save, crhistory_save,
send_mail_vendor,
get_max_batchno, get_max_batchno,
generate_template_id, generate_template_id,
crhistory_create_save, crhistory_create_save,
entity_log_bulk, entity_log_bulk,
reminder_trigger_save, reminder_trigger_save,
overdue_trigger_save, overdue_trigger_save,
reset_autoemail_tables) delete_master_attachment_file)
from app.entities import enums from app.entities import enums
from app.applicationlayer.utils import model_to_dict
import json import json
from django.shortcuts import get_object_or_404 from django.shortcuts import get_object_or_404
from django.db.models import Min from django.db.models import Min
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from rest_framework.exceptions import ParseError
from app.businesslayer.changerequest.change_request import ( from app.businesslayer.changerequest.change_request import (
form_add_edit_delete form_add_edit_delete
) )
...@@ -64,15 +58,13 @@ from app.applicationlayer.cms.form.header.table_filters import HeaderFilterSet ...@@ -64,15 +58,13 @@ from app.applicationlayer.cms.form.header.table_filters import HeaderFilterSet
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
import json
from app.applicationlayer.utils import main_threading
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.conf import settings from django.conf import settings
from io import BytesIO from io import BytesIO
from django.http import HttpResponse from django.http import HttpResponse
from xhtml2pdf import pisa from xhtml2pdf import pisa
from app.helper.decorators import *
config = configparser.ConfigParser() config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini') config_file = os.path.join('./', 'env.ini')
...@@ -211,6 +203,17 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -211,6 +203,17 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
self.queryset = change_request.list_by_user_without_dept( self.queryset = change_request.list_by_user_without_dept(
id_number) id_number)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
request.query_params.get('department_requested_to'),
request.query_params.get('date_modified_from'),
request.query_params.get('date_modified_to'),
request.query_params.get('date_required_from'),
request.query_params.get('date_required_to'),
request.query_params.get('form_type'),
)
awaiting_filtered = change_request.filter_awaiting(self.queryset, id_number) awaiting_filtered = change_request.filter_awaiting(self.queryset, id_number)
awaiting = awaiting_filtered.count() awaiting = awaiting_filtered.count()
...@@ -219,22 +222,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -219,22 +222,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
overdue = overdue_filtered.count() overdue = overdue_filtered.count()
# server side computations
# status_total = pending + approved + rejected + cancelled + completed
# close = rejected + cancelled + completed
# opened = pending + approved
# open_percent = round((opened/status_total) * 100)
# close_percent = round((close/status_total) * 100)
# priority_total = high + normal
# high_percent = round((high/priority_total) * 100)
# normal_percent = round((normal/priority_total) * 100)
message = { message = {
'account_no': id_number, 'account_no': id_number,
'pending': pending, 'pending': pending,
...@@ -246,10 +233,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -246,10 +233,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
'normal': normal, 'normal': normal,
'awaiting': awaiting, 'awaiting': awaiting,
'overdue': overdue, 'overdue': overdue,
# 'open_percent': open_percent,
# 'close_percent': close_percent,
# 'high_percent': high_percent,
# 'normal_percent': normal_percent,
'code': 200, 'code': 200,
'status': 'success', 'status': 'success',
'message': 'Dashboard Summary' 'message': 'Dashboard Summary'
...@@ -547,9 +530,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -547,9 +530,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
form_code=str(form_code) form_code=str(form_code)
).values('file_upload__url') ).values('file_upload__url')
attch_list = [data['file_upload__url'].split('/')[1] for data in attch] attch_list = [data['file_upload__url'].split('/')[1] for data in attch]
# print(attch.query)
# print(attch)
# print(attch_list)
if os.path.isdir(my_folder): if os.path.isdir(my_folder):
shutil.rmtree(my_folder) shutil.rmtree(my_folder)
...@@ -575,17 +555,12 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -575,17 +555,12 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
# full_file_name = os.path.join(my_folder, file_name) # full_file_name = os.path.join(my_folder, file_name)
# if os.path.isfile(full_file_name): # if os.path.isfile(full_file_name):
# shutil.copy(full_file_name, dest) # shutil.copy(full_file_name, dest)
print(attch)
for file_name in attch: for file_name in attch:
print(file_name['file_upload__url'])
a = os.path.join(settings.MEDIA_ROOT, file_name['file_upload__url']) a = os.path.join(settings.MEDIA_ROOT, file_name['file_upload__url'])
# full_file_name = os.path.join(my_folder, file_name['file_upload__url']) # full_file_name = os.path.join(my_folder, file_name['file_upload__url'])
# print(full_file_name) # print(full_file_name)
if os.path.isfile(a): if os.path.isfile(a):
print('ddd')
print(a)
# print(type(a))
b = open(a, 'r') b = open(a, 'r')
shutil.copy(b, my_folder) shutil.copy(b, my_folder)
else: else:
...@@ -749,6 +724,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -749,6 +724,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
return Response(message, status=status.HTTP_200_OK) return Response(message, status=status.HTTP_200_OK)
@FormValidation
@transaction.atomic @transaction.atomic
@action( @action(
methods=['PATCH'], detail=True, methods=['PATCH'], detail=True,
...@@ -862,6 +838,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -862,6 +838,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
return Response(message, status=status.HTTP_200_OK) return Response(message, status=status.HTTP_200_OK)
@FormValidation
@transaction.atomic @transaction.atomic
@action( @action(
methods=['PATCH'], detail=True, methods=['PATCH'], detail=True,
...@@ -875,6 +852,13 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -875,6 +852,13 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
form_code = kwargs['form_code'] form_code = kwargs['form_code']
form_data = request.data form_data = request.data
# Restrict a requestor to submit a CR without atleast 1 approver
counter = change_request_template.validation_existing_approver(
form_data['frm_approvers'])
if counter == 0:
return error_message('400', 'Please select at least 1 approver before submitting this request.',
'failed', status.HTTP_400_BAD_REQUEST)
# generate batchno history # generate batchno history
batchno = get_max_batchno("batch") batchno = get_max_batchno("batch")
...@@ -1177,11 +1161,19 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -1177,11 +1161,19 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
class ChangeRequestFormPost(APIView): class ChangeRequestFormPost(APIView):
@FormValidation
@transaction.atomic() @transaction.atomic()
def post(self, request): def post(self, request):
form_header = request.data
form_header = request.data
try: try:
# Restrict a requestor to submit a CR without atleast 1 approver
counter = validation_existing_approver(form_header['frm_approvers'])
if form_header['status'].lower() == 'pending' and counter == 0:
return error_message('400', 'Please select at least 1 approver before submitting this request.',
'failed', status.HTTP_400_BAD_REQUEST)
data_list_approver = [] data_list_approver = []
data_list_stake = [] data_list_stake = []
data_list_attach = [] data_list_attach = []
...@@ -1195,9 +1187,6 @@ class ChangeRequestFormPost(APIView): ...@@ -1195,9 +1187,6 @@ class ChangeRequestFormPost(APIView):
'requested_to_priority': form_header['requested_to_priority'], 'requested_to_priority': form_header['requested_to_priority'],
'description': form_header['description'], 'description': form_header['description'],
'status': form_header['status'], 'status': form_header['status'],
'company_desc': form_header['company_desc'],
'department_desc': form_header['department_desc'],
'requested_desc': form_header['requested_desc'],
'requested_by_department': form_header['requested_by_department'], 'requested_by_department': form_header['requested_by_department'],
'requested_by_user': form_header['requested_by_user'], 'requested_by_user': form_header['requested_by_user'],
'requested_to_company': form_header['requested_to_company'], 'requested_to_company': form_header['requested_to_company'],
...@@ -1206,7 +1195,7 @@ class ChangeRequestFormPost(APIView): ...@@ -1206,7 +1195,7 @@ class ChangeRequestFormPost(APIView):
'template_no': form_header['template_no'] 'template_no': form_header['template_no']
} }
# sp1 = transaction.savepoint() # nothing will save to db sp1 = transaction.savepoint() # nothing will save to db
serializer = ChangeRequestFormHeaderSerializer( serializer = ChangeRequestFormHeaderSerializer(
data=form_header_data) data=form_header_data)
...@@ -1228,10 +1217,8 @@ class ChangeRequestFormPost(APIView): ...@@ -1228,10 +1217,8 @@ 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)
serializerApprover = ChangeRequestFormApproversSerializer( serializerApprover = ChangeRequestFormApproversSerializer(
...@@ -1364,7 +1351,8 @@ class ChangeRequestFormPost(APIView): ...@@ -1364,7 +1351,8 @@ class ChangeRequestFormPost(APIView):
return Response(message, status=status.HTTP_201_CREATED) return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e: except ValidationError as e:
# transaction.savepoint_rollback(sp1) transaction.savepoint_rollback(sp1)
message = { message = {
'code': 400, 'code': 400,
'status': 'failed', 'status': 'failed',
...@@ -1373,7 +1361,8 @@ class ChangeRequestFormPost(APIView): ...@@ -1373,7 +1361,8 @@ class ChangeRequestFormPost(APIView):
return Response(message, status=status.HTTP_400_BAD_REQUEST) return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e: except Exception as e:
# transaction.savepoint_rollback(sp1) transaction.savepoint_rollback(sp1)
message = { message = {
'code': 500, 'code': 500,
'status': 'failed', 'status': 'failed',
......
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.utils import model_to_dict
class ChangeRequestFormApproversSerializer(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = model_to_dict(instance.user.department.company)
ret['department'] = model_to_dict(instance.user.department)
user_object = {
"id": instance.user.id,
"name": instance.user.name,
"username": instance.user.username,
"code": instance.user.code,
"email": instance.user.email,
"contact_no": instance.user.contact_no
}
ret['user'] = user_object
return ret
except Exception as e:
ret['user'] = "none"
ret['department'] = "none"
ret['company'] = "none"
return ret
class Meta:
model = models.ChangeRequestFormApprovers
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormStakeHoldersSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormStakeHolders
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormAttachmentsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormDetails
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestFormHeaderSerializer(
serializers.ModelSerializer
):
frm_approvers = ChangeRequestFormApproversSerializer(
many=True, read_only=True)
frm_stakes = ChangeRequestFormStakeHoldersSerializer(
many=True, read_only=True)
frm_attachments = ChangeRequestFormAttachmentsSerializer(
many=True, read_only=True)
frm_details = ChangeRequestFormDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
user = self.context['request'].user
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
(Q(action='') | Q(action=None))
).order_by('level')
if current_level[0].user.code == id_number:
if instance.status.lower() == 'rejected':
approver = 'No'
elif instance.status.lower() == 'cancelled':
approver = 'No'
elif instance.status.lower() == 'completed & accepted':
approver = 'No'
else:
approver = 'Yes'
else:
approver = 'No'
ret['action'] = approver
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
return ret
except Exception as e:
ret['action'] = "No"
ret['company'] = "None"
ret['department'] = "None"
ret['requested_by'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
# fields = '__all__'
fields = ('form_code', 'requested_to_template_name', 'requested_to_objective',
'requested_to_target_date', 'requested_to_priority',
'description', 'created', 'cancel_date', 'status',
'company_desc', 'department_desc', 'requested_desc',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'requested_by_user', 'requested_by_department',
'template_no', 'frm_approvers', 'frm_stakes',
'frm_attachments', 'frm_details')
read_only_fields = ['created', 'form_code']
class ChangeRequestFormHeaderSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
user = self.context['request'].user
id_number = user.code
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
(Q(action='') | Q(action=None))
).order_by('level')
if current_level[0].user.code == id_number:
if instance.status.lower() == 'rejected':
approver = 'No'
elif instance.status.lower() == 'cancelled':
approver = 'No'
elif instance.status.lower() == 'completed & accepted':
approver = 'No'
else:
approver = 'Yes'
else:
approver = 'No'
ret['action'] = approver
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
return ret
except Exception as e:
ret['action'] = "No"
ret['company'] = "None"
ret['department'] = "None"
ret['requested_by'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
fields = '__all__'
read_only_fields = ['created', 'form_code']
\ No newline at end of file
...@@ -12,7 +12,7 @@ from app.applicationlayer.utils import ( ...@@ -12,7 +12,7 @@ from app.applicationlayer.utils import (
class ChangeRequestFormStakeHoldersViewset(viewsets.ModelViewSet): class ChangeRequestFormStakeHoldersViewset(viewsets.ModelViewSet):
# queryset = models.ChangeRequestFormStakeHolders.objects.all()
queryset = models.ChangeRequestFormStakeHolders.objects.select_related( queryset = models.ChangeRequestFormStakeHolders.objects.select_related(
'form_code' 'form_code'
).all() ).all()
......
from django.shortcuts import render
from rest_framework import viewsets as meviewsets
from rest_framework.views import APIView
from app.applicationlayer.cms.form import serializers
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
from datetime import timedelta
from rest_framework.response import Response
from rest_framework import status, views
from rest_framework.decorators import action
from django.http import Http404
from django.db.models import Q
import requests
from django.conf import settings
from rest_framework.exceptions import ValidationError
from django.db import transaction, IntegrityError, connection
from app.applicationlayer.utils import QuerySetHelper, status_message_response
from app.businesslayer.changerequest import change_request
from app.applicationlayer.cms.utils_cr import (number_generator,
send_mail_requestor,
next_approver_email,
crhistory_save,
send_mail_vendor,
get_max_batchno,
generate_template_id,
crhistory_create_save)
from app.entities import enums
from app.applicationlayer.utils import model_to_dict
import json
from django.shortcuts import get_object_or_404
from django.db.models import Min
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
APPROVER_MESSAGE = settings.APPROVER_MESSAGE
REQUESTOR_MESSAGE = settings.REQUESTOR_MESSAGE
REQUESTOR_REJECT_MESSAGE = settings.REQUESTOR_REJECT_MESSAGE
VENDOR_ACKNOWLEDGE_MESSAGE = settings.VENDOR_ACKNOWLEDGE_MESSAGE
REQUESTOR_ACKNOWLEDGE_MESSAGE = settings.REQUESTOR_ACKNOWLEDGE_MESSAGE
REQUESTOR_COMPLETION_MESSAGE = settings.REQUESTOR_COMPLETION_MESSAGE
VENDOR_ACCEPTANCE_MESSAGE = settings.VENDOR_ACCEPTANCE_MESSAGE
VENDOR_REJECT_MESSAGE = settings.VENDOR_REJECT_MESSAGE
# Change Request Form Views
class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
serializer_class = serializers.ChangeRequestFormHeaderSerializer
# pagination_class = paginators.SimplePageNumberPagination
pagination_class = CustomPagination
queryset = models.ChangeRequestFormHeader.objects.all()
lookup_field = 'form_code'
def list(self, request, *args, **kwargs):
self.serializer_class = serializers.ChangeRequestFormHeaderSerializerList
id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
request.query_params.get('department_requested_to'),
request.query_params.get('date_modified_from'),
request.query_params.get('date_modified_to'),
request.query_params.get('date_required_from'),
request.query_params.get('date_required_to'),
request.query_params.get('form_type'),
)
if self.request.query_params.get('search'):
search_key = self.request.query_params.get('search')
self.queryset = self.queryset.filter(
Q(requested_to_template_name__icontains=search_key.lower()) |
Q(requested_to_template_id__icontains=search_key.lower())
)
self.queryset = self.queryset.order_by('-created')
self.queryset = QuerySetHelper.Sort(self)
page = self.paginate_queryset(self.queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Change Request Form found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
# return super(ChangeRequestFormsViewset, self).list(request)
@action(detail=False,
methods=['get'],
url_path='dashboard',
name="Dashboard Summary")
def dashboard_view(self, request):
id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
request.query_params.get('department_requested_to'),
request.query_params.get('date_modified_from'),
request.query_params.get('date_modified_to'),
request.query_params.get('date_required_from'),
request.query_params.get('date_required_to'),
request.query_params.get('form_type'),
)
pending = self.queryset.filter(
status__iexact='Pending'
).count()
approved = self.queryset.filter(
status__iexact='Approved'
).count()
rejected = self.queryset.filter(
status__iexact='Rejected'
).count()
cancelled = self.queryset.filter(
status__iexact='Cancelled'
).count()
completed = self.queryset.filter(
status__iexact='Completed & Accepted' #Completed
).count()
high = self.queryset.filter(
requested_to_priority='High'
).count()
normal = self.queryset.filter(
requested_to_priority='Normal'
).count()
awaiting_filtered = change_request.filter_awaiting(self.queryset, id_number)
# awaiting = awaiting_filtered.count()
awaiting = 0
for awaits in awaiting_filtered:
if awaits.status.lower() == 'rejected':
print("rejected")
elif awaits.status.lower() == 'completed & accepted':
print("completed & accepted")
elif awaits.status.lower() == 'cancelled':
print("cancelled")
else:
awaiting = awaiting + 1
overdue_filtered = change_request.filter_overdue(self.queryset)
overdue = overdue_filtered.count()
message = {
'account_no': id_number,
'pending': pending,
'approved': approved,
'rejected': rejected,
'cancelled': cancelled,
'completed': completed,
'high': high,
'normal': normal,
'awaiting': awaiting,
'overdue': overdue,
'code': 200,
'status': 'success',
'message': 'Dashboard Summary'
}
return Response(message, status=status.HTTP_200_OK)
@action(detail=False,
methods=['get'],
url_path='status',
name="Dashboard Summary Status")
def list_by_status_view(self, request):
id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_status(
self.queryset,
request.query_params.get('status')
)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
request.query_params.get('department_requested_to'),
request.query_params.get('date_modified_from'),
request.query_params.get('date_modified_to'),
request.query_params.get('date_required_from'),
request.query_params.get('date_required_to'),
request.query_params.get('form_type'),
)
self.queryset = self.queryset.order_by('-created')
self.queryset = QuerySetHelper.Sort(self)
return super(ChangeRequestFormsViewset, self).list(request)
@action(detail=False,
methods=['get'],
url_path='overdue',
name="Dashboard Summary Overdue")
def list_by_overdue_view(self, request):
id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_overdue(self.queryset)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
request.query_params.get('department_requested_to'),
request.query_params.get('date_modified_from'),
request.query_params.get('date_modified_to'),
request.query_params.get('date_required_from'),
request.query_params.get('date_required_to'),
request.query_params.get('form_type'),
)
self.queryset = self.queryset.order_by('-created')
self.queryset = QuerySetHelper.Sort(self)
return super(ChangeRequestFormsViewset, self).list(request)
@action(detail=False,
methods=['get'],
url_path='awaiting',
name="Dashboard Summary Awaiting")
def list_by_awaiting_view(self, request):
id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_awaiting(self.queryset, id_number.code)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
request.query_params.get('department_requested_to'),
request.query_params.get('date_modified_from'),
request.query_params.get('date_modified_to'),
request.query_params.get('date_required_from'),
request.query_params.get('date_required_to'),
request.query_params.get('form_type'),
)
self.queryset = self.queryset.filter(
~Q(status='Rejected') |
~Q(status='Completed & Accepted') |
~Q(status='Cancelled'))
self.queryset = self.queryset.order_by('-created')
self.queryset = QuerySetHelper.Sort(self)
return super(ChangeRequestFormsViewset, self).list(request)
def retrieve(self, request, *args, **kwargs):
instance = self.queryset.filter(
form_code=str(self.kwargs.get('form_code'))
).first()
serializer = self.get_serializer(instance)
return Response(serializer.data)
@action(
methods=['PATCH'], detail=True,
url_path='re_route', url_name='re_route'
)
def re_route(self, request, *args, **kwargs):
# generate batchno history
batchno = get_max_batchno("batch")
# partial update
partial = kwargs.pop('partial', True)
instance = self.get_object()
form_code = kwargs['form_code']
status_update = {"status": 'Pending'}
serializer = self.get_serializer(instance,
data=status_update,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
form_header = get_object_or_404(models.ChangeRequestFormHeader,
pk=instance.id)
new_instance = model_to_dict(form_header)
# save history in form header
crhistory_save(
batchno,
enums.CREnum.REROUTE.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
approver_data = []
# get all approvers of form
approvers = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code)
for approver in approvers:
approver_add = {
'id': approver.id,
'action': None,
'remarks': None,
'date_sent': None,
'action_date': None
}
approver_data.append(approver_add)
change_request.form_add_edit_delete(
approver_data,
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
serializers.ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.REROUTE.value
)
min_level = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code
).aggregate(Min('level'))
min_level = min_level.get('level__min')
next_approver_email(form_code, min_level)
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=str(min_level))
).update(
date_sent=datetime.now()
)
message = status_message_response(
200, 'success',
'Change request form successfully re routed',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
@action(
methods=['PATCH'], detail=True,
url_path='re_submit', url_name='re_submit'
)
def re_submit(self, request, *args, **kwargs):
# generate batchno history
batchno = get_max_batchno("batch")
# partial update
partial = kwargs.pop('partial', True)
instance = self.get_object()
form_code = kwargs['form_code']
# get prefix from template header
frm = models.ChangeRequestFormHeader.objects.get(
form_code=form_code)
tmp_prefix = models.ChangeRequestTemplateHeader.objects.get(
template_no=frm.template_no.template_no
)
data_update = {
"status": 'Draft',
"created": datetime.now(),
"requested_to_template_id": tmp_prefix.requested_to_template_id
}
serializer = self.get_serializer(instance,
data=data_update,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
form_header = get_object_or_404(models.ChangeRequestFormHeader,
pk=instance.id)
new_instance = model_to_dict(form_header)
# save history in form header
crhistory_save(
batchno,
enums.CREnum.RESUBMIT.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
approver_data = []
# get all approvers of form
approvers = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code)
for approver in approvers:
approver_add = {
'id': approver.id,
'action': None,
'remarks': None,
'date_sent': None,
'action_date': None,
'created': datetime.now()
}
approver_data.append(approver_add)
change_request.form_add_edit_delete(
approver_data,
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
serializers.ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.RESUBMIT.value
)
message = status_message_response(
200, 'success',
'Change request form successfully re submitted',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
# actions
@action(
methods=['PATCH'], detail=False,
url_path='actions', url_name='actions'
)
def actions(self, request, *args, **kwargs):
# get request data
id = request.data['id']
# current_user = request.data['user']
current_user = self.request.user.code
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']
# generate batchno history
batchno = get_max_batchno("batch")
action_data = {
'id': int(request.data['id']),
'action': action,
'remarks': remarks,
'action_date': datetime.now()
}
approver_instance = models.ChangeRequestFormApprovers.objects.get(
pk=id
)
serializer = serializers.ChangeRequestFormApproversSerializer(
approver_instance,
data=action_data,
partial=True)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(approver_instance)
self.perform_update(serializer)
new_instance = serializer.data
crhistory_save(
batchno,
enums.CREnum.ACTION.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
form_code,
old_instance,
new_instance
)
if action.lower() == 'approved':
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
# NOTIF MSG FOR NEXT APPROVER
notification_msg = APPROVER_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
next_approver_email(form_code, next_level)
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=str(next_level))
).update(
date_sent=datetime.now()
)
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=str(next_level),
delegation__name='Vendor/Implementor'
).first()
if the_next_vendor:
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation__name='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':
# send email to vendor
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
notification_msg, action,
remarks, level
)
else:
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Rejected')
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
)
models.ChangeRequestFormApprovers.objects.filter(
Q(level=str(next_level))
).update(
date_sent=datetime.now()
)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Completed')
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Acknowledged')
elif action.lower() == 'accepted':
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Completed & Accepted')
elif action.lower() == 'cancelled':
# changed form status to cancelled
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).update(status='Cancelled')
message = status_message_response(
200, 'success',
'Action performed',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
@transaction.atomic
@action(
methods=['PATCH'], detail=True,
url_path='save', url_name='save'
)
def save(self, request, *args, **kwargs):
partial = kwargs.pop('partial', True)
instance = self.get_object()
form_code = kwargs['form_code']
form_data = request.data
# generate batchno history
batchno = get_max_batchno("batch")
# update form header
serializer = self.get_serializer(instance,
data=form_data,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
# save history in form header
crhistory_save(
batchno,
enums.CREnum.SAVE.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
change_request.form_add_edit_delete(
form_data['frm_approvers'],
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
serializers.ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SAVE.value
)
change_request.form_add_edit_delete(
form_data['frm_stakes'],
models.ChangeRequestFormStakeHolders,
enums.CREntitiesEnum.CR_FRM_STAKE.value,
serializers.ChangeRequestFormStakeHoldersSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SAVE.value
)
change_request.form_add_edit_delete(
form_data['frm_attachments'],
models.ChangeRequestFormAttachments,
enums.CREntitiesEnum.CR_FRM_ATTACHMENT.value,
serializers.ChangeRequestFormAttachmentsSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SAVE.value
)
change_request.form_add_edit_delete(
form_data['frm_details'],
models.ChangeRequestFormDetails,
enums.CREntitiesEnum.CR_FRM_DETAIL.value,
serializers.ChangeRequestFormDetailsSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SAVE.value
)
serializer = self.get_serializer(instance)
message = status_message_response(
200, 'success',
'Change Request successfully saved',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
@transaction.atomic
@action(
methods=['PATCH'], detail=True,
url_path='submit', url_name='submit'
)
def submit(self, request, *args, **kwargs):
partial = kwargs.pop('partial', True)
instance = self.get_object()
form_code = kwargs['form_code']
form_data = request.data
# generate batchno history
batchno = get_max_batchno("batch")
# generate requested template id
requested_to_template_id = generate_template_id(
form_data['requested_to_template_id'],
form_code,
form_data['template_no'])
data_update = {
"status": 'Pending',
"created": datetime.now(),
"requested_to_template_id": requested_to_template_id
}
data = {**form_data, **data_update}
# update form header
serializer = self.get_serializer(instance,
data=data,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
form_header = get_object_or_404(models.ChangeRequestFormHeader,
pk=instance.id)
new_instance = model_to_dict(form_header)
# save history in form header
crhistory_create_save(
batchno,
enums.CREnum.SUBMIT.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance,
requested_to_template_id,
form_data['template_no'])
change_request.form_add_edit_delete(
form_data['frm_approvers'],
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
serializers.ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SUBMIT.value
)
change_request.form_add_edit_delete(
form_data['frm_stakes'],
models.ChangeRequestFormStakeHolders,
enums.CREntitiesEnum.CR_FRM_STAKE.value,
serializers.ChangeRequestFormStakeHoldersSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SUBMIT.value
)
change_request.form_add_edit_delete(
form_data['frm_attachments'],
models.ChangeRequestFormAttachments,
enums.CREntitiesEnum.CR_FRM_ATTACHMENT.value,
serializers.ChangeRequestFormAttachmentsSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SUBMIT.value
)
change_request.form_add_edit_delete(
form_data['frm_details'],
models.ChangeRequestFormDetails,
enums.CREntitiesEnum.CR_FRM_DETAIL.value,
serializers.ChangeRequestFormDetailsSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.SUBMIT.value
)
serializer = self.get_serializer(instance)
message = status_message_response(
200, 'success',
'Change Request successfully submitted',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
class ChangeRequestFormApproversViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestFormApprovers.objects.all()
serializer_class = serializers.ChangeRequestFormApproversSerializer
pagination_class = paginators.SimplePageNumberPagination
lookup_field = 'code'
def list(self, request, *args, **kwargs):
self.queryset = QuerySetHelper.Sort(self)
return super(ChangeRequestFormApproversViewset, self).list(request)
class ChangeRequestFormAttachmentsViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestFormAttachments.objects.all()
serializer_class = serializers.ChangeRequestFormAttachmentsSerializer
pagination_class = paginators.SimplePageNumberPagination
def list(self, request, *args, **kwargs):
self.queryset = QuerySetHelper.Sort(self)
self.queryset = QuerySetHelper.Filter(self)
return super(
ChangeRequestFormAttachmentsViewset, self
).list(request)
class ChangeRequestFormStakeHoldersViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestFormStakeHolders.objects.all()
serializer_class = serializers.ChangeRequestFormStakeHoldersSerializer
pagination_class = paginators.SimplePageNumberPagination
def list(self, request, *args, **kwargs):
self.queryset = QuerySetHelper.Sort(self)
self.queryset = QuerySetHelper.Filter(self)
return super(ChangeRequestFormStakeHoldersViewset, self).list(request)
class ChangeRequestFormDetailsViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestFormDetails.objects.all()
serializer_class = serializers.ChangeRequestFormDetailsSerializer
pagination_class = paginators.SimplePageNumberPagination
def list(self, request, *args, **kwargs):
self.queryset = QuerySetHelper.Sort(self)
self.queryset = QuerySetHelper.Filter(self)
return super(ChangeRequestFormDetailsViewset, self).list(request)
class ChangeRequestFormPost(APIView):
@transaction.atomic()
def post(self, request):
form_header = request.data
try:
data_list_approver = []
data_list_stake = []
data_list_attach = []
data_list_detail = []
form_header_data = {
'requested_to_template_name': form_header['requested_to_template_name'],
'requested_to_template_id': form_header['requested_to_template_id'],
'requested_to_objective': form_header['requested_to_objective'],
'requested_to_target_date': form_header['requested_to_target_date'],
'requested_to_priority': form_header['requested_to_priority'],
'description': form_header['description'],
'status': form_header['status'],
'company_desc': form_header['company_desc'],
'department_desc': form_header['department_desc'],
'requested_desc': form_header['requested_desc'],
'requested_by_department': form_header['requested_by_department'],
'requested_by_user': form_header['requested_by_user'],
'requested_to_company': form_header['requested_to_company'],
'requested_to_department': form_header['requested_to_department'],
'requested_to_user': form_header['requested_to_user'],
'template_no': form_header['template_no']
}
sp1 = transaction.savepoint() # nothing will save to db
serializer = serializers.ChangeRequestFormHeaderSerializer(
data=form_header_data)
if serializer.is_valid(raise_exception=True):
serializer.save()
frm_id = serializer.data['form_code']
# create template approvers
frm_approvers = form_header['frm_approvers']
counter = 0
for frm_approver in frm_approvers:
frm_approver['form_code'] = frm_id
counter = counter + 1
data_list_approver.append(frm_approver)
#append vendor and requestor in routing table
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
if form_header['frm_stakes']:
frm_stakes = form_header['frm_stakes']
for frm_stake in frm_stakes:
frm_stake['form_code'] = frm_id
data_list_stake.append(frm_stake)
serializerStake = serializers.ChangeRequestFormStakeHoldersSerializer(
data=data_list_stake, many=True)
if serializerStake.is_valid(raise_exception=True):
serializerStake.save()
# create template attachments
if form_header['frm_attachments']:
frm_attachments = form_header['frm_attachments']
for frm_attachment in frm_attachments:
frm_attachment['form_code'] = frm_id
data_list_attach.append(frm_attachment)
serializerAttach = serializers.ChangeRequestFormAttachmentsSerializer(
data=data_list_attach, many=True)
if serializerAttach.is_valid(raise_exception=True):
serializerAttach.save()
# create template details
if form_header['frm_details']:
frm_details = form_header['frm_details']
for frm_detail in frm_details:
frm_detail['form_code'] = frm_id
data_list_detail.append(frm_detail)
serializerDetail = serializers.ChangeRequestFormDetailsSerializer(
data=data_list_detail, many=True)
if serializerDetail.is_valid(raise_exception=True):
serializerDetail.save()
# if status is pending send initial email and
# generate template id
if serializer.data['status'].lower() == 'pending':
template_no = serializer.data['template_no']
CR_Prefix = serializer.data['requested_to_template_id']
# generate batchno history
batchno = get_max_batchno("batch")
# generate requested template id
requested_to_template_id = generate_template_id(
CR_Prefix, frm_id, template_no
)
#save to history for request template id tracking
crhistory_create_save(
batchno,
enums.CREnum.CREATE.value,
enums.CREnum.ADD.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
frm_id,
'',
serializer.data,
requested_to_template_id,
template_no)
min_level = models.ChangeRequestFormApprovers.objects.filter(
form_code=frm_id
).aggregate(Min('level'))
min_level = min_level.get('level__min')
next_approver_email(frm_id, min_level)
message = {
'code': 201,
'status': 'success',
'message': 'Form Details successfully saved!',
'results': serializer.data
}
return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e:
transaction.savepoint_rollback(sp1)
message = {
'code': 400,
'status': 'failed',
'message': str(e),
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
transaction.savepoint_rollback(sp1)
message = {
'code': 500,
'status': 'failed',
'message': 'Request was not able to process' + str(e),
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
\ No newline at end of file
...@@ -4,7 +4,6 @@ from app.applicationlayer.utils import (CustomPagination, ...@@ -4,7 +4,6 @@ from app.applicationlayer.utils import (CustomPagination,
from app.applicationlayer.management.account.serializer import ChangeRequestList from app.applicationlayer.management.account.serializer import ChangeRequestList
from app.entities import models from app.entities import models
from rest_framework.response import Response from rest_framework.response import Response
from django.db.models import Q
from rest_framework import status from rest_framework import status
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company from app.entities.models import Company
from django.db.models import Q from django.db.models import Q
......
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from rest_framework.filters import SearchFilter, OrderingFilter
from app.entities.models import ( from app.entities.models import (
Company, AllowedCompany, Company, AllowedCompany,
ChangeRequestFormHeader, AllowedCompany ChangeRequestFormHeader
) )
from rest_framework import viewsets, status from rest_framework import viewsets
from app.businesslayer.company.serializer import AdminCompanySerializer from app.businesslayer.company.serializer import AdminCompanySerializer
from app.applicationlayer.utils import CustomPagination, status_message_response from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.company import serializer from app.applicationlayer.management.company import serializer
from app.applicationlayer.cms.master.form.company.table_filters import ( from app.applicationlayer.cms.master.form.company.table_filters import (
ChangeRequestCompanyFilterSet ChangeRequestCompanyFilterSet
) )
from app.helper.decorators import rms
from rest_framework.response import Response from rest_framework.response import Response
from django.db.models import Q from django.db.models import Q
from rest_framework.decorators import action from rest_framework.decorators import action
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department from app.entities.models import Department
from django.db.models import Q from django.db.models import Q
......
from rest_framework import viewsets, status from rest_framework import viewsets
from rest_framework.response import Response from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Department, AllowedCompany, Delegation from app.entities.models import Department, AllowedCompany
from app.applicationlayer.utils import ( from app.applicationlayer.utils import (
CustomPagination, status_message_response CustomPagination, status_message_response
) )
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.master.department import serializer from app.applicationlayer.master.department import serializer
from app.applicationlayer.cms.master.form.department.table_filters import ( from app.applicationlayer.cms.master.form.department.table_filters import (
ChangeRequestDepartmentFilterSet ChangeRequestDepartmentFilterSet
) )
from app.helper.decorators import rms
from django.db.models import Q from django.db.models import Q
from rest_framework.exceptions import ParseError
class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet): class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
......
...@@ -3,10 +3,7 @@ from app.applicationlayer.utils import (CustomPagination, ...@@ -3,10 +3,7 @@ from app.applicationlayer.utils import (CustomPagination,
status_message_response) status_message_response)
from app.applicationlayer.management.account.serializer import ChangeRequestList from app.applicationlayer.management.account.serializer import ChangeRequestList
from app.entities import models from app.entities import models
from rest_framework.response import Response from django.db.models import Q
from django.db.models import Q, F
from rest_framework import status
# from django.db.models import F
class UserListTemplate(APIView): class UserListTemplate(APIView):
...@@ -26,8 +23,6 @@ class UserListTemplate(APIView): ...@@ -26,8 +23,6 @@ class UserListTemplate(APIView):
user_list = models.User.objects.filter( user_list = models.User.objects.filter(
code__in=verified_users code__in=verified_users
) )
print(user_list)
page = self.paginate_queryset(user_list) page = self.paginate_queryset(user_list)
if page is not None: if page is not None:
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company from app.entities.models import Company
from django.db.models import Q from django.db.models import Q
......
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Company, AllowedCompany from app.entities.models import Company, AllowedCompany
from rest_framework import viewsets, status from rest_framework import viewsets
from app.businesslayer.company.serializer import AdminCompanySerializer from app.businesslayer.company.serializer import AdminCompanySerializer
from app.applicationlayer.utils import CustomPagination, status_message_response from app.applicationlayer.utils import CustomPagination, status_message_response
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
...@@ -9,7 +9,6 @@ from app.applicationlayer.management.company import serializer ...@@ -9,7 +9,6 @@ from app.applicationlayer.management.company import serializer
from app.applicationlayer.cms.master.template.company.table_filters import ( from app.applicationlayer.cms.master.template.company.table_filters import (
ChangeRequestCompanyFilterSet ChangeRequestCompanyFilterSet
) )
from app.helper.decorators import rms
from rest_framework.response import Response from rest_framework.response import Response
from django.db.models import Q from django.db.models import Q
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import User from app.entities.models import User
from django.db.models import Q
class DefaultApproverFilterSet(filters.FilterSet): class DefaultApproverFilterSet(filters.FilterSet):
......
from rest_framework import viewsets, status from rest_framework import viewsets
from rest_framework.response import Response from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import User, AllowedCompany from app.entities.models import User, AllowedCompany
...@@ -13,9 +12,7 @@ from app.applicationlayer.cms.master.template.default_approver import serializer ...@@ -13,9 +12,7 @@ from app.applicationlayer.cms.master.template.default_approver import serializer
from app.applicationlayer.cms.master.template.default_approver.table_filter import ( from app.applicationlayer.cms.master.template.default_approver.table_filter import (
DefaultApproverFilterSet DefaultApproverFilterSet
) )
from app.helper.decorators import rms
from django.db.models import Q from django.db.models import Q
from rest_framework.exceptions import ParseError
class DefaultApproverViewSet(viewsets.ModelViewSet): class DefaultApproverViewSet(viewsets.ModelViewSet):
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department from app.entities.models import Department
from django.db.models import Q from django.db.models import Q
......
from rest_framework import viewsets, status from rest_framework import viewsets
from rest_framework.response import Response from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Department, AllowedCompany from app.entities.models import Department, AllowedCompany
...@@ -13,9 +12,7 @@ from app.applicationlayer.master.department import serializer ...@@ -13,9 +12,7 @@ from app.applicationlayer.master.department import serializer
from app.applicationlayer.cms.master.template.department.table_filters import ( from app.applicationlayer.cms.master.template.department.table_filters import (
ChangeRequestDepartmentFilterSet ChangeRequestDepartmentFilterSet
) )
from app.helper.decorators import rms
from django.db.models import Q from django.db.models import Q
from rest_framework.exceptions import ParseError
class ChangeRequestDepartmentTemplateViewSet(viewsets.ModelViewSet): class ChangeRequestDepartmentTemplateViewSet(viewsets.ModelViewSet):
......
from rest_framework import viewsets, status from rest_framework import viewsets
from rest_framework.response import Response from rest_framework.response import Response
from app.entities.models import ChangeRequestTemplateHeader, AllowedCompany from app.entities.models import ChangeRequestTemplateHeader, AllowedCompany
from app.applicationlayer.cms.master.template_list.serializers import ChangeRequestTemplatesSerializer from app.applicationlayer.cms.master.template_list.serializers import ChangeRequestTemplatesSerializer
......
from rest_framework import serializers from rest_framework import serializers
from app.entities import models from app.entities import models
from app.applicationlayer.utils import model_to_dict
class ChangeRequestTemplateApproversSerializer( class ChangeRequestTemplateApproversSerializer(
...@@ -59,7 +58,8 @@ class ChangeRequestTemplateApproversSerializer( ...@@ -59,7 +58,8 @@ class ChangeRequestTemplateApproversSerializer(
else: else:
ret['editable_deleg'] = True ret['editable_deleg'] = True
if instance.delegation.name.lower() == 'requestor': if instance.delegation:
if instance.delegation.name.lower() == 'requestor' or instance.delegation.name.lower() == 'vendor/implementor':
ret['editable_user'] = False ret['editable_user'] = False
ret['editable_comp'] = False ret['editable_comp'] = False
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateApprovers from app.entities.models import ChangeRequestTemplateApprovers
from django.db.models import Q
class ApproverFilter(filters.FilterSet): class ApproverFilter(filters.FilterSet):
......
from rest_framework import serializers from rest_framework import serializers
from app.entities import models from app.entities import models
from app.applicationlayer.utils import model_to_dict
class ChangeRequestTemplateAttachmentsSerializer( class ChangeRequestTemplateAttachmentsSerializer(
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateAttachments from app.entities.models import ChangeRequestTemplateAttachments
from django.db.models import Q
class AttachmentFilter(filters.FilterSet): class AttachmentFilter(filters.FilterSet):
......
from rest_framework import serializers from rest_framework import serializers
from app.entities import models from app.entities import models
from app.applicationlayer.utils import model_to_dict
class ChangeRequestTemplateDetailsSerializer( class ChangeRequestTemplateDetailsSerializer(
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateDetails from app.entities.models import ChangeRequestTemplateDetails
from django.db.models import Q
class DetailsFilter(filters.FilterSet): class DetailsFilter(filters.FilterSet):
......
from app.entities import models from app.entities import models
from rest_framework import serializers from rest_framework import serializers
from django.db.models import Q
from django.conf import settings
from app.applicationlayer.utils import model_to_dict
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
from app.applicationlayer.cms.template.attachment.serializers import ChangeRequestTemplateAttachmentsSerializer from app.applicationlayer.cms.template.attachment.serializers import ChangeRequestTemplateAttachmentsSerializer
from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer
from django.conf import settings
from rest_framework.exceptions import ValidationError
from app.applicationlayer.cms.utils_cr import (
BadRequestException
)
class ChangeRequestTemplatesSerializer( class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer serializers.ModelSerializer
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateHeader from app.entities.models import ChangeRequestTemplateHeader
from django.db.models import Q
class HeaderFilterSet(filters.FilterSet): class HeaderFilterSet(filters.FilterSet):
......
from rest_framework.views import APIView from rest_framework.views import APIView
from rest_framework import viewsets from rest_framework import viewsets
from app.entities import models from app.entities import enums, models
from rest_framework.response import Response from rest_framework.response import Response
from rest_framework import status, views from rest_framework import status, views
...@@ -11,21 +11,18 @@ from django.db.models import Q ...@@ -11,21 +11,18 @@ from django.db.models import Q
from rest_framework.exceptions import ValidationError from rest_framework.exceptions import ValidationError
from django.db import transaction from django.db import transaction
from app.applicationlayer.utils import (CustomPagination, from app.applicationlayer.utils import (CustomPagination,
status_message_response) status_message_response,
log_save,
model_to_dict)
from app.applicationlayer.cms.utils_cr import ( from app.applicationlayer.cms.utils_cr import (
entity_log_bulk entity_log_bulk,
delete_master_attachment_file
) )
from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models
from django.db.models import Q
from app.applicationlayer.utils import log_save, CustomPagination
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
) )
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
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer
...@@ -33,11 +30,7 @@ from app.applicationlayer.cms.template.attachment.serializers import ChangeReque ...@@ -33,11 +30,7 @@ from app.applicationlayer.cms.template.attachment.serializers import ChangeReque
from app.applicationlayer.cms.template.header.serializers import ChangeRequestTemplatesSerializer from app.applicationlayer.cms.template.header.serializers import ChangeRequestTemplatesSerializer
from app.applicationlayer.cms.template.header.serializers import ChangeRequestTemplatesSerializerList from app.applicationlayer.cms.template.header.serializers import ChangeRequestTemplatesSerializerList
from app.applicationlayer.cms.template.header.table_filters import HeaderFilterSet from app.applicationlayer.cms.template.header.table_filters import HeaderFilterSet
from app.helper.decorators import *
# from django_filters import rest_framework as filters
# from rest_framework.filters import SearchFilter, OrderingFilter
# from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
...@@ -184,6 +177,7 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet): ...@@ -184,6 +177,7 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
return Response(e, return Response(e,
status=status.HTTP_500_INTERNAL_SERVER_ERROR) status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@TemplateValidation
@transaction.atomic @transaction.atomic
def partial_update(self, request, *args, **kwargs): def partial_update(self, request, *args, **kwargs):
...@@ -339,11 +333,19 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet): ...@@ -339,11 +333,19 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
class ChangeRequestTemplatePost(APIView): class ChangeRequestTemplatePost(APIView):
@TemplateValidation
@transaction.atomic() @transaction.atomic()
def post(self, request): def post(self, request):
template_header = request.data template_header = request.data
try: try:
# Check if prefix already exists
prefix = models.ChangeRequestTemplateHeader.objects.filter(
requested_to_template_id=template_header['requested_to_template_id'])
if prefix:
return error_message('400', 'CR Number prefix already exists.',
'failed', 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 +367,6 @@ class ChangeRequestTemplatePost(APIView): ...@@ -365,12 +367,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)
...@@ -445,6 +441,11 @@ class ChangeRequestTemplatePost(APIView): ...@@ -445,6 +441,11 @@ class ChangeRequestTemplatePost(APIView):
except ValidationError as e: except ValidationError as e:
transaction.savepoint_rollback(sp1) transaction.savepoint_rollback(sp1)
if template_header['tmp_attachments']:
delete_master_attachment_file(
template_header['tmp_attachments'])
message = { message = {
'code': 400, 'code': 400,
'status': 'failed', 'status': 'failed',
...@@ -454,6 +455,11 @@ class ChangeRequestTemplatePost(APIView): ...@@ -454,6 +455,11 @@ class ChangeRequestTemplatePost(APIView):
except Exception as e: except Exception as e:
transaction.savepoint_rollback(sp1) transaction.savepoint_rollback(sp1)
if template_header['tmp_attachments']:
delete_master_attachment_file(
template_header['tmp_attachments'])
message = { message = {
'code': 500, 'code': 500,
'status': 'failed', 'status': 'failed',
......
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from app.applicationlayer.utils import model_to_dict
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
class ChangeRequestTemplateAttachmentsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestTemplateDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateDetails
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
):
tmp_approvers = ChangeRequestTemplateApproversSerializer(
many=True, read_only=True)
tmp_stakes = ChangeRequestTemplateStakeHoldersSerializer(
many=True, read_only=True)
tmp_attachments = ChangeRequestTemplateAttachmentsSerializer(
many=True, read_only=True)
tmp_details = ChangeRequestTemplateDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
# fields = '__all__'
fields = ('template_no', 'requested_to_template_name',
'requested_to_objective', 'requested_to_target_date',
'requested_to_priority', 'description', 'created',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'created_by_user', 'created_by_department',
'tmp_approvers', 'tmp_stakes', 'tmp_attachments',
'tmp_details')
read_only_fields = ['created', 'template_no']
class ChangeRequestTemplatesSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
fields = '__all__'
read_only_fields = ['created', 'template_no']
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateStakeHolders from app.entities.models import ChangeRequestTemplateStakeHolders
from django.db.models import Q
class StakeHolderFilter(filters.FilterSet): class StakeHolderFilter(filters.FilterSet):
......
from rest_framework import viewsets as meviewsets
from rest_framework.views import APIView
from app.applicationlayer.cms.template import serializers
from app.entities import models
from rest_framework.response import Response
from rest_framework import status, views
from rest_framework.decorators import action
from django.db.models import Q
from rest_framework.exceptions import ValidationError
from django.db import transaction
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from app.applicationlayer.cms.utils_cr import (
entity_log_bulk
)
from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models
from django.db.models import Q
from app.applicationlayer.utils import log_save, CustomPagination
from rest_framework.exceptions import ParseError
from app.businesslayer.changerequest.change_request_template import (
tmp_add_edit_delete
)
from app.applicationlayer.management.account.serializer import ChangeRequestList
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer
from app.applicationlayer.cms.template.attachment.serializers import ChangeRequestTemplateAttachmentsSerializer
class UserList(APIView):
pagination_class = CustomPagination
def get(self, request, *args, **kwargs):
try:
serializer = ChangeRequestList
dept = self.request.query_params['department_code']
company = self.request.query_params['company_code']
user_list = models.AllowedCompany.objects.filter(
Q(company_pivot=company) &
Q(group_pivots=dept)
)
user_list = user_list.exclude(id=1).values('id_number')
queryset = models.User.objects.filter(code__in=user_list).order_by('name')
page = self.paginate_queryset(queryset)
if page is not None:
serializer = ChangeRequestList(page, many=True)
message = status_message_response(
200,
'success',
'list of User found',
serializer.data
)
return self.get_paginated_response(message)
except Exception as e:
return Response(
{"message": "this endpoint expect a query params department_id"},
status=status.HTTP_400_BAD_REQUEST
)
@property
def paginator(self):
"""
The paginator instance associated with the view, or `None`.
"""
if not hasattr(self, '_paginator'):
if self.pagination_class is None:
self._paginator = None
else:
self._paginator = self.pagination_class()
return self._paginator
def paginate_queryset(self, queryset):
"""
Return a single page of results, or `None` if pagination is disabled.
"""
if self.paginator is None:
return None
return self.paginator.paginate_queryset(queryset, self.request, view=self)
def get_paginated_response(self, data):
"""
Return a paginated style `Response` object for the given output data.
"""
assert self.paginator is not None
return self.paginator.get_paginated_response(data)
class ChangeRequestTemplatesViewset(meviewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateHeader.objects.all()
lookup_field = 'template_no'
serializer_class = serializers.ChangeRequestTemplatesSerializer
pagination_class = CustomPagination
def list(self, request, *args, **kwargs):
self.serializer_class = serializers.ChangeRequestTemplatesSerializerList
self.queryset = self.queryset.order_by('-created')
self.queryset = QuerySetHelper.Sort(self)
page = self.paginate_queryset(self.queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'List of Templates found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(self.queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
def retrieve(self, request, *args, **kwargs):
instance = self.queryset.filter(
template_no=str(self.kwargs.get('template_no'))
).first()
serializer = self.get_serializer(instance)
return Response(serializer.data)
@transaction.atomic()
def destroy(self, request, *args, **kwargs):
try:
template_no = self.kwargs['template_no']
enum_approver = enums.LogEntitiesEnum.ChangeRequestTemplateApprovers.value
enum_stake = enums.LogEntitiesEnum.ChangeRequestTemplateStakeHolders.value
enum_attach = enums.LogEntitiesEnum.ChangeRequestTemplateAttachments.value
enum_detail = enums.LogEntitiesEnum.ChangeRequestTemplateDetails.value
enum_header = enums.LogEntitiesEnum.ChangeRequestTemplateHeader.value
approver = models.ChangeRequestTemplateApprovers.objects.filter(
template_no=template_no
)
if approver.count() > 0:
entity_log_bulk(
approver, enum_approver,
models.ChangeRequestTemplateApprovers
)
stake = models.ChangeRequestTemplateStakeHolders.objects.filter(
template_no=template_no
)
if stake.count() > 0:
entity_log_bulk(
stake, enum_stake,
models.ChangeRequestTemplateStakeHolders
)
attachment = models.ChangeRequestTemplateAttachments.objects.filter(
template_no=template_no
)
if attachment.count() > 0:
entity_log_bulk(
attachment, enum_attach,
models.ChangeRequestTemplateAttachments
)
details = models.ChangeRequestTemplateDetails.objects.filter(
template_no=template_no
)
if details.count() > 0:
entity_log_bulk(
details, enum_detail,
models.ChangeRequestTemplateDetails
)
header = models.ChangeRequestTemplateHeader.objects.filter(
template_no=template_no
)
if header.count() > 0:
entity_log_bulk(
header, enum_header,
models.ChangeRequestTemplateHeader
)
return Response({"message": "Deleted"}, status=status.HTTP_200_OK)
except Exception as e:
return Response(e,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@transaction.atomic
def partial_update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', True)
instance = self.get_object()
template_no = kwargs['template_no']
body_data = request.data
tmp_no_exists = models.ChangeRequestFormHeader.objects.filter(
template_no=template_no)
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
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.ChangeRequestTemplateHeader.value,
old_instance['id'],
old_instance,
new_instance
)
tmp_add_edit_delete(
body_data['tmp_approvers'],
models.ChangeRequestTemplateApprovers,
enums.LogEntitiesEnum.ChangeRequestTemplateApprovers.value,
ChangeRequestTemplateApproversSerializer,
partial,
self,
template_no
)
tmp_add_edit_delete(
body_data['tmp_stakes'],
models.ChangeRequestTemplateStakeHolders,
enums.LogEntitiesEnum.ChangeRequestTemplateStakeHolders.value,
ChangeRequestTemplateStakeHoldersSerializer,
partial,
self,
template_no
)
tmp_add_edit_delete(
body_data['tmp_attachments'],
models.ChangeRequestTemplateAttachments,
enums.LogEntitiesEnum.ChangeRequestTemplateAttachments.value,
serializers.ChangeRequestTemplateAttachmentsSerializer,
partial,
self,
template_no
)
tmp_add_edit_delete(
body_data['tmp_details'],
models.ChangeRequestTemplateDetails,
enums.LogEntitiesEnum.ChangeRequestTemplateDetails.value,
serializers.ChangeRequestTemplateDetailsSerializer,
partial,
self,
template_no
)
serializer = self.get_serializer(instance)
message = status_message_response(
200, 'success',
'Change Request Template successfully updated',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
return Response(
"Unable to edit due to existing transaction",
status=status.HTTP_400_BAD_REQUEST
)
class ChangeRequestTemplatePost(APIView):
@transaction.atomic()
def post(self, request):
template_header = request.data
try:
data_list_approver = []
data_list_stake = []
data_list_attach = []
data_list_detail = []
template_header_data = {
'requested_to_template_name': template_header['requested_to_template_name'],
'requested_to_template_id': template_header['requested_to_template_id'],
'requested_to_objective': template_header['requested_to_objective'],
'requested_to_target_date': template_header['requested_to_target_date'],
'requested_to_priority': template_header['requested_to_priority'],
'description': template_header['description'],
'created_by_department': template_header['created_by_department'],
'created_by_user': template_header['created_by_user'],
'requested_to_company': template_header['requested_to_company'],
'requested_to_department': template_header['requested_to_department'],
'requested_to_user': template_header['requested_to_user']
}
sp1 = transaction.savepoint() # nothing will save to db
serializer = serializers.ChangeRequestTemplatesSerializer(
data=template_header_data)
if serializer.is_valid(raise_exception=True):
serializer.save()
tmp_id = serializer.data['template_no']
# create template approvers
tmp_approvers = template_header['tmp_approvers']
for tmp_approver in tmp_approvers:
tmp_approver['template_no'] = tmp_id
data_list_approver.append(tmp_approver)
serializerApprover = ChangeRequestTemplateApproversSerializer(
data=data_list_approver, many=True)
if serializerApprover.is_valid(raise_exception=True):
serializerApprover.save()
# create template stakes
if template_header['tmp_stakes']:
tmp_stakes = template_header['tmp_stakes']
for tmp_stake in tmp_stakes:
tmp_stake['template_no'] = tmp_id
data_list_stake.append(tmp_stake)
serializerStake = ChangeRequestTemplateStakeHoldersSerializer(
data=data_list_stake, many=True)
if serializerStake.is_valid(raise_exception=True):
serializerStake.save()
# create template attachments
if template_header['tmp_attachments']:
tmp_attachments = template_header['tmp_attachments']
for tmp_attachment in tmp_attachments:
tmp_attachment['template_no'] = tmp_id
data_list_attach.append(tmp_attachment)
serializerAttach = ChangeRequestTemplateAttachmentsSerializer(
data=data_list_attach, many=True)
if serializerAttach.is_valid(raise_exception=True):
serializerAttach.save()
# create template details
if template_header['tmp_details']:
tmp_details = template_header['tmp_details']
for tmp_detail in tmp_details:
tmp_detail['template_no'] = tmp_id
data_list_detail.append(tmp_detail)
serializerDetail = ChangeRequestTemplateDetailsSerializer(
data=data_list_detail, many=True)
if serializerDetail.is_valid(raise_exception=True):
serializerDetail.save()
message = {
'code': 201,
'status': 'success',
'message': 'Template Details successfully saved!',
'results': serializer.data
}
return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e:
transaction.savepoint_rollback(sp1)
message = {
'code': 400,
'status': 'failed',
'message': str(e),
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
transaction.savepoint_rollback(sp1)
message = {
'code': 500,
'status': 'failed',
'message': 'Request was not able to process' + str(e),
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
...@@ -4,7 +4,6 @@ from django.conf.urls import url ...@@ -4,7 +4,6 @@ from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns from rest_framework.urlpatterns import format_suffix_patterns
from app.applicationlayer.cms.form import views as crform_views
from app.applicationlayer.cms.allowed_company import views as allowed from app.applicationlayer.cms.allowed_company import views as allowed
# MASTERS Form # MASTERS Form
......
from datetime import datetime from datetime import datetime
from django.db.models.functions import Lower
from functools import wraps
from django.conf import settings from django.conf import settings
import requests
from app.entities import models from app.entities import models
from datetime import timedelta from datetime import timedelta
from django.db.models import Q from django.db.models import Q
...@@ -11,10 +8,8 @@ from app.helper.email_service import sender ...@@ -11,10 +8,8 @@ from app.helper.email_service import sender
from app.applicationlayer.utils import log_save from app.applicationlayer.utils import log_save
from app.entities import enums from app.entities import enums
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from rest_framework.exceptions import ParseError
from django.db import IntegrityError from django.db import IntegrityError
from rest_framework.exceptions import APIException from rest_framework.exceptions import APIException
from django.db.models import Max
import os import os
...@@ -396,11 +391,9 @@ def next_approver_email(form_code, next_level): ...@@ -396,11 +391,9 @@ def next_approver_email(form_code, next_level):
level=str(next_level), level=str(next_level),
form_code=form_code form_code=form_code
) )
# print(next_approver.values())
# LOOP on next approver for sending email # LOOP on next approver for sending email
for n_approver in next_approver: for n_approver in next_approver:
# print(n_approver.delegation)
# NOTIF MSG FOR NEXT APPROVER # NOTIF MSG FOR NEXT APPROVER
msg = APPROVER_MESSAGE.split(';')[0] msg = APPROVER_MESSAGE.split(';')[0]
...@@ -564,7 +557,6 @@ def crhistory_log_bulk_delete_masterattach(queryset, entity, tbl, form_code, ...@@ -564,7 +557,6 @@ def crhistory_log_bulk_delete_masterattach(queryset, entity, tbl, form_code,
try: try:
for data in queryset: for data in queryset:
test = model_to_dict(data) test = model_to_dict(data)
# print(test)
crhistory_save(batch_no, crhistory_save(batch_no,
main_action, main_action,
enums.CREnum.DELETED.value, enums.CREnum.DELETED.value,
...@@ -823,3 +815,12 @@ def cancelled_user_trigger(form_code, ...@@ -823,3 +815,12 @@ def cancelled_user_trigger(form_code,
# create notification # create notification
notification_create(form_code, message, receiver_code, notification_create(form_code, message, receiver_code,
sender_code, 'cms') sender_code, 'cms')
def delete_master_attachment_file(attachments):
# delete master attachment data and media file attachments
for attachment in attachments:
attach = models.MasterAttachment.objects.filter(
id=attachment['file_upload'])
if attach:
attach.first().delete()
...@@ -25,10 +25,9 @@ class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet): ...@@ -25,10 +25,9 @@ class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
# id_number = request.user.code # id_number = request.user.code
data = User.objects.all() data = User.objects.all().exclude(id=1)
serializer = headers(data=data, many=True) serializer = headers(data=data, many=True)
serializer.is_valid(raise_exception=False) serializer.is_valid(raise_exception=False)
print(serializer.data)
return Response(serializer.data) return Response(serializer.data)
column_header = { column_header = {
......
...@@ -10,6 +10,13 @@ from app.applicationlayer.management.module.serializer import ModuleSerializer ...@@ -10,6 +10,13 @@ from app.applicationlayer.management.module.serializer import ModuleSerializer
from app.entities.models import ( from app.entities.models import (
User, Department, UserImage, AllowedCompany, Application, Module User, Department, UserImage, AllowedCompany, Application, Module
) )
import os
import configparser
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
class UserManagementRetreiveSerializer(serializers.ModelSerializer): class UserManagementRetreiveSerializer(serializers.ModelSerializer):
...@@ -79,9 +86,13 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer): ...@@ -79,9 +86,13 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
request = self.context.get('request') request = self.context.get('request')
primayPic = user.user_images.filter(is_primary=True).first() primayPic = user.user_images.filter(is_primary=True).first()
ssl = config['SETTINGS']['SSL']
if primayPic: if primayPic:
path = request.build_absolute_uri(primayPic.image.url) path = request.build_absolute_uri(primayPic.image.url)
if ssl == "1" or ssl == 1:
path = path.replace('http', 'https') path = path.replace('http', 'https')
else:
path = path.replace('https', 'http')
return path return path
else: else:
return request.build_absolute_uri('/media/no-user.png') return request.build_absolute_uri('/media/no-user.png')
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import User from app.entities.models import User
from django.db.models import Q
class AccountFilterset(filters.FilterSet): class AccountFilterset(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta: class Meta:
model = User model = User
fields = '__all__' fields = '__all__'
...@@ -2,14 +2,14 @@ import copy ...@@ -2,14 +2,14 @@ import copy
import threading import threading
import pandas as pd import pandas as pd
import csv import csv
import io, os from django.db.models import Q
from app.entities import enums from app.entities import enums
from django.db import transaction from django.db import transaction
from app.helper import decorators from app.helper import decorators
from rest_framework.views import APIView from rest_framework.decorators import action
from app.helper.decorators import rms, error_safe
from app.helper.email_service import sender from app.helper.email_service import sender
from rest_framework import viewsets, status from rest_framework import viewsets, status
from rest_framework.decorators import action
from django.contrib.auth import authenticate from django.contrib.auth import authenticate
from django.contrib.auth.hashers import check_password from django.contrib.auth.hashers import check_password
from rest_framework.response import Response from rest_framework.response import Response
...@@ -19,7 +19,7 @@ from app.entities.models import ( ...@@ -19,7 +19,7 @@ from app.entities.models import (
ChangeRequestFormHeader, ChangeRequestTemplateHeader, ChangeRequestFormHeader, ChangeRequestTemplateHeader,
AllowedCompany, Company, Department, UserHistory AllowedCompany, Company, Department, UserHistory
) )
from app.helper.decorators import rms, error_safe
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
...@@ -32,8 +32,6 @@ from app.applicationlayer.utils import ( ...@@ -32,8 +32,6 @@ from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save, CustomPagination, status_message_response, log_save,
main_threading main_threading
) )
from rest_framework.exceptions import ParseError
from django.db.models import Q
class UserViewSet(viewsets.ModelViewSet): class UserViewSet(viewsets.ModelViewSet):
...@@ -55,6 +53,7 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -55,6 +53,7 @@ class UserViewSet(viewsets.ModelViewSet):
'email', 'contact_no' 'email', 'contact_no'
) )
@rms.AccountValidation
@rms.user_create @rms.user_create
@transaction.atomic @transaction.atomic
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
...@@ -146,6 +145,8 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -146,6 +145,8 @@ class UserViewSet(viewsets.ModelViewSet):
@transaction.atomic @transaction.atomic
def destroy(self, request, *args, **kwargs): def destroy(self, request, *args, **kwargs):
try:
instance = self.get_object() instance = self.get_object()
new_instance = model_to_dict(instance) new_instance = model_to_dict(instance)
UserHistory.objects.filter(username=instance.username).update(deleted=True) UserHistory.objects.filter(username=instance.username).update(deleted=True)
...@@ -162,6 +163,17 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -162,6 +163,17 @@ class UserViewSet(viewsets.ModelViewSet):
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
except IntegrityError as e:
error = f'Cant delete {instance.name} it has an existing transactions on either change request or change request template'
message = {
'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
@rms.AccountValidation
@rms.user_create @rms.user_create
@transaction.atomic @transaction.atomic
def update(self, request, *args, **kwargs): def update(self, request, *args, **kwargs):
...@@ -185,9 +197,14 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -185,9 +197,14 @@ class UserViewSet(viewsets.ModelViewSet):
if cms_form.count() > 0 or cms_template.count() > 0: if cms_form.count() > 0 or cms_template.count() > 0:
raise ParseError( error = 'Cannot update this record the user has a record on change request it might cause a data error'
'Cannot update this record the user has a record on change request it might cause a data error' message = {
) 'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
serializer = self.get_serializer( serializer = self.get_serializer(
instance, data=request.data, partial=partial instance, data=request.data, partial=partial
...@@ -202,10 +219,6 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -202,10 +219,6 @@ class UserViewSet(viewsets.ModelViewSet):
if request.data['user_type'] != 'USR': if request.data['user_type'] != 'USR':
rms = Application.objects.filter(id=1).values('code').first() rms = Application.objects.filter(id=1).values('code').first()
app.append(rms['code']) app.append(rms['code'])
# else:
# app = request.data['application']
app = Application.objects.filter( app = Application.objects.filter(
code__in=app code__in=app
...@@ -272,7 +285,14 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -272,7 +285,14 @@ class UserViewSet(viewsets.ModelViewSet):
else: else:
raise Exception('User not found') error = 'User not found'
message = {
'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
return Response( return Response(
{"detail": "Success"}, {"detail": "Success"},
...@@ -283,7 +303,6 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -283,7 +303,6 @@ class UserViewSet(viewsets.ModelViewSet):
methods=['put'], methods=['put'],
url_path='change-password', url_path='change-password',
name="Change Password of User") name="Change Password of User")
# @decorators.error_safe
@transaction.atomic @transaction.atomic
def ChangePassword(self, request, code=None): def ChangePassword(self, request, code=None):
...@@ -292,11 +311,18 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -292,11 +311,18 @@ class UserViewSet(viewsets.ModelViewSet):
if serialized.is_valid(): if serialized.is_valid():
# form = copy.deepcopy(serialized.validated_data)
form = request.data form = request.data
if form['new_password'] != form['new_password_confirm']: if form['new_password'] != form['new_password_confirm']:
raise Exception('Passwords must match') error = 'Passwords must match'
message = {
'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
existingUser = User.objects.filter(code=code) existingUser = User.objects.filter(code=code)
pk = existingUser.values().first()['id'] pk = existingUser.values().first()['id']
...@@ -322,7 +348,14 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -322,7 +348,14 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_200_OK status=status.HTTP_200_OK
) )
else: else:
raise Exception('User not found') error = 'User not found'
message = {
'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
else: else:
serialized.is_valid(raise_exception=True) serialized.is_valid(raise_exception=True)
...@@ -344,18 +377,11 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -344,18 +377,11 @@ class UserViewSet(viewsets.ModelViewSet):
if serialized.is_valid(): if serialized.is_valid():
# form = copy.deepcopy(serialized.validated_data)
# form = request.data
# if form['new_password'] != form['new_password_confirm']:
# raise Exception('Passwords must match')
existingUser = User.objects.filter(code=code) existingUser = User.objects.filter(code=code)
pk = self.get_object() pk = self.get_object()
if existingUser: if existingUser:
# existingUser.first().set_password(form['new_password_confirm'])
fromObj = copy.copy(existingUser.first()) fromObj = copy.copy(existingUser.first())
existingUser.first().save() existingUser.first().save()
toObj = copy.copy(existingUser.first()) toObj = copy.copy(existingUser.first())
...@@ -373,7 +399,14 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -373,7 +399,14 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_200_OK status=status.HTTP_200_OK
) )
else: else:
raise Exception('User not found') error = 'User not found'
message = {
'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
else: else:
serialized.is_valid(raise_exception=True) serialized.is_valid(raise_exception=True)
...@@ -387,7 +420,6 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -387,7 +420,6 @@ class UserViewSet(viewsets.ModelViewSet):
methods=['put'], methods=['put'],
url_path='picture', url_path='picture',
name="Uploads Profile Picture of User") name="Uploads Profile Picture of User")
# @decorators.error_safe
@transaction.atomic @transaction.atomic
def UploadProfilePicture(self, request, code=None): def UploadProfilePicture(self, request, code=None):
existingUser = User.objects.filter(code=code).first() existingUser = User.objects.filter(code=code).first()
...@@ -398,10 +430,8 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -398,10 +430,8 @@ class UserViewSet(viewsets.ModelViewSet):
if (eximages): if (eximages):
for item in eximages: for item in eximages:
item.delete() item.delete()
# DELETE FROM PHYSICAL
FileHelper.DeleteFile(path=item.image.path) FileHelper.DeleteFile(path=item.image.path)
# self.serializer_class = serializer.UserImageSerializer
data = serializer.UserImageSerializer(data=request.data) data = serializer.UserImageSerializer(data=request.data)
data.is_valid(raise_exception=True) data.is_valid(raise_exception=True)
...@@ -412,5 +442,12 @@ class UserViewSet(viewsets.ModelViewSet): ...@@ -412,5 +442,12 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_201_CREATED, status=status.HTTP_201_CREATED,
headers=headers) headers=headers)
else: else:
raise ParseError('User not found') error = 'User not found'
message = {
'code': 400,
'status': 'failed',
'message': error,
}
return Response(message,
status=status.HTTP_400_BAD_REQUEST)
return Response(data={"detail": "Success"}) return Response(data={"detail": "Success"})
from rest_framework import serializers from rest_framework import serializers
from app.entities.models import Application from app.entities.models import Application
import ast
class ApplicationSerializer(serializers.ModelSerializer): class ApplicationSerializer(serializers.ModelSerializer):
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Application from app.entities.models import Application
from django.db.models import Q
class ApplicationFilterSet(filters.FilterSet): class ApplicationFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta: class Meta:
model = Application model = Application
fields = '__all__' fields = '__all__'
...@@ -6,13 +6,14 @@ from rest_framework.response import Response ...@@ -6,13 +6,14 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Application, EntityLog from app.entities.models import Application
from app.applicationlayer.utils import ( from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save CustomPagination, status_message_response, log_save
) )
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.application import serializer from app.applicationlayer.management.application import serializer
from app.applicationlayer.management.application.table_filters import ApplicationFilterSet from app.applicationlayer.management.application.table_filters import ApplicationFilterSet
from django.db import IntegrityError
class ApplicationViewSet(viewsets.ModelViewSet): class ApplicationViewSet(viewsets.ModelViewSet):
...@@ -26,6 +27,7 @@ class ApplicationViewSet(viewsets.ModelViewSet): ...@@ -26,6 +27,7 @@ class ApplicationViewSet(viewsets.ModelViewSet):
search_fields = ('name', 'code') search_fields = ('name', 'code')
@decorators.rms.ApplicationValidation
@decorators.rms.application_crate @decorators.rms.application_crate
@transaction.atomic @transaction.atomic
def create(self, request, *args, **kwargs): def create(self, request, *args, **kwargs):
...@@ -81,9 +83,11 @@ class ApplicationViewSet(viewsets.ModelViewSet): ...@@ -81,9 +83,11 @@ class ApplicationViewSet(viewsets.ModelViewSet):
return Response(status=status.HTTP_204_NO_CONTENT) return Response(status=status.HTTP_204_NO_CONTENT)
@decorators.rms.ApplicationValidation
@decorators.rms.application_crate @decorators.rms.application_crate
@transaction.atomic @transaction.atomic
def update(self, request, *args, **kwargs): def update(self, request, *args, **kwargs):
try:
partial = kwargs.pop('partial', False) partial = kwargs.pop('partial', False)
instance = self.get_object() instance = self.get_object()
...@@ -103,3 +107,8 @@ class ApplicationViewSet(viewsets.ModelViewSet): ...@@ -103,3 +107,8 @@ class ApplicationViewSet(viewsets.ModelViewSet):
) )
return Response(serializer.data) return Response(serializer.data)
except IntegrityError as e:
return Response(
{"message": "Cannot delete or update this reocrd it has foreign key constraint to other tables"},
status=status.HTTP_400_BAD_REQUEST
)
import os import os
import sys import sys
import os
import zipfile
import shutil
import datetime import datetime
import threading import threading
import configparser import configparser
...@@ -29,7 +26,6 @@ from app.applicationlayer.utils import ( ...@@ -29,7 +26,6 @@ from app.applicationlayer.utils import (
main_threading, PaginationForETL main_threading, PaginationForETL
) )
from django.db.models import Q from django.db.models import Q
from rest_framework.exceptions import ParseError
from rest_framework.decorators import action from rest_framework.decorators import action
from django.contrib.auth.hashers import make_password from django.contrib.auth.hashers import make_password
from django_filters.rest_framework import DjangoFilterBackend from django_filters.rest_framework import DjangoFilterBackend
...@@ -38,11 +34,6 @@ from app.applicationlayer.management.batchupload.table_filters import ExtractTra ...@@ -38,11 +34,6 @@ from app.applicationlayer.management.batchupload.table_filters import ExtractTra
from django.db.models import F, Value from django.db.models import F, Value
from django.core.files.base import ContentFile from django.core.files.base import ContentFile
from django.conf import settings from django.conf import settings
from io import BytesIO
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa
from django.core.files.storage import FileSystemStorage
from django.core.exceptions import ObjectDoesNotExist from django.core.exceptions import ObjectDoesNotExist
from reportlab.platypus import SimpleDocTemplate, Spacer, Paragraph from reportlab.platypus import SimpleDocTemplate, Spacer, Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
...@@ -225,16 +216,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet): ...@@ -225,16 +216,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
'Privilege_Department_Code' 'Privilege_Department_Code'
) )
# if departments.count() > 0:
# company = [departments[0]['Privilege_Company']]
# department = [departments[0]['Privilege_Department']]
# department_code = [departments[0]['Privilege_Department_Code']]
# else:
# company = "Oneberry Technologies"
# department = "Sample Department"
# department_code = "DEPARTMENT-20190101-0000000"
# departments = {"Privilege_Company": ['No Department Data']}
data = { data = {
'Username': ["ob-john"], 'Username': ["ob-john"],
'Name': ["John Doe"], 'Name': ["John Doe"],
...@@ -292,18 +273,18 @@ class BatchUploadViewSet(viewsets.ModelViewSet): ...@@ -292,18 +273,18 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
return self.get_paginated_response(message) return self.get_paginated_response(message)
@transaction.atomic
def create(self, request, **kwargs): def create(self, request, **kwargs):
csv_file = request.FILES['file'] csv_file = request.FILES['file']
extension_file = str(csv_file).split('.')[1] extension_file = str(csv_file).split('.')[1]
if extension_file.lower() != 'csv': if extension_file.lower() != 'csv':
return Response( return Response(
{"message": "Only csv extension file is allowed"}, {"message": "Only csv extension file is allowed"},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
df = pd.read_csv(csv_file, sep=',', skip_blank_lines=True).dropna() df = pd.read_csv(csv_file, sep=',', skip_blank_lines=True)
# df.dropna() df.dropna()
logged_user_type = request.user.user_type logged_user_type = request.user.user_type
logged_user_company = request.user.department.company.name logged_user_company = request.user.department.company.name
logged_user_department = request.user.department.name logged_user_department = request.user.department.name
...@@ -340,24 +321,20 @@ class BatchUploadViewSet(viewsets.ModelViewSet): ...@@ -340,24 +321,20 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
Q(company=user_company) Q(company=user_company)
) )
if not request_department: if not request_department:
# raise ParseError(company_error) etl2.delete()
return Response( return Response(
{"message": company_error}, {"message": company_error},
# {"message": str(e)},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
elif request.user.user_type == enums_department: elif request.user.user_type == enums_department:
if keys['Department_Code'] != request.user.department.code: if keys['Department_Code'] != request.user.department.code:
etl2.delete()
return Response( return Response(
{"message": department_error}, {"message": department_error},
# {"message": str(e)}, # {"message": str(e)},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
# raise ParseError(
# department_error
# )
# user type authorization and user type per user # user type authorization and user type per user
else: else:
user_department = Department.objects.filter( user_department = Department.objects.filter(
...@@ -409,8 +386,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet): ...@@ -409,8 +386,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
users['file_name'] = etl2 users['file_name'] = etl2
users['password'] = password users['password'] = password
# users['admin'] = logged_user_email
UserHistory.objects.create( UserHistory.objects.create(
**users **users
) )
...@@ -429,10 +404,10 @@ class BatchUploadViewSet(viewsets.ModelViewSet): ...@@ -429,10 +404,10 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
code=privilege_department_code code=privilege_department_code
) )
ccr = True if keys['Create_CR'].lower() == 'yes' else False ccr = True if str(keys['Create_CR']).lower() == 'yes' else False
crt = True if keys['Create_Template'].lower() == 'yes' else False crt = True if str(keys['Create_Template']).lower() == 'yes' else False
view_all = True if keys['View_All_CR'].lower() == 'yes' else False view_all = True if str(keys['View_All_CR']).lower() == 'yes' else False
approve_cr = True if keys['Approve_CR'].lower() == 'yes' else False approve_cr = True if str(keys['Approve_CR']).lower() == 'yes' else False
privilege_object = { privilege_object = {
"id_number": current_user, "id_number": current_user,
...@@ -447,44 +422,40 @@ class BatchUploadViewSet(viewsets.ModelViewSet): ...@@ -447,44 +422,40 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
AllowedCompany.objects.create(**privilege_object) AllowedCompany.objects.create(**privilege_object)
except IntegrityError as e: except IntegrityError as e:
etl2.delete()
return Response( return Response(
{"message": f"Duplicate user privilege at row {data + 2}"}, {"message": f"Duplicate user privilege at row {data + 2}"},
# {"message": str(e)},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
except ObjectDoesNotExist as e: except ObjectDoesNotExist as e:
etl2.delete()
return Response( return Response(
{"message": f"Department Does not Exist at Privilege row {data + 2}"}, {"message": f"Department Does not Exist at Privilege row {data + 2}"},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
except IntegrityError as e: except IntegrityError as e:
# etl2.delete() etl2.delete()
# transaction.set_rollback(True)
return Response( return Response(
{"message": f"Record already exist at row {data + 2}"}, {"message": f"Record already exist at row {data + 2}"},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
except KeyError as e: except KeyError as e:
etl2.delete()
return Response( return Response(
{"message": f"Missing column {e.args[0]}"}, {"message": f"Missing column {e.args[0]}"},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
except ObjectDoesNotExist as e: except ObjectDoesNotExist as e:
etl2.delete()
return Response( return Response(
{"message": f"Department Does not Exist at row {data + 2}"}, {"message": f"Department Does not Exist at row {data + 2}"},
status=status.HTTP_400_BAD_REQUEST status=status.HTTP_400_BAD_REQUEST
) )
# except ValueError as e:
# return Response(
# {"message": f"Invalid department code. Please check at line {data + 2}"},
# status=status.HTTP_400_BAD_REQUEST
# )
send_mail = UserHistory.objects.filter(sent=False).values( send_mail = UserHistory.objects.filter(sent=False).values(
'name', 'username', 'email', 'password' 'name', 'username', 'email', 'password'
) )
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company from app.entities.models import Company
from django.db.models import Q
class CompanyFilterSet(filters.FilterSet): class CompanyFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta: class Meta:
model = Company model = Company
fields = '__all__' fields = '__all__'
...@@ -5,7 +5,7 @@ from rest_framework.response import Response ...@@ -5,7 +5,7 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Delegation, Department from app.entities.models import Delegation
from app.applicationlayer.utils import ( from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save CustomPagination, status_message_response, log_save
) )
......
...@@ -9,7 +9,6 @@ class DepartmentSerializer(serializers.ModelSerializer): ...@@ -9,7 +9,6 @@ class DepartmentSerializer(serializers.ModelSerializer):
).values().first() ).values().first()
ret = super().to_representation(instance) ret = super().to_representation(instance)
ret['company'] = company_name ret['company'] = company_name
# ret['application'] = application_name
return ret return ret
......
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department from app.entities.models import Department
from django.db.models import Q
class DepartmentFilterSet(filters.FilterSet): class DepartmentFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta: class Meta:
model = Department model = Department
fields = '__all__' fields = '__all__'
...@@ -5,7 +5,7 @@ from rest_framework.response import Response ...@@ -5,7 +5,7 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters from django_filters import rest_framework as filters
from app.entities.models import Department, EntityLog from app.entities.models import Department
from app.applicationlayer.utils import ( from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save CustomPagination, status_message_response, log_save
) )
......
from rest_framework import serializers from rest_framework import serializers
from app.entities.models import Module, Application from app.entities.models import Module, Application
# from app.applicationlayer.management.application import ApplicationSerializer
class SubModuleField(serializers.Field): class SubModuleField(serializers.Field):
......
...@@ -5,8 +5,6 @@ import json ...@@ -5,8 +5,6 @@ import json
from rest_framework import viewsets as meviewsets from rest_framework import viewsets as meviewsets
from app.applicationlayer.management.notification import serializers from app.applicationlayer.management.notification import serializers
from app.entities import models from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
from rest_framework.response import Response from rest_framework.response import Response
......
from rest_framework import serializers
from app.entities.models import Branch
class BranchSerializer(serializers.ModelSerializer):
class Meta:
model = Branch
fields = '__all__'
from app.entities.models import Branch
from rest_framework import viewsets, status
from rest_framework.response import Response
from django_filters import rest_framework as filters
from app.applicationlayer.master.branch.serializer import BranchSerializer
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
class BranchViewSet(viewsets.ModelViewSet):
queryset = Branch.objects.all()
serializer_class = BranchSerializer
pagination_class = CustomPagination
lookup_field = 'id'
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
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 branches found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
...@@ -6,14 +6,12 @@ from app.applicationlayer.master.company.views import AdminCompanyViewSet ...@@ -6,14 +6,12 @@ from app.applicationlayer.master.company.views import AdminCompanyViewSet
from app.applicationlayer.master.department.views import AdminDepartmentViewSet from app.applicationlayer.master.department.views import AdminDepartmentViewSet
from app.applicationlayer.master.user_type.views import UserTypeViewSet from app.applicationlayer.master.user_type.views import UserTypeViewSet
from app.applicationlayer.master.attachment.views import MasterAttachmentViewSet from app.applicationlayer.master.attachment.views import MasterAttachmentViewSet
from app.applicationlayer.master.branch.views import BranchViewSet
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'users', AdminAccountViewSet) router.register(r'users', AdminAccountViewSet)
router.register(r'companies', AdminCompanyViewSet) router.register(r'companies', AdminCompanyViewSet)
router.register(r'departments', AdminDepartmentViewSet) router.register(r'departments', AdminDepartmentViewSet)
router.register(r'attachments', MasterAttachmentViewSet) router.register(r'attachments', MasterAttachmentViewSet)
router.register(r'branches', BranchViewSet)
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),
......
from rest_framework import pagination
from collections import OrderedDict
from rest_framework.response import Response
from django.core.paginator import InvalidPage
from rest_framework.exceptions import NotFound
from django.utils import six
from django.utils.translation import ugettext_lazy as _
class SimplePageNumberPagination(pagination.PageNumberPagination):
page_query_param = 'page'
page_size_query_param = 'page-size'
max_page_size = 1000
invalid_page_message = _('Invalid page.')
def paginate_queryset(self, queryset, request, view=None):
"""
Paginate a queryset if required, either returning a
page object, or `None` if pagination is not configured for this view.
"""
page_size = self.get_page_size(request)
if not page_size:
return None
paginator = self.django_paginator_class(queryset, page_size)
page_number = request.query_params.get(self.page_query_param, 1)
if page_number in self.last_page_strings:
page_number = paginator.num_pages
try:
if len(queryset) < page_size:
page_number = 1
self.page = paginator.page(page_number)
except InvalidPage as exc:
msg = self.invalid_page_message.format(
page_number=page_number, message=six.text_type(exc)
)
raise NotFound(msg)
if paginator.num_pages > 1 and self.template is not None:
# The browsable API should display pagination controls.
self.display_page_controls = True
self.request = request
return list(self.page)
def get_paginated_response(self, data, additional_info=None):
content = [
('count', self.page.paginator.count),
('next', self.get_next_link()),
('previous', self.get_previous_link()),
('results', data),
('page', self.page.number),
('additional_info', additional_info)
]
return Response(OrderedDict(content))
from rest_framework import serializers
from app.entities import models
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Department
fields = ('__all__')
depth = 0
...@@ -17,6 +17,17 @@ import json ...@@ -17,6 +17,17 @@ import json
REALTIMESERVER_IP = settings.REALTIMESERVER_IP REALTIMESERVER_IP = settings.REALTIMESERVER_IP
def error_message(code, message, status, status_code):
return Response(
{
"code": code,
"message": message,
"status": status
},
status=status_code
)
def model_to_dict(instance): def model_to_dict(instance):
try: try:
mySerializer = copy.deepcopy(DynamicSerializer) mySerializer = copy.deepcopy(DynamicSerializer)
...@@ -37,7 +48,7 @@ class DynamicSerializer(serializers.ModelSerializer): ...@@ -37,7 +48,7 @@ class DynamicSerializer(serializers.ModelSerializer):
class CustomPagination(PageNumberPagination): class CustomPagination(PageNumberPagination):
page_size = 10 page_size = 10
max_page_size = 50 max_page_size = 1000
page_query_param = 'page' page_query_param = 'page'
page_size_query_param = 'page_size' page_size_query_param = 'page_size'
......
from django.shortcuts import render from django.shortcuts import render
from app.entities import models from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
...@@ -31,7 +30,6 @@ from app.applicationlayer.cms.utils_cr import ( ...@@ -31,7 +30,6 @@ from app.applicationlayer.cms.utils_cr import (
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models 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 django.db.models import Min from django.db.models import Min
from django.conf import settings from django.conf import settings
...@@ -293,6 +291,7 @@ def form_add_edit_delete(form_request_body, ...@@ -293,6 +291,7 @@ def form_add_edit_delete(form_request_body,
# update or create # update or create
for i in form_request_body: for i in form_request_body:
if "id" in i: if "id" in i:
if not i['id'] is None:
frm_instance = queryset.objects.get( frm_instance = queryset.objects.get(
pk=i['id'] pk=i['id']
) )
...@@ -305,13 +304,12 @@ def form_add_edit_delete(form_request_body, ...@@ -305,13 +304,12 @@ def form_add_edit_delete(form_request_body,
serializer = serializer_data(frm_instance, serializer = serializer_data(frm_instance,
data=data, data=data,
partial=partial, partial=partial,
context={"request":self.request}) context={"request": self.request})
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(frm_instance) old_instance = model_to_dict(frm_instance)
self.perform_update(serializer) self.perform_update(serializer)
new_instance = serializer.data new_instance = serializer.data
# comment
crhistory_save( crhistory_save(
batch_no, batch_no,
main_action, main_action,
...@@ -328,7 +326,29 @@ def form_add_edit_delete(form_request_body, ...@@ -328,7 +326,29 @@ def form_add_edit_delete(form_request_body,
} }
data = {**i, **frm_code} data = {**i, **frm_code}
serializer = serializer_data(data=data, serializer = serializer_data(data=data,
context={"request":self.request}) context={"request": self.request})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
new_instance = serializer.data
crhistory_save(
batch_no,
main_action,
enums.CREnum.ADD.value,
entity,
form_code,
None,
new_instance
)
else:
frm_code = {
"form_code": form_code
}
data = {**i, **frm_code}
serializer = serializer_data(data=data,
context={"request": self.request})
serializer.is_valid(raise_exception=True) serializer.is_valid(raise_exception=True)
self.perform_create(serializer) self.perform_create(serializer)
...@@ -379,6 +399,7 @@ def attachment_add_edit_delete(form_request_body, ...@@ -379,6 +399,7 @@ def attachment_add_edit_delete(form_request_body,
# update or create # update or create
for i in form_request_body: for i in form_request_body:
if "id" in i: if "id" in i:
if not i['id'] is None:
frm_instance = queryset.objects.get( frm_instance = queryset.objects.get(
pk=i['id'] pk=i['id']
) )
...@@ -453,6 +474,29 @@ def attachment_add_edit_delete(form_request_body, ...@@ -453,6 +474,29 @@ def attachment_add_edit_delete(form_request_body,
new_instance new_instance
) )
else:
frm_code = {
"form_code": form_code,
"uploaded_by": id_number
}
data = {**i, **frm_code}
serializer = serializer_data(data=data,
context={"request":self.request})
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
new_instance = serializer.data
crhistory_save(
batch_no,
main_action,
enums.CREnum.ADD.value,
entity,
form_code,
None,
new_instance
)
return True return True
...@@ -766,21 +810,3 @@ def cr_routing_actions(approver_instance, current_user, move_to_level): ...@@ -766,21 +810,3 @@ def cr_routing_actions(approver_instance, current_user, move_to_level):
reset_autoemail_tables(form_code) reset_autoemail_tables(form_code)
return True return True
\ No newline at end of file
from django.shortcuts import render from django.shortcuts import render
from app.entities import models from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime from datetime import datetime
...@@ -18,7 +17,9 @@ from app.applicationlayer.cms.utils_cr import ( ...@@ -18,7 +17,9 @@ from app.applicationlayer.cms.utils_cr import (
from app.applicationlayer.utils import model_to_dict from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models 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
import itertools
from operator import itemgetter
def tmp_add_edit_delete(tmp_request_body, def tmp_add_edit_delete(tmp_request_body,
...@@ -48,6 +49,7 @@ def tmp_add_edit_delete(tmp_request_body, ...@@ -48,6 +49,7 @@ def tmp_add_edit_delete(tmp_request_body,
# update or create # update or create
for i in tmp_request_body: for i in tmp_request_body:
if "id" in i: if "id" in i:
if not i['id'] is None:
tmp_instance = queryset.objects.get( tmp_instance = queryset.objects.get(
pk=i['id'] pk=i['id']
) )
...@@ -73,6 +75,34 @@ def tmp_add_edit_delete(tmp_request_body, ...@@ -73,6 +75,34 @@ def tmp_add_edit_delete(tmp_request_body,
old_instance, old_instance,
new_instance new_instance
) )
else:
tmp_code = {
"template_no": template_no
}
data = {**i, **tmp_code}
serializer = serializer_data(data=data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
new_instance = serializer.data
try:
log_save(
enums.LogEnum.ADD.value,
enum_type,
old_instance['id'],
'',
new_instance
)
except Exception as e:
log_save(
enums.LogEnum.ADD.value,
enum_type,
new_instance['id'],
'',
new_instance
)
else: else:
tmp_code = { tmp_code = {
"template_no": template_no "template_no": template_no
...@@ -101,3 +131,90 @@ def tmp_add_edit_delete(tmp_request_body, ...@@ -101,3 +131,90 @@ def tmp_add_edit_delete(tmp_request_body,
) )
return True return True
# Check if routing table has Vendor and Requestor
def validation_existing_vendor_requestor(approvers):
approvers_data = sorted(approvers,
key=itemgetter('level'))[-2:]
if (approvers_data[0]['delegation'] == 'DELEGATION-20191119-0000002' and
approvers_data[1]['delegation'] == 'DELEGATION-20191119-0000001'):
return True
else:
return False
# Check if routing table has atleast 1 approver
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
# Check if a user has multiple same level in routing table
def validation_approver_same_level(approvers):
data_list_appr = []
for approver in approvers:
if 'user' in approver and 'level' in approver:
if not approver['user'] is None:
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
# Check if poc is assigned to another delegation other than Vendor
def validation_poc_vendor_only(poc, approvers):
validate = False
for approver in approvers:
if 'user' in approver and 'delegation' in approver:
if poc == approver['user']:
if not approver['delegation'] == 'DELEGATION-20191119-0000002':
validate = True
return validate
# Check if level if Vendor delegation has same level with other delegation
def validation_vendor_unique_level(approvers):
validate = 0
data_level = []
for approver in approvers:
if 'delegation' in approver:
if approver['delegation'] == 'DELEGATION-20191119-0000002':
data_level.append(approver['level'])
for approver in approvers:
if 'delegation' in approver:
if not approver['delegation'] is None:
if approver['level'] in data_level:
if not approver['delegation'] == 'DELEGATION-20191119-0000002':
validate = approver['level']
return validate
...@@ -13,11 +13,9 @@ def custom_exception_handler(exc, context): ...@@ -13,11 +13,9 @@ def custom_exception_handler(exc, context):
# Update the structure of the response data. # Update the structure of the response data.
if response is not None: if response is not None:
print('dd')
error_message = {} error_message = {}
for key, value in response.data.items(): for key, value in response.data.items():
print(value)
if type(value) == list and value[0].code == 'blank': if type(value) == list and value[0].code == 'blank':
value = value[0].replace('This field', key) value = value[0].replace('This field', key)
# elif type(value) == dict: # elif type(value) == dict:
......
...@@ -2,18 +2,6 @@ from enum import Enum ...@@ -2,18 +2,6 @@ from enum import Enum
class ModelSeriesEnum(Enum): class ModelSeriesEnum(Enum):
USER = "USR" USER = "USR"
# CLIENT = "CLI"
# CONSUMABLEPRODUCTS = "CSP"
# PROJECT = "PRJ"
# SERIALIZEITEM = "ITM"
# SERIALIZEPRODUCT = "SRP"
# SUPPLIER = "SUP"
# WAREHOUSE = "WHL"
# ACQUISITION = 'AQN'
# REQUISITION = 'RQN'
# PURCHASEREQUEST = 'PR'
# STOCKTAKE = 'STK'
# CHECKOUT = 'CHK'
class UserTypeEnum(Enum): class UserTypeEnum(Enum):
SUPER_USER = "SU" SUPER_USER = "SU"
...@@ -77,22 +65,6 @@ class LogEntitiesEnum(Enum): ...@@ -77,22 +65,6 @@ class LogEntitiesEnum(Enum):
ChangeRequestFormAttachments = "ChangeRequestFormAttachments" ChangeRequestFormAttachments = "ChangeRequestFormAttachments"
ChangeRequestFormDetails = "ChangeRequestFormDetails" ChangeRequestFormDetails = "ChangeRequestFormDetails"
# BRAND = "Brand"
# CATEGORY = "Category"
# CURRENCY = "Currency"
# UNIT_MATERIAL = "Unit Material"
# NEWS = "News"
# PROJECT = "Project"
# PROJECT_LOCATION = "Project Location"
# WAREHOUSE = "Warehouse"
# SUPPLIER = "Supplier"
# CLIENT = "Client"
# PRODUCT = "Product"
# ACQUISITION_ITEM = "Acquisition Item"
# STOCK = "Stock"
# STOCK_ITEM = "Stock Item"
# REQUISITION = "Requisition Header"
''' '''
********* *********
CR HISTORY ENUMS CR HISTORY ENUMS
......
# Generated by Django 2.2 on 2020-02-05 17:07
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='changerequestformattachments',
name='file_upload',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, related_name='form_attachments', to='entities.MasterAttachment'),
preserve_default=False,
),
migrations.AlterField(
model_name='changerequesttemplateattachments',
name='file_upload',
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, related_name='template_attachments', to='entities.MasterAttachment'),
preserve_default=False,
),
]
# Generated by Django 2.2 on 2020-02-06 14:22
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0002_auto_20200205_1707'),
]
operations = [
migrations.RemoveField(
model_name='changerequestformheader',
name='company_desc',
),
migrations.RemoveField(
model_name='changerequestformheader',
name='department_desc',
),
migrations.RemoveField(
model_name='changerequestformheader',
name='requested_desc',
),
]
# Generated by Django 2.2 on 2020-01-22 11:41
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0005_auto_20200115_1950'),
]
operations = [
migrations.CreateModel(
name='Branch',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('enviroment', models.CharField(max_length=255)),
('branch_name', models.CharField(max_length=255)),
('repo_type', models.CharField(max_length=50)),
('repository', models.CharField(max_length=255, unique=True)),
('created', models.DateTimeField(auto_now_add=True)),
],
options={
'db_table': 'branches',
},
),
]
...@@ -266,8 +266,6 @@ class ExtractTransformLoad(AuditClass): ...@@ -266,8 +266,6 @@ class ExtractTransformLoad(AuditClass):
def save(self, *args, **kwargs): def save(self, *args, **kwargs):
super(ExtractTransformLoad, self).save(*args, **kwargs) super(ExtractTransformLoad, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.ETL.value, self.id) code = number_generator(enums.GenerateCode.ETL.value, self.id)
print(type(self.code))
if self.code == '' or self.code == None: if self.code == '' or self.code == None:
self.code = code self.code = code
...@@ -527,7 +525,6 @@ class MasterAttachment(models.Model): ...@@ -527,7 +525,6 @@ class MasterAttachment(models.Model):
attch_ref = models.TextField() attch_ref = models.TextField()
def delete(self,*args,**kwargs): def delete(self,*args,**kwargs):
# print(self.url.name)
if os.path.isfile(self.url.path): if os.path.isfile(self.url.path):
os.remove(self.url.path) os.remove(self.url.path)
...@@ -707,9 +704,7 @@ class ChangeRequestTemplateAttachments(BaseAttachment): ...@@ -707,9 +704,7 @@ class ChangeRequestTemplateAttachments(BaseAttachment):
file_upload = models.ForeignKey( file_upload = models.ForeignKey(
MasterAttachment, MasterAttachment,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='template_attachments', related_name='template_attachments'
blank=True,
null=True
) )
template_no = models.ForeignKey( template_no = models.ForeignKey(
ChangeRequestTemplateHeader, ChangeRequestTemplateHeader,
...@@ -786,18 +781,6 @@ class ChangeRequestFormHeader(BaseHeader): ...@@ -786,18 +781,6 @@ class ChangeRequestFormHeader(BaseHeader):
on_delete=models.PROTECT, on_delete=models.PROTECT,
to_field='template_no') to_field='template_no')
status = models.CharField(max_length=50) status = models.CharField(max_length=50)
company_desc = models.CharField(
max_length=255,
null=True,
blank=True)
department_desc = models.CharField(
max_length=255,
null=True,
blank=True)
requested_desc = models.CharField(
max_length=255,
null=True,
blank=True)
requested_to_template_id = models.CharField( requested_to_template_id = models.CharField(
max_length=255) max_length=255)
requested_to_target_date = models.DateTimeField( requested_to_target_date = models.DateTimeField(
...@@ -819,6 +802,18 @@ class ChangeRequestFormHeader(BaseHeader): ...@@ -819,6 +802,18 @@ class ChangeRequestFormHeader(BaseHeader):
self.form_code = code self.form_code = code
self.save() self.save()
# company_desc = models.CharField(
# max_length=255,
# null=True,
# blank=True)
# department_desc = models.CharField(
# max_length=255,
# null=True,
# blank=True)
# requested_desc = models.CharField(
# max_length=255,
# null=True,
# blank=True)
class ChangeRequestFormApprovers(BaseApprover): class ChangeRequestFormApprovers(BaseApprover):
code = models.CharField( code = models.CharField(
...@@ -936,9 +931,7 @@ class ChangeRequestFormAttachments(BaseAttachment): ...@@ -936,9 +931,7 @@ class ChangeRequestFormAttachments(BaseAttachment):
file_upload = models.ForeignKey( file_upload = models.ForeignKey(
MasterAttachment, MasterAttachment,
on_delete=models.PROTECT, on_delete=models.PROTECT,
related_name='form_attachments', related_name='form_attachments'
blank=True,
null=True
) )
class Meta: class Meta:
...@@ -1192,7 +1185,7 @@ class OverdueTrigger(models.Model): ...@@ -1192,7 +1185,7 @@ class OverdueTrigger(models.Model):
class Meta: class Meta:
db_table = 'trigger_overdue' db_table = 'trigger_overdue'
# comment
""" """
********************** **********************
*** AMS TABLES *** *** AMS TABLES ***
...@@ -1228,25 +1221,3 @@ class AssetGroup(models.Model): ...@@ -1228,25 +1221,3 @@ class AssetGroup(models.Model):
self.code = code self.code = code
self.created = datetime.now() self.created = datetime.now()
self.save() self.save()
# branches info
class Branch(models.Model):
enviroment = models.CharField(
max_length=255)
branch_name = models.CharField(
max_length=255)
repo_type = models.CharField(
max_length=50)
repository = models.CharField(
unique=True,
max_length=255)
created = models.DateTimeField(
auto_now_add=True)
class Meta:
db_table = 'branches'
def __str__(self):
return f'{self.branch_name}'
...@@ -4,9 +4,20 @@ import json ...@@ -4,9 +4,20 @@ import json
from rest_framework.exceptions import ParseError from rest_framework.exceptions import ParseError
from functools import wraps from functools import wraps
from rest_framework.authtoken.models import Token from rest_framework.authtoken.models import Token
from app.entities.models import User, Department, Company from app.entities.models import (User, Department, Company,
ChangeRequestTemplateHeader,
ChangeRequestFormHeader)
from app.entities import enums from app.entities import enums
from django.db.models import Q from django.db.models import Q
from app.businesslayer.changerequest.change_request_template import (
tmp_add_edit_delete,
validation_approver_same_level,
validation_existing_vendor_requestor,
validation_existing_approver,
validation_poc_vendor_only,
validation_vendor_unique_level
)
from app.applicationlayer.utils import error_message
def error_safe(function): def error_safe(function):
...@@ -41,7 +52,7 @@ class rms: ...@@ -41,7 +52,7 @@ class rms:
enums_company = enums.UserTypeEnum.COMPANY_USER_ADMIN.value enums_company = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
enums_department = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value enums_department = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
enums_user = enums.UserTypeEnum.USER.value enums_user = enums.UserTypeEnum.USER.value
access_error = "Logged user is not allowed to access this endpoint." access_error = "Logged user is unauthorize to access this section"
department_error = 'Department should be same with the logged user' department_error = 'Department should be same with the logged user'
company_error = 'Company should be same with the logged user' company_error = 'Company should be same with the logged user'
...@@ -61,14 +72,20 @@ class rms: ...@@ -61,14 +72,20 @@ class rms:
def user_create(function): def user_create(function):
@wraps(function) @wraps(function)
def wrapper(self, request, *args, **kwargs): def wrapper(self, request, *args, **kwargs):
print(rms.user_type(self))
if rms.user_type(self) == rms.enums_user: if rms.user_type(self) == rms.enums_user:
raise ParseError( # raise ParseError(
rms.access_error # rms.access_error
# )
return Response(
{"message": rms.access_error},
status=status.HTTP_400_BAD_REQUEST
) )
elif rms.user_type(self) == rms.enums_department: elif rms.user_type(self) == rms.enums_department:
if request.data['department'] != rms.user(self).department.code: if request.data['department'] != rms.user(self).department.code:
raise ParseError( return Response(
rms.department_error {"message": rms.department_error},
status=status.HTTP_400_BAD_REQUEST
) )
elif rms.user_type(self) == rms.enums_company: elif rms.user_type(self) == rms.enums_company:
user_company = rms.user(self).department.company user_company = rms.user(self).department.company
...@@ -77,8 +94,66 @@ class rms: ...@@ -77,8 +94,66 @@ class rms:
Q(company=user_company) Q(company=user_company)
) )
if not request_department: if not request_department:
raise ParseError(rms.company_error) return Response(
{"message": rms.company_error},
status=status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
return wrapper
@staticmethod
def ApplicationValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
payload = request.data
if ('excel_code' not in payload or
payload['excel_code'].strip() == ''
):
return error_message(
'400', "Excel code is required",
'failed', status.HTTP_400_BAD_REQUEST
)
is_excel_code_exist = self.queryset.filter(
excel_code=payload['excel_code']
)
if request.method.lower() == 'put':
is_excel_code_exist = is_excel_code_exist.exclude(
code=self.kwargs['code']
)
if is_excel_code_exist:
return error_message(
'400', "This excel code is already exists",
'failed', status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs)
return wrapper
@staticmethod
def AccountValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
payload = request.data
if 'username' not in payload or payload['username'].strip() == '':
return error_message(
'400',
f"username is required",
'failed',
status.HTTP_400_BAD_REQUEST
)
username = self.queryset.filter(
username=payload['username']
)
if request.method.lower() == 'put':
username = username.exclude(code=self.kwargs['code'])
if username.count() >= 1:
return error_message(
'400',
f"username {username.first().username} is already taken",
'failed',
status.HTTP_400_BAD_REQUEST
)
return function(self, request, *args, **kwargs) return function(self, request, *args, **kwargs)
return wrapper return wrapper
...@@ -218,3 +293,124 @@ class rms: ...@@ -218,3 +293,124 @@ class rms:
return function(self, request, *args, **kwargs) return function(self, request, *args, **kwargs)
return wrapper return wrapper
def TemplateValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
template_header = request.data
required = {'requested_to_template_name': 'Template Name',
'requested_to_template_id': 'CR Number prefix',
'requested_to_target_date': 'Lead Time',
'requested_to_company': 'Company',
'requested_to_department': 'Department'}
for key in required.keys():
if (not key in template_header or
str(template_header[key]).strip() == ''):
return error_message('400', required[key] + ' is required',
'failed', status.HTTP_400_BAD_REQUEST)
# Restrict form using Superuser Department
if (template_header['created_by_department'] == 'DEPARTMENT-20190923-0000001' or
template_header['requested_to_department'] == 'DEPARTMENT-20190923-0000001'):
return error_message('400', 'Superuser department cannot be selected',
'failed', status.HTTP_400_BAD_REQUEST)
tmp_approvers = template_header['tmp_approvers']
# Check if Vendor and Requestor are existing on routing table
if len(tmp_approvers) < 2:
return error_message('400', 'Please make sure to add an Approver, Vendor and Requestor into routing table',
'failed', status.HTTP_400_BAD_REQUEST)
else:
result = validation_existing_vendor_requestor(tmp_approvers)
if result is False:
return error_message('400', 'Please add Vendor/Implementor and Requestor into routing table',
'failed', status.HTTP_400_BAD_REQUEST)
# Do not allow adding an approver for the same level
validation_result = validation_approver_same_level(tmp_approvers)
if validation_result is not None:
return error_message('400', validation_result + ' is already exist for the same level of approval.',
'failed', status.HTTP_400_BAD_REQUEST)
# Do not allow saving user as Vendor and other delegation
validate = validation_poc_vendor_only(
template_header['requested_to_user'], tmp_approvers)
if validate is True:
return error_message('400', 'Point of contact can only be assign to Vendor/Implementor',
'failed', status.HTTP_400_BAD_REQUEST)
# Do not allow to save Vendor same level to other delegation
validate = validation_vendor_unique_level(tmp_approvers)
if not validate == 0:
return error_message('400', 'Level ' + str(validate) + ' is already assigned for the Vendor/Implementor.',
'failed', status.HTTP_400_BAD_REQUEST)
return function(self, request, *args, **kwargs)
return wrapper
def FormValidation(function):
@wraps(function)
def wrapper(self, request, *args, **kwargs):
form_header = request.data
required = {'requested_to_template_name': 'CR Name',
'requested_to_target_date': 'Date Required',
'requested_to_company': 'Company',
'requested_to_department': 'Department',
'requested_to_user': 'Point of Contact',
'requested_to_priority': 'Priority Level'}
for key in required.keys():
if not key in form_header or str(form_header[key]).strip() == '':
return error_message('400', required[key] + ' is required',
'failed', status.HTTP_400_BAD_REQUEST)
# restrict superuser department
if (form_header['requested_by_department'] == 'DEPARTMENT-20190923-0000001' or
form_header['requested_to_department'] == 'DEPARTMENT-20190923-0000001'):
return error_message('400', 'Superuser department cannot be selected',
'failed', status.HTTP_400_BAD_REQUEST)
frm_approvers = form_header['frm_approvers']
# Check if Vendor and Requestor are existing on routing table
if len(frm_approvers) < 2:
return error_message('400', 'Please make sure to add an Approver, Vendor and Requestor into routing table',
'failed', status.HTTP_400_BAD_REQUEST)
else:
result = validation_existing_vendor_requestor(frm_approvers)
if result is False:
return error_message('400', 'Please add Vendor/Implementor and Requestor into routing table',
'failed', status.HTTP_400_BAD_REQUEST)
# Do not allow adding an approver for the same level
validation_result = validation_approver_same_level(frm_approvers)
if validation_result is not None:
return error_message('400', validation_result + ' is already exist for the same level of approval.',
'failed', status.HTTP_400_BAD_REQUEST)
# Do not allow saving user as Vendor and other delegation
validate = validation_poc_vendor_only(
form_header['requested_to_user'], frm_approvers)
if validate is True:
return error_message('400', 'Point of contact can only be assign to Vendor/Implementor',
'failed', status.HTTP_400_BAD_REQUEST)
# Do not allow to save Vendor same level to other delegation
validate = validation_vendor_unique_level(frm_approvers)
if validate is True:
return error_message('400', 'Vendor/Implementor cannot have same level with other delegation/s',
'failed', status.HTTP_400_BAD_REQUEST)
return function(self, request, *args, **kwargs)
return wrapper
...@@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/2.2/ref/settings/ ...@@ -11,6 +11,7 @@ https://docs.djangoproject.com/en/2.2/ref/settings/
""" """
import os import os
import configparser
# Build paths inside the project like this: os.path.join(BASE_DIR, ...) # Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname( BASE_DIR = os.path.dirname(
...@@ -25,10 +26,10 @@ BASE_DIR = os.path.dirname( ...@@ -25,10 +26,10 @@ BASE_DIR = os.path.dirname(
SECRET_KEY = 'w!dkk7gc*dk#4!6ow3s1wc32%_yp$=osgybm=n0vw6k1j^sqo&' SECRET_KEY = 'w!dkk7gc*dk#4!6ow3s1wc32%_yp$=osgybm=n0vw6k1j^sqo&'
# SECURITY WARNING: don't run with debug turned on in production! # SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True DEBUG = False
ALLOWED_HOSTS = []
ALLOWED_HOSTS = ['*']
CORS_ORIGIN_ALLOW_ALL = True
# Application definition # Application definition
...@@ -46,7 +47,6 @@ INSTALLED_APPS = [ ...@@ -46,7 +47,6 @@ INSTALLED_APPS = [
'app.accesslayer', 'app.accesslayer',
'app.entities', 'app.entities',
'channels', 'channels',
] ]
MIDDLEWARE = [ MIDDLEWARE = [
...@@ -128,7 +128,7 @@ STATIC_ROOT = os.path.join(BASE_DIR, "static") ...@@ -128,7 +128,7 @@ STATIC_ROOT = os.path.join(BASE_DIR, "static")
MEDIA_ROOT = os.path.join(BASE_DIR, 'media') MEDIA_ROOT = os.path.join(BASE_DIR, 'media')
MEDIA_URL = '/media/' MEDIA_URL = '/media/'
# CORS_ORIGIN_ALLOW_ALL = True
REST_SESSION_LOGIN = True REST_SESSION_LOGIN = True
...@@ -160,25 +160,71 @@ REST_FRAMEWORK = { ...@@ -160,25 +160,71 @@ REST_FRAMEWORK = {
} }
EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/templates") EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/templates")
EMAIL_HOST = 'email-smtp.us-west-2.amazonaws.com' EMAIL_HOST = 'email-smtp.us-west-2.amazonaws.com'
EMAIL_PORT = 587 EMAIL_PORT = 587
EMAIL_HOST_USER = 'AKIAIPRWQKYV6N5SMLUA' EMAIL_HOST_USER = 'AKIAYA4XVX5XFZHRQATF'
EMAIL_HOST_PASSWORD = 'ApK1dtH2qpT/oMl9MEauFvyN9XZDQ1fjzd8TumIs71NG' EMAIL_HOST_PASSWORD = 'BIOG15v+WTbTiBtPKkn+LCjg0UHqO3nLFQezh4pi6g3y'
EMAIL_USE_SSL = False EMAIL_USE_SSL = False
EMAIL_USE_TLS = True EMAIL_USE_TLS = True
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_DEFAULT_SENDER = 'rms.noreply@oneberrysystem.com' EMAIL_DEFAULT_SENDER = 'noreply@rms-hub.com'
# EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/templates")
###########################################################################
# config
#########################################################################
EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/templates")
# EMAIL_HOST = 'email-smtp.us-west-2.amazonaws.com' config = configparser.ConfigParser()
# EMAIL_PORT = 587 config_file = os.path.join('./', 'env.ini')
# EMAIL_HOST_USER = 'AKIAYA4XVX5XFZHRQATF' config.read(config_file)
# EMAIL_HOST_PASSWORD = 'BIOG15v+WTbTiBtPKkn+LCjg0UHqO3nLFQezh4pi6g3y'
# EMAIL_USE_SSL = False CHANNEL_LAYERS = {
# EMAIL_USE_TLS = True 'default': {
# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' 'BACKEND': 'channels_redis.core.RedisChannelLayer',
# EMAIL_DEFAULT_SENDER = 'noreply@rms-hub.com' 'CONFIG': {
"hosts": [('172.17.0.1', 6379)],
# "hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['SETTINGS']['DATABASE_ENGINE'],
'NAME': config['SETTINGS']['DATABASE_NAME'],
'USER': config['SETTINGS']['DATABASE_USER'],
'PASSWORD': config['SETTINGS']['DATABASE_PASSWORD'],
'HOST': config['SETTINGS']['DATABASE_HOST'],
'PORT': config['SETTINGS']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['SETTINGS']['SESSION_TIMEOUT']
FRONT_END_URL = config['SETTINGS']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['SETTINGS']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['SETTINGS']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['SETTINGS']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['SETTINGS']['CATCH_EMAIL']
CR_FRONT_LINK = config['SETTINGS']['CR_LINK']
from .base import *
import configparser
DEBUG = False
ALLOWED_HOSTS = ['*']
# CORS_ORIGIN_ALLOW_ALL = True
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
# "hosts": [('172.17.0.1', 6379)],
"hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['DEMO']['DATABASE_ENGINE'],
'NAME': config['DEMO']['DATABASE_NAME'],
'USER': config['DEMO']['DATABASE_USER'],
'PASSWORD': config['DEMO']['DATABASE_PASSWORD'],
'HOST': config['DEMO']['DATABASE_HOST'],
'PORT': config['DEMO']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['DEMO']['SESSION_TIMEOUT']
FRONT_END_URL = config['DEMO']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['DEMO']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['DEMO']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['DEMO']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['DEMO']['CATCH_EMAIL']
CR_FRONT_LINK = config['DEMO']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = True
ALLOWED_HOSTS = ['*']
# CORS_ORIGIN_ALLOW_ALL = True
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
# "hosts": [('172.17.0.1', 6379)],
"hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['DEV']['DATABASE_ENGINE'],
'NAME': config['DEV']['DATABASE_NAME'],
'USER': config['DEV']['DATABASE_USER'],
'PASSWORD': config['DEV']['DATABASE_PASSWORD'],
'HOST': config['DEV']['DATABASE_HOST'],
'PORT': config['DEV']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['DEV']['SESSION_TIMEOUT']
FRONT_END_URL = config['DEV']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['DEV']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['DEV']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['DEV']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['DEV']['CATCH_EMAIL']
CR_FRONT_LINK = config['DEV']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = True
ALLOWED_HOSTS = ['*']
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
# "hosts": [('172.17.0.1', 6379)],
"hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['SIT']['DATABASE_ENGINE'],
'NAME': config['SIT']['DATABASE_NAME'],
'USER': config['SIT']['DATABASE_USER'],
'PASSWORD': config['SIT']['DATABASE_PASSWORD'],
'HOST': config['SIT']['DATABASE_HOST'],
'PORT': config['SIT']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['SIT']['SESSION_TIMEOUT']
FRONT_END_URL = config['SIT']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['SIT']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['SIT']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['SIT']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['SIT']['CATCH_EMAIL']
CR_FRONT_LINK = config['SIT']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = False
ALLOWED_HOSTS = ['*']
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
# "hosts": [('172.17.0.1', 6379)],
"hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['STAGING']['DATABASE_ENGINE'],
'NAME': config['STAGING']['DATABASE_NAME'],
'USER': config['STAGING']['DATABASE_USER'],
'PASSWORD': config['STAGING']['DATABASE_PASSWORD'],
'HOST': config['STAGING']['DATABASE_HOST'],
'PORT': config['STAGING']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['STAGING']['SESSION_TIMEOUT']
FRONT_END_URL = config['STAGING']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['STAGING']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['STAGING']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['STAGING']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['STAGING']['CATCH_EMAIL']
CR_FRONT_LINK = config['STAGING']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
version: '3'
services:
web:
image: dev-rmsv2:latest
build: .
command: python manage.py runserver 0.0.0.0:8000
volumes:
- .:/code
ports:
- "7020:8000"
container_name: dev_rmsv2_api_container
restart: always
[SETTINGS]
BATCH_UPLOAD_FORMAT_FILENAME = instruction.pdf
SSL = 1
DATABASE_ENGINE = django.db.backends.mysql
DATABASE_NAME = rms_db
DATABASE_USER = red_database
DATABASE_PASSWORD = password123
DATABASE_HOST = 10.0.75.1
DATABASE_PORT = 3306
SESSION_TIMEOUT = 30
FRONT_END_URL = http://devweb.rmsv2.oneberrysystem.com
AUTH_ACCESSS_TOKEN_TIMEOUT = 3600
USER_DEFAULT_PASSWORD = password
CATCH_EMAIL = gladys@tirsolutions.com
CR_LINK = http://localhost:8000/cms/change-request/form/view
REALTIMESERVER_IP = 127.0.0.1:8000
[NOTIFICATION_EMAIL]
APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED
REQUESTOR_MESSAGE = has APPROVED the change request;RMS-CRAPPROVED
REQUESTOR_REJECT_MESSAGE = has REJECTED the change request;RMS-CRREJECTED
VENDOR_ACKNOWLEDGE_MESSAGE = has sent you an ACKNOWLEDGEMENT REQUEST for change request;RMS-ACTIONREQUIRED-VENDOR
REQUESTOR_ACKNOWLEDGE_MESSAGE = has ACKNOWLEDGED the change request;RMS-CRACKNOWLEDGE
REQUESTOR_COMPLETION_MESSAGE = has COMPLETED the change request;RMS-CRCOMPLETED
VENDOR_ACCEPTANCE_MESSAGE = has ACCEPTED the change request;RMS-CRACCEPTED
VENDOR_REJECT_MESSAGE = has REJECTED the change request;RMS-CRREJECTED-VENDOR
REVISED_MESSAGE = has REJECTED the change request for your revision;RMS-CRREVISED
CANCEL_MESSAGE = has CANCELLED the change request;RMS-CRCANCELLED-USERTRIGGER
APPROVER_REJECT_MESSAGE = has REJECTED the change request for your approval;RMS-CRREJECTED-APPROVER
...@@ -10,7 +10,7 @@ config.read(config_file) ...@@ -10,7 +10,7 @@ config.read(config_file)
if __name__ == "__main__": if __name__ == "__main__":
os.environ.setdefault('DJANGO_SETTINGS_MODULE', os.environ.setdefault('DJANGO_SETTINGS_MODULE',
config['SETTINGS']['CONFIG']) 'config.settings.base')
# os.system('start chrome.exe --kiosk --kiosk-printing # os.system('start chrome.exe --kiosk --kiosk-printing
# http://localhost:8000/') # http://localhost:8000/')
try: try:
......
Username,Name,Company,Department,Department_Code,Email,Contact_No,Application,Default_app,Privilege_Company,Privilege_Department,Privilege_Department_Code,Create_CR,Create_Template,View_All_CR,Approve_CR Username,Name,Company,Department,Department_Code,Email,Contact_No,Application,Default_app,Privilege_Company,Privilege_Department,Privilege_Department_Code,Create_CR,Create_Template,View_All_CR,Approve_CR
ob-john,John Doe,Oneberry Technologies Pte Ltd,Admin Department,DEPARTMENT-20191218-0000067,johndoe@gmail.com,123456,"cms,ams",cms,Oneberry Technologies Pte Ltd,Admin Department,DEPARTMENT-20191218-0000067,Yes,No,Yes,Yes ob-john,John Doe,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,johndoe@gmail.com,123456,"cms,ams",cms,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,Yes,No,Yes,Yes
,,,,,,,,,Please use this department code as reference,,,,,, ,,,,,,,,,Please use this department code as reference,,,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,Admin Department,DEPARTMENT-20191218-0000067,,,, ,,,,,,,,,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20191121-0000064,,,, ,,,,,,,,,JTC Corporation,Security,DEPARTMENT-20200122-0000002,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,IT Department,DEPARTMENT-20191219-0000069,,,, ,,,,,,,,,Sample Company,Facilities Management,DEPARTMENT-20200130-0000004,,,,
,,,,,,,,,Jurong Town Corporation,Facilities Management,DEPARTMENT-20191121-0000062,,,,
,,,,,,,,,Jurong Town Corporation,Sample Department,DEPARTMENT-20191218-0000068,,,,
,,,,,,,,,Jurong Town Corporation,Security Division,DEPARTMENT-20191121-0000061,,,,
,,,,,,,,,Jurong Town Corporation,Warehouse Department,DEPARTMENT-20191121-0000065,,,,
...@@ -18,4 +18,5 @@ docker run -d --restart=always -p 3001:3000 sit_rms_webv2 npm start ...@@ -18,4 +18,5 @@ docker run -d --restart=always -p 3001:3000 sit_rms_webv2 npm start
Clear Cache REDIS Clear Cache REDIS
docker exec -it container-name redis-cli FLUSHALL
config set stop-writes-on-bgsave-error no config set stop-writes-on-bgsave-error no
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