Commit 82e58763 authored by John Red Medrano's avatar John Red Medrano

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

* commit '015f53ef': (127 commits)
  add order by on etl endpoint descending order
  email to admin upon bulk create user
  body
  sender body batch email admin
  batch email admin
  requested to user comp and dept details
  batch upload exception
  select_related
  select_related
  try select_related
  vendor email
  approver reject message
  approver msg
  update reject template approver
  replace error at CUA upload user
  replace error key from detail to message to fix the bug on upload users
  updating my copy
  fix route back
  bug fix 2
  bug fix
  ...
parents f56a247c 015f53ef
......@@ -7,7 +7,7 @@ from django.conf import settings
class AppTokenAuthentication(TokenAuthentication):
keyword = 'Bearer'
def authenticate_credentials(self, key):
user, token = super(AppTokenAuthentication,
......
......@@ -27,7 +27,7 @@ class Login(ObtainAuthToken):
def post(self, request, *args, **kwargs):
try:
serializer = self.serializer_class(data=request.data,
context={'request': request})
context={'request': request})
serializer.is_valid(raise_exception=True)
user = serializer.validated_data['user']
token, created = Token.objects.get_or_create(user=user)
......@@ -87,7 +87,7 @@ class CurrentUser(APIView):
# @decorators.error_safe
def get(self, request, token=None, *args, **kwargs):
serializer = UserManagementRetreiveSerializer
context = {"request": request}
serializer = serializer(request.user, context=context)
......@@ -164,7 +164,7 @@ class ForgotPassword(APIView):
created=date_now,
timeout_at=timeout_at
).save()
url = f"{settings.FRONT_END_URL}/forgot-password/reset"\
f"?token={TOKEN}"
......
......@@ -9,7 +9,7 @@ class AllowedCompanySerializer(serializers.ModelSerializer):
ret['department'] = model_to_dict(instance.group_pivots)
ret['company'] = model_to_dict(instance.company_pivot)
return ret
class Meta:
model = AllowedCompany
fields = '__all__'
......
......@@ -11,7 +11,7 @@ class AllowedCompanyFilterSet(filters.FilterSet):
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = AllowedCompany
fields = '__all__'
......@@ -20,7 +20,10 @@ from django.db import IntegrityError
class AllowedCompanyViewSet(viewsets.ModelViewSet):
queryset = AllowedCompany.objects.all()
# queryset = AllowedCompany.objects.all()
queryset = AllowedCompany.objects.select_related(
'id_number', 'company_pivot', 'group_pivots'
).all()
serializer_class = AllowedCompanySerializer
pagination_class = CustomPagination
lookup_field = 'code'
......@@ -47,7 +50,7 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
'list of Users found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
......@@ -85,7 +88,6 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except IntegrityError as e:
print(str(e))
error = 'Adding the same Department under the same Company is not allowed'
message = {
'code': 400,
......@@ -96,8 +98,6 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
# print(str(e))
# error = 'adding the same departments under same Company is not allowed'
message = {
'code': 500,
'status': 'failed',
......
......@@ -10,11 +10,14 @@ from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK
class CancelTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request):
date_now = datetime.now()
today_mail = models.CancelTrigger.objects.filter(
......@@ -53,7 +56,7 @@ class CancelTriggerAPIView(views.APIView):
cancel = models.ChangeRequestFormHeader.objects.filter(
form_code=data.form_code
).update(status='Cancelled')
list_of_emails.append(data.form_code.form_code)
today_mail.update(is_sent=True)
......
......@@ -10,28 +10,32 @@ from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK
class OverdueTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request):
date_now = datetime.now()
today_mail = models.CancelTrigger.objects.filter(
Q(auto_cancel_date=date_now.strftime('%Y-%m-%d 00:00:00.000'))
today_mail = models.OverdueTrigger.objects.filter(
Q(overdue_date=date_now.strftime('%Y-%m-%d 00:00:00.000')) &
Q(is_sent=False)
)
list_of_emails = []
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 == False and (data.form_code.status == 'Pending' or
data.form_code.status == 'Approved' or
data.form_code.status == 'Rejected'):
cr_link = f'{CR_FRONT_LINK}/{data.form_code}'
requestor_name = data.form_code.requested_by_user.name
auto_cancel_date = data.auto_cancel_date.strftime('%B %d, %Y')
date_submitted_last_approver = data.date_submitted_last_approver.strftime('%B %d, %Y')
approver_pending_action = data.frm_approver.user.name
target_date = data.form_code.requested_to_target_date.strftime('%B %d, %Y')
cr_number = data.form_code.requested_to_template_id
cr_name = data.form_code.requested_to_template_name
company_requestedto = data.form_code.requested_to_company.name
......@@ -42,17 +46,12 @@ class OverdueTriggerAPIView(views.APIView):
requestor_recipient = data.form_code.requested_by_user.email
admin = 'Test'
args_requestor = [requestor_name, auto_cancel_date,
date_submitted_last_approver, approver_pending_action,
args_requestor = [requestor_name, target_date,
cr_number, cr_name, company_requestedto,
department_requestedto, priority_level, form_status, url,
requestor_recipient, admin]
main_threading(args_requestor, sender.routing_table_cancelled)
cancel = models.ChangeRequestFormHeader.objects.filter(
form_code=data.form_code
).update(status='Cancelled')
main_threading(args_requestor, sender.routing_table_overdue)
list_of_emails.append(data.form_code.form_code)
......
......@@ -10,11 +10,14 @@ from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK
class ReminderTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request):
date_now = datetime.now()
next_day = date_now + timedelta(days=1)
......@@ -23,10 +26,10 @@ class ReminderTriggerAPIView(views.APIView):
Q(date_to__lte=date_now.strftime('%Y-%m-%d 00:00:00.000')) &
Q(date_to_send=date_now.strftime('%Y-%m-%d 00:00:00.000'))
)
# print(today_mail)
list_of_emails = []
for data in today_mail:
if data.frm_approver.is_action == True:
if data.frm_approver.is_action == True and data.form_code.status == 'Pending':
# common details
cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}'
......
......@@ -8,6 +8,7 @@ class ChangeRequestFormApproversSerializer(
):
def to_representation(self, instance):
ret = super().to_representation(instance)
print(instance)
try:
ret['company'] = {
"id": instance.user.department.company.id,
......@@ -28,32 +29,53 @@ class ChangeRequestFormApproversSerializer(
"contact_no": instance.user.contact_no
}
ret['user'] = user_object
ret['delegation'] = {
"id": instance.delegation.id,
"code": instance.delegation.code,
"name": instance.delegation.name
}
if instance.form_code.status == 'Draft':
if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_user'] = False
else:
ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_comp'] = False
else:
ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_dept'] = False
else:
ret['editable_dept'] = True
# not instance.tmp_approver.delegation.code or
if instance.tmp_approver.delegation:
ret['editable_deleg'] = False
else:
ret['editable_deleg'] = True
# print(instance.tmp_approver.delegation.name)
# comment
# if instance.tmp_approver.delegation.name.lower() == 'requestor':
# ret['editable_user'] = False
# ret['editable_comp'] = False
# ret['editable_dept'] = False
# ret['editable_deleg'] = False
else:
ret['editable_user'] = True
ret['editable_comp'] = True
ret['editable_dept'] = True
ret['editable_deleg'] = True
else:
ret['editable_user'] = False
ret['editable_comp'] = False
ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret
......@@ -61,13 +83,14 @@ class ChangeRequestFormApproversSerializer(
if instance.form_code.status == 'Draft':
if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_user'] = False
else:
ret['user'] = None
ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['company'] = {
"id": instance.tmp_approver.company.id,
"code": instance.tmp_approver.company.code,
......@@ -79,7 +102,7 @@ class ChangeRequestFormApproversSerializer(
ret['company'] = None
ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['department'] = {
"id": instance.tmp_approver.department.id,
"code": instance.tmp_approver.department.code,
......@@ -90,14 +113,35 @@ class ChangeRequestFormApproversSerializer(
ret['department'] = None
ret['editable_dept'] = True
if instance.tmp_approver.delegation:
ret['delegation'] = {
"id": instance.tmp_approver.delegation.id,
"code": instance.tmp_approver.delegation.code,
"name": instance.tmp_approver.delegation.name
}
ret['editable_deleg'] = False
else:
ret['delegation'] = None
ret['editable_deleg'] = True
# print(instance.tmp_approver.delegation.name)
# if instance.tmp_approver.delegation.name.lower() == 'requestor':
# ret['editable_user'] = False
# ret['editable_comp'] = False
# ret['editable_dept'] = False
# ret['editable_deleg'] = False
else:
ret['editable_user'] = True
ret['editable_comp'] = True
ret['editable_dept'] = True
ret['editable_deleg'] = True
else:
ret['editable_user'] = False
ret['editable_comp'] = False
ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret
......
......@@ -13,7 +13,10 @@ from app.applicationlayer.utils import (
class ChangeRequestFormApproversViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormApprovers.objects.all().order_by('level')
# queryset = models.ChangeRequestFormApprovers.objects.all().order_by('level')
queryset = models.ChangeRequestFormApprovers.objects.select_related(
'form_code', 'tmp_approver'
).all().order_by('level')
serializer_class = serializers.ChangeRequestFormApproversSerializer
pagination_class = CustomPagination
lookup_field = 'code'
......
......@@ -12,7 +12,10 @@ from app.applicationlayer.utils import (
class ChangeRequestFormAttachmentsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormAttachments.objects.all()
# queryset = models.ChangeRequestFormAttachments.objects.all()
queryset = models.ChangeRequestFormAttachments.objects.select_related(
'form_code', 'file_upload'
).all()
serializer_class = serializers.ChangeRequestFormAttachmentsSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -13,7 +13,10 @@ from app.applicationlayer.utils import (
class ChangeRequestFormDetailsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormDetails.objects.all()
# queryset = models.ChangeRequestFormDetails.objects.all()
queryset = models.ChangeRequestFormDetails.objects.select_related(
'form_code'
).all()
serializer_class = serializers.ChangeRequestFormDetailsSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -38,7 +38,6 @@ class headers(serializers.ModelSerializer):
ret['created'] = instance.created.strftime('%Y-%m-%d-%H:%M:%S')
ret['action'] = approver
# ret['requested_to_target_date'] = instance.requested_to_target_date.strftime('%Y-%m-%d-%H:%M:%S')
print(ret)
return ret
# except Exception as e:
# ret['action_required'] = "No"
......
......@@ -93,19 +93,18 @@ class ChangeRequestFormHeaderSerializer(
ret['requested_to_company'] = "None"
ret['requested_to_department'] = "None"
ret['requested_to_user'] = "None"
ret['requested_by_user'] ="None"
ret['requested_by_user'] = "None"
ret['requested_by_department'] = "None"
ret['template_object'] = "None"
return ret
# 'company_desc', 'department_desc', 'requested_desc',
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',
......
......@@ -5,13 +5,14 @@ from app.entities.models import ChangeRequestFormHeader
class HeaderFilterSet(filters.FilterSet):
# action_required = filters.CharFilter(method='action_required_bar')
class Meta:
model = ChangeRequestFormHeader
fields = '__all__'
# def action_required_bar(self, queryset, name, value):
# return queryset.filter(
# Q(title__icontains=value) |
# Q(name__icontains=value) |
# Q(description__icontains=value)
# )
class Meta:
model = ChangeRequestFormHeader
fields = '__all__'
......@@ -12,7 +12,10 @@ from app.applicationlayer.utils import (
class ChangeRequestFormStakeHoldersViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormStakeHolders.objects.all()
# queryset = models.ChangeRequestFormStakeHolders.objects.all()
queryset = models.ChangeRequestFormStakeHolders.objects.select_related(
'form_code'
).all()
serializer_class = serializers.ChangeRequestFormStakeHoldersSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -556,12 +556,12 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=str(next_level),
delegation='Vendor/Implementor'
delegation__name='Vendor/Implementor'
).first()
if the_next_vendor:
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
form_code=form_code, delegation__name='Vendor/Implementor'
).order_by('level').last()
if the_next_vendor == the_last_vendor:
......@@ -688,8 +688,7 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
print(serializer.errors)
# save history in form header
crhistory_save(
batchno,
......@@ -802,9 +801,7 @@ class ChangeRequestFormsViewset(meviewsets.ModelViewSet):
pk=instance.id)
new_instance = model_to_dict(form_header)
print(serializer.errors)
# save history in form header
crhistory_create_save(
batchno,
......
......@@ -17,16 +17,10 @@ class UserListForm(APIView):
try:
serializer = ChangeRequestList
dept = self.request.query_params['department_code']
# company = self.request.query_params['company_code']
# allowed = models.AllowedCompany.objects.filter(
# Q(group_pivots=dept) &
# Q()
# )
user_list = models.User.objects.filter(
department=dept
).exclude(id=1)
# user_list = user_list.exclude(id=request.user.id)
print(user_list.query)
page = self.paginate_queryset(user_list)
if page is not None:
......
......@@ -72,9 +72,7 @@ class ChangeRequestCompanyFormViewSet(viewsets.ModelViewSet):
Q(requested_by_user=id_number) |
Q(frm_stakes__user__code=id_number)
).values()
# print(id_number)
# print(forms)
allowed = AllowedCompany.objects.filter(
id_number=id_number
).values().distinct()
......
......@@ -15,4 +15,4 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
)
\ No newline at end of file
......@@ -3,7 +3,7 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Department, AllowedCompany
from app.entities.models import Department, AllowedCompany, Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
......@@ -39,7 +39,7 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
).values('group_pivots')
queryset = queryset.filter(code__in=allowed)
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
......@@ -53,3 +53,8 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
......@@ -4,8 +4,9 @@ from app.applicationlayer.utils import (CustomPagination,
from app.applicationlayer.management.account.serializer import ChangeRequestList
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):
......@@ -25,7 +26,8 @@ class UserListTemplate(APIView):
user_list = models.User.objects.filter(
code__in=verified_users
)
print(user_list)
page = self.paginate_queryset(user_list)
if page is not None:
......
from rest_framework import serializers
from app.entities.models import User
from app.applicationlayer.utils import model_to_dict
class DefaultApproverSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['department'] = model_to_dict(instance.department)
ret['company'] = model_to_dict(instance.department.company)
return ret
class Meta:
model = User
fields = ('id', 'code', 'name', 'contact_no', 'email', 'department')
# fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
\ No newline at end of file
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import User
from django.db.models import Q
class DefaultApproverFilterSet(filters.FilterSet):
class Meta:
model = User
fields = '__all__'
from rest_framework import viewsets, status
from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import User, AllowedCompany
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.cms.master.template.default_approver import serializer
from app.applicationlayer.cms.master.template.default_approver.table_filter import (
DefaultApproverFilterSet
)
from app.helper.decorators import rms
from django.db.models import Q
from rest_framework.exceptions import ParseError
class DefaultApproverViewSet(viewsets.ModelViewSet):
queryset = User.objects.all()
serializer_class = serializer.DefaultApproverSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = DefaultApproverFilterSet
ordering_fields = '__all__'
search_fields = ('name', 'department__name', 'code')
def list(self, request, *args, **kwargs):
department = self.request.query_params['department_code']
queryset = self.filter_queryset(self.get_queryset())
default_user = AllowedCompany.objects.filter(
Q(group_pivots=department) &
Q(approve_cr=True)
).values('id_number')
queryset = queryset.filter(code__in=default_user)
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 Default Approvers found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
......@@ -48,18 +48,31 @@ class ChangeRequestTemplateApproversSerializer(
else:
ret['editable_user'] = True
if instance.delegation.lower() == 'requestor':
if instance.delegation:
ret['delegation'] = {
"id": instance.delegation.id,
"code": instance.delegation.code,
"name": instance.delegation.name
}
ret['editable_deleg'] = False
else:
ret['editable_deleg'] = True
if instance.delegation.name.lower() == 'requestor':
ret['editable_user'] = False
ret['editable_comp'] = False
ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret
except Exception as e:
ret['editable_user'] = True
ret['editable_comp'] = True
ret['editable_dept'] = True
ret['editable_deleg'] = True
return ret
......
......@@ -13,7 +13,10 @@ from app.applicationlayer.utils import (
class ChangeRequestTemplateApproversViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateApprovers.objects.all()
# queryset = models.ChangeRequestTemplateApprovers.objects.all()
queryset = models.ChangeRequestTemplateApprovers.objects.select_related(
'template_no', 'company', 'department'
).all()
serializer_class = serializers.ChangeRequestTemplateApproversSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -13,7 +13,10 @@ from app.applicationlayer.utils import (
class ChangeRequestTemplateAttachmentsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateAttachments.objects.all()
# queryset = models.ChangeRequestTemplateAttachments.objects.all()
queryset = models.ChangeRequestTemplateAttachments.objects.select_related(
'file_upload', 'template_no'
).all()
serializer_class = serializers.ChangeRequestTemplateAttachmentsSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -13,7 +13,10 @@ from app.applicationlayer.utils import (
class ChangeRequestTemplateDetailsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateDetails.objects.all()
# queryset = models.ChangeRequestTemplateDetails.objects.all()
queryset = models.ChangeRequestTemplateDetails.objects.select_related(
'template_no'
).all()
serializer_class = serializers.ChangeRequestTemplateDetailsSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -43,9 +43,13 @@ class ChangeRequestTemplatesSerializer(
"username": instance.requested_to_user.username,
"code": instance.requested_to_user.code,
"email": instance.requested_to_user.email,
"contact_no": instance.requested_to_user.contact_no
"contact_no": instance.requested_to_user.contact_no,
"company_code": instance.requested_to_user.department.company.code,
"company_name": instance.requested_to_user.department.company.name,
"department_code": instance.requested_to_user.department.code,
"department_name": instance.requested_to_user.department.name
}
ret['requested_to_company'] = {
"id": instance.requested_to_company.id,
"code": instance.requested_to_company.code,
......
......@@ -46,7 +46,10 @@ from django_filters.rest_framework import DjangoFilterBackend
class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateHeader.objects.all()
# queryset = models.ChangeRequestTemplateHeader.objects.all()
queryset = models.ChangeRequestTemplateHeader.objects.select_related(
'created_by_user', 'created_by_department'
).all()
serializer_class = ChangeRequestTemplatesSerializer
pagination_class = CustomPagination
lookup_field = 'template_no'
......@@ -61,7 +64,7 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
'created',
'created_by_user__name'
)
search_fields = (
"template_no", "requested_to_template_id", "created_by_user__name",
"created_by_user__code", "created_by_department__name",
......@@ -190,7 +193,7 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
template_no = kwargs['template_no']
body_data = request.data
tmp_no_exists = models.ChangeRequestFormHeader.objects.filter(
template_no=template_no)
......@@ -361,6 +364,12 @@ class ChangeRequestTemplatePost(APIView):
}
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(
data=template_header_data)
......
......@@ -13,7 +13,10 @@ from app.applicationlayer.utils import (
class ChangeRequestTemplateStakeholdersViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestTemplateStakeHolders.objects.all()
# queryset = models.ChangeRequestTemplateStakeHolders.objects.all()
queryset = models.ChangeRequestTemplateStakeHolders.objects.select_related(
'template_no'
).all()
serializer_class = serializers.ChangeRequestTemplateStakeHoldersSerializer
pagination_class = CustomPagination
lookup_field = "code"
......
......@@ -12,6 +12,7 @@ from app.applicationlayer.cms.master.template.company.views import ChangeRequest
from app.applicationlayer.cms.master.template.department.views import ChangeRequestDepartmentTemplateViewSet
from app.applicationlayer.cms.master.template.account.views import UserListTemplate
from app.applicationlayer.cms.master.template_list.views import ChangeRequestTemplateHeaderMaster
from app.applicationlayer.cms.master.template.default_approver.views import DefaultApproverViewSet
# MASTERS Form
......@@ -69,6 +70,7 @@ router.register(r'allowed-companies', allowed.AllowedCompanyViewSet)
router.register(r'template-companies', ChangeRequestCompanyTemplateViewSet)
router.register(r'template-departments', ChangeRequestDepartmentTemplateViewSet)
router.register(r'allowed-templates', ChangeRequestTemplateHeaderMaster)
router.register(r'default-approvers', DefaultApproverViewSet)
# filter endpoints under Allowed Companies table
# filter endpoints under Allowed Companies table
......@@ -86,7 +88,8 @@ urlpatterns = [
path('template-user-list/', UserListTemplate.as_view(), name="User List"),
# filter endpoints under Allowed Companies table
path('reminder/', reminder.ReminderTriggerAPIView.as_view()),
# path('cancelled/', cancel.CancelTriggerAPIView.as_view()),
path('cancelled/', cancel.CancelTriggerAPIView.as_view()),
path('overdue/', overdue.OverdueTriggerAPIView.as_view()),
]
# urlpatterns += format_suffix_patterns(urlpatterns)
......
This diff is collapsed.
......@@ -5,7 +5,6 @@ from django.db.models import Q
class headers(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['deparment'] = instance.department.name
......@@ -13,8 +12,6 @@ class headers(serializers.ModelSerializer):
return ret
class Meta:
model = models.User
fields = (
......
......@@ -20,7 +20,7 @@ class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
renderer_classes = (XLSXRenderer,)
filename = 'User List.xlsx'
permission_classes = (AllowAny,)
def list(self, request, *args, **kwargs):
# id_number = request.user.code
......
......@@ -10,8 +10,7 @@ class headers(serializers.ModelSerializer):
ret['modified'] = instance.modified.strftime('%Y-%m-%d-%H:%M:%S')
return ret
class Meta:
model = models.Company
fields = (
......
......@@ -50,6 +50,15 @@ class UserEditSerializer(serializers.ModelSerializer):
class ChangeRequestList(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
ret['company_name'] = instance.department.company.name
ret['company_code'] = instance.department.company.code
ret['department_code'] = instance.department.code
ret['department_name'] = instance.department.name
return ret
class Meta:
model = User
fields = (
......
import copy
import threading
import pandas as pd
import csv
import io, os
from app.entities import enums
from django.db import transaction
from app.helper import decorators
......@@ -13,7 +16,8 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from app.entities.models import (
User, EntityLog, PasswordReset, Application, UserImage,
ChangeRequestFormHeader, ChangeRequestTemplateHeader
ChangeRequestFormHeader, ChangeRequestTemplateHeader,
AllowedCompany, Company, Department, UserHistory
)
from app.helper.decorators import rms, error_safe
from django.contrib.auth.hashers import make_password
......@@ -23,6 +27,7 @@ from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.management.account.table_filters import AccountFilterset
from app.applicationlayer.management.account import serializer
from app.helper.file_manager import FileHelper
from django.db import IntegrityError
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save,
main_threading
......@@ -66,8 +71,6 @@ class UserViewSet(viewsets.ModelViewSet):
if request.data['user_type'] != 'USR':
rms = Application.objects.filter(id=1).values('code').first()
app.append(rms['code'])
# else:
# app = request.data['application']
......@@ -145,6 +148,8 @@ class UserViewSet(viewsets.ModelViewSet):
instance = self.get_object()
new_instance = model_to_dict(instance)
UserHistory.objects.filter(username=instance.username).update(deleted=True)
AllowedCompany.objects.filter(id_number=instance.code).delete()
self.perform_destroy(instance)
log_save(
......@@ -228,6 +233,193 @@ class UserViewSet(viewsets.ModelViewSet):
)
# @rms.user_create
# @action(detail=False,
# methods=['put'],
# url_path='batch-upload',
# name="upload User")
# @decorators.error_safe
# @transaction.atomic
# def BatchUpload(self, request):
# csv_file = request.FILES['file']
# df = pd.read_csv(csv_file, sep=',', skiprows=0)
# logged_user_type = request.user.user_type
# logged_user_company = request.user.department.company.name
# logged_user_department = request.user.department.name
# logged_user_email = request.user.email
# email_users = []
# for data, keys in df.iterrows():
# try:
# user_department = Department.objects.filter(
# Q(name__icontains=keys['department']) &
# Q(company__name__icontains=logged_user_company)
# ).first()
# if logged_user_type == 'CUA':
# user_department = Department.objects.filter(
# Q(name__icontains=keys['department']) &
# Q(company__name__icontains=logged_user_company)
# ).first()
# if user_department == None:
# msg = f"company is not the same with the logged user at row {data + 2}"
# return Response(
# {"message": msg},
# status=status.HTTP_400_BAD_REQUEST
# )
# elif logged_user_type == 'DUA':
# user_department = Department.objects.get(
# name__icontains=logged_user_department
# )
# elif logged_user_type == 'USR':
# return Response(
# {"message": "Logged User is not allowed"},
# status=status.HTTP_400_BAD_REQUEST
# )
# else:
# user_department = Department.objects.get(
# name__icontains=keys['department']
# )
# default_app = Application.objects.filter(
# excel_code=keys['default_app']
# ).first()
# enums_super = enums.UserTypeEnum.SUPER_USER.value
# enums_OUA = enums.UserTypeEnum.OVERALL_USER_ADMIN.value
# enums_company = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
# enums_department = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
# enums_user = enums.UserTypeEnum.USER.value
# if keys['user_type'].lower() == 'super user' and logged_user_type == enums_super:
# user_type = enums.UserTypeEnum.SUPER_USER.value
# elif keys['user_type'].lower() == 'super user' and logged_user_type != enums_super:
# return Response(
# {"message": f"This user is not allowed to create super user. data error at row {data + 2}"},
# status=status.HTTP_201_CREATED
# )
# elif keys['user_type'].lower() == 'overall user admin':
# user_type = enums.UserTypeEnum.OVERALL_USER_ADMIN.value
# elif keys['user_type'].lower() == 'company user admin':
# user_type = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
# elif keys['user_type'].lower() == 'department user admin':
# user_type = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
# else:
# user_type = enums.UserTypeEnum.USER.value
# users = {
# "username": keys['username'],
# "name": keys['name'],
# "department": user_department,
# "email": keys['email'],
# "contact_no": keys['contact_no'],
# "default_app": default_app,
# "user_type": user_type
# }
# current_user = User.objects.create(
# **users
# )
# password = User.objects.make_random_password(length=10)
# password_hash = make_password(password)
# current_user.password = password_hash
# current_user.save()
# app = Application.objects.filter(
# excel_code__in=keys['application'].split(',')
# )
# update_user = current_user.application.set(app)
# for instance in keys['privilege'].split(';'):
# privilege_list = instance.split(',')
# this_company = Company.objects.filter(
# name__icontains=privilege_list[0]
# ).first()
# this_department = Department.objects.filter(
# name__icontains=privilege_list[1]
# ).first()
# if privilege_list[2] == 0:
# privilege_list[2] = False
# else:
# privilege_list[2] = True
# if privilege_list[3] == 0:
# privilege_list[3] = False
# else:
# privilege_list[3] = True
# if privilege_list[4] == 0:
# privilege_list[4] = False
# else:
# privilege_list[4] = True
# current_user = User.objects.get(id=current_user.id)
# try:
# privilege_object = {
# "id_number": current_user,
# "company_pivot": this_company,
# "group_pivots": this_department,
# "create_change_request": privilege_list[2],
# "create_change_request_template": privilege_list[3],
# "view_all_change_request": privilege_list[4],
# "approve_cr": privilege_list[5]
# }
# AllowedCompany.objects.create(**privilege_object)
# except IntegrityError as e:
# return Response(
# {"message": f"Duplicate user privilege at row {data + 2}"},
# status=status.HTTP_400_BAD_REQUEST
# )
# except IntegrityError as e:
# return Response(
# {"message": f"Record already exist at row {data + 2}"},
# status=status.HTTP_400_BAD_REQUEST
# )
# except KeyError as e:
# return Response(
# {"message": "Missing column user_type"},
# status=status.HTTP_400_BAD_REQUEST
# )
# del users['department']
# del users['contact_no']
# del users['default_app']
# del users['user_type']
# users['password'] = password
# UserHistory.objects.create(
# **users
# )
# users['admin'] = logged_user_email
# send_mail = UserHistory.objects.filter(sent=False)[0:100].values(
# 'name', 'username', 'email', 'password'
# )
# df = pd.DataFrame(send_mail)
# df.to_csv("users.csv", index=False)
# args = ["users.csv", logged_user_email]
# main_threading(args, sender.batch_email_admin)
# args = [send_mail, logged_user_email]
# main_threading(args, sender.batch_email_users)
# return Response(
# {"message": "File already uploaded"},
# status=status.HTTP_201_CREATED
# )
@action(detail=True,
methods=['put'],
url_path='reset-password',
......
......@@ -24,12 +24,12 @@ class ApplicationViewSet(viewsets.ModelViewSet):
filterset_class = ApplicationFilterSet
ordering_fields = '__all__'
search_fields = ('name', 'code')
@decorators.rms.application_crate
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
......
from rest_framework import serializers
from app.entities.models import (
ExtractTransformLoad, UserHistory, MasterAttachment
)
class ExtractTransformLoadSerializer(serializers.ModelSerializer):
class Meta:
model = ExtractTransformLoad
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
class UserHistorySerializer(serializers.ModelSerializer):
class Meta:
model = UserHistory
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'code'
)
class BatchUploadSerializer(serializers.ModelSerializer):
class Meta:
model = MasterAttachment
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
class BatchUploadSerializer(serializers.ModelSerializer):
class Meta:
model = MasterAttachment
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
from django_filters import rest_framework as filters
from app.entities.models import UserHistory, ExtractTransformLoad
class ExtractTransformLoadFilter(filters.FilterSet):
class Meta:
model = ExtractTransformLoad
fields = '__all__'
This diff is collapsed.
......@@ -88,7 +88,6 @@ class CompanyViewSet(viewsets.ModelViewSet):
partial = kwargs.pop('partial', False)
instance = self.get_object()
print(request.data)
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
......
from rest_framework import serializers
from app.entities.models import Delegation
class DelegationSerializer(serializers.ModelSerializer):
class Meta:
model = Delegation
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
from django_filters import rest_framework as filters
from app.entities.models import Delegation
class DelegationFilterSet(filters.FilterSet):
class Meta:
model = Delegation
fields = '__all__'
from app.entities import enums
from django.db import transaction
from rest_framework import viewsets, status
from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Delegation, Department
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.delegation import serializer
from app.applicationlayer.management.delegation.table_filters import DelegationFilterSet
from app.helper import decorators
class DelegationViewSet(viewsets.ModelViewSet):
queryset = Delegation.objects.all().order_by('-created')
serializer_class = serializer.DelegationSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = DelegationFilterSet
ordering_fields = '__all__'
search_fields = ('name')
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Delegation created', serializer.data
)
return Response(
message
)
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 Delegation found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@decorators.error_safe
@transaction.atomic
def destroy(self, request, *args, **kwargs):
message = {
'code': 400,
'status': 'failed',
'message': 'Delegation/s cannot delete, Please update instead'
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
@transaction.atomic
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', True)
instance = self.get_object()
serializer = self.get_serializer(
instance,
data=request.data,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
if not (old_instance['name'].lower() == 'vendor/implementor' or
old_instance['name'].lower() == 'requestor'):
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.UPDATE.value,
enums.LogEntitiesEnum.DELEGATION.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
else:
message = {
'code': 400,
'status': 'failed',
'message': 'Default delegation cannot edit'
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
......@@ -16,7 +16,7 @@ class SubModuleField(serializers.Field):
class ModuleSerializer(serializers.ModelSerializer):
sub_module = SubModuleField(source='*', read_only=True)
def to_representation(self, instance):
application_name = Application.objects.filter(
id=instance.application.id
......
......@@ -89,7 +89,6 @@ class NotificationsViewset(meviewsets.ModelViewSet):
def seen(self, request, account_no=None, **kwargs):
try:
account_no = self.kwargs['account_no']
print(account_no)
models.Notification.objects.filter(account_no=account_no,
id__in=request.data['ids']).update(
......@@ -117,8 +116,7 @@ class NotificationsViewset(meviewsets.ModelViewSet):
def seenall(self, request, account_no=None, **kwargs):
try:
account_no = self.kwargs['account_no']
print(account_no)
models.Notification.objects.filter(account_no=account_no).update(
is_read=True,
modified=datetime.now())
......
......@@ -19,7 +19,6 @@ class UserManagementSerializer(serializers.ModelSerializer):
primayPic = user.user_images.filter(is_primary=True).first()
if primayPic:
print(primayPic.image.url)
return request.build_absolute_uri(primayPic.image.url)
else:
return request.build_absolute_uri('/media/no-user.png')
......@@ -106,7 +105,6 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
primayPic = user.user_images.filter(is_primary=True).first()
if primayPic:
print(primayPic.image.url)
return request.build_absolute_uri(primayPic.image.url)
else:
return request.build_absolute_uri('/media/no-user.png')
......
......@@ -68,9 +68,7 @@ class UsersManagementViewSet(viewsets.ModelViewSet):
@decorators.error_safe
def list(self, request, *args, **kwargs):
print(request.data['department__name'])
self.serializer_class = serializers.UserManagementRetreiveSerializer
# self.queryset = QuerySetHelper.Sort(self)
return super(UsersManagementViewSet, self).list(request)
@decorators.error_safe
......@@ -93,7 +91,7 @@ class UsersManagementViewSet(viewsets.ModelViewSet):
createdUser = models.User.objects.filter(id=pk).first()
createdUser.set_password(settings.USER_DEFAULT_PASSWORD)
createdUser.save()
# LOG ADD
log_save.log_save(
enums.LogEnum.ADD.value,
......
......@@ -16,7 +16,8 @@ class AdminAccountSerializer(serializers.ModelSerializer):
class Meta:
model = User
fields = '__all__'
# fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
exclude = ('password',)
from rest_framework import serializers
from app.entities.models import Department
from app.entities.models import Department, Delegation
from app.applicationlayer.utils import model_to_dict
......@@ -16,3 +16,12 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
class DelegationSerializer(serializers.ModelSerializer):
class Meta:
model = Delegation
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
\ No newline at end of file
......@@ -3,20 +3,23 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Department
from app.entities.models import Department, Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.master.department import serializer
from app.applicationlayer.master.department.serializer import (
AdminDepartmentSerializer,
DelegationSerializer)
from app.applicationlayer.management.department.table_filters import DepartmentFilterSet
from app.helper.decorators import rms
from rest_framework.decorators import action
class AdminDepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all().order_by('-created')
serializer_class = serializer.AdminDepartmentSerializer
serializer_class = AdminDepartmentSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
......@@ -44,7 +47,6 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
)
return self.get_paginated_response(message)
except Exception as e:
# serializer = self.get_serializer(queryset, many=True)
message = status_message_response(
400,
'failed',
......@@ -52,3 +54,34 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
''
)
return Response(message)
@action(detail=True,
methods=['get'],
url_path='delegations',
name="Delegation Filtered List")
def delegations(self, request, *args, **kwargs):
try:
dept_code = kwargs['code']
queryset = Delegation.objects.filter(departments__code=dept_code)
page = self.paginate_queryset(queryset)
if page is not None:
self.serializer_class = DelegationSerializer
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of filtered delegations found',
serializer.data
)
return self.get_paginated_response(message)
except Exception as e:
message = status_message_response(
400,
'failed',
str(e),
''
)
return Response(message)
\ No newline at end of file
......@@ -25,7 +25,7 @@ class UserTypeViewSet(APIView):
"code": "200",
"status": "success",
"message": "list of user types",
"results":
"results":
# [
{
enums_super_key : enums_super,
......
......@@ -7,8 +7,10 @@ from app.applicationlayer.management.company.views import CompanyViewSet
from app.applicationlayer.management.department.views import DepartmentViewSet
from app.applicationlayer.management.module.views import ModuleViewSet
from app.applicationlayer.management.account.views import UserViewSet
from app.applicationlayer.management.batchupload.views import BatchUploadViewSet
from app.businesslayer.company.views import AdminCompanyViewSet
from app.applicationlayer.management.notification.views import NotificationsViewset
from app.applicationlayer.management.delegation.views import DelegationViewSet
from app.applicationlayer.download.accounts.views import UserDownloadRequest
from app.applicationlayer.download.department.views import DepartmentDownloadRequest
......@@ -26,6 +28,8 @@ router.register(r'notifications', NotificationsViewset)
router.register(r'user-download', UserDownloadRequest)
router.register(r'department-download', DepartmentDownloadRequest)
router.register(r'company-download', CompanyDownloadRequest)
router.register(r'delegations', DelegationViewSet)
router.register(r'extract-transform-load', BatchUploadViewSet)
urlpatterns = (
path('', include(router.urls)),
......
......@@ -20,7 +20,7 @@ REALTIMESERVER_IP = settings.REALTIMESERVER_IP
def model_to_dict(instance):
try:
mySerializer = copy.deepcopy(DynamicSerializer)
mySerializer.Meta.model = instance.__class__
return mySerializer(instance).data
......@@ -54,6 +54,25 @@ class CustomPagination(PageNumberPagination):
})
class PaginationForETL(PageNumberPagination):
page_size = 100
max_page_size = 3000
page_query_param = 'page'
page_size_query_param = 'page_size'
def get_paginated_response(self, data):
return Response({
'page_number': self.page.number,
'size_per_page': self.page.paginator.per_page,
'total_pages': self.page.paginator.num_pages,
'total': self.page.paginator.count,
'code': data['code'],
'status': data['status'],
'message': data['message'],
'results': data['results']
})
# def entitylogs_decorator(function):
# @wraps(function)
# def wrapper(self, request, *args, **kwargs):
......@@ -161,7 +180,8 @@ def send_broadcast_message(room_name, sender, message):
ws.close()
def notification_create(form_code, message, account_no, sender_account_no):
def notification_create(form_code, message, account_no,
sender_account_no, app):
try:
......@@ -170,7 +190,7 @@ def notification_create(form_code, message, account_no, sender_account_no):
notif_type='TASK',
message=message,
is_read=False,
app='APP-20190909-0000002',
app=app,
account_no=account_no,
sender_account_no=sender_account_no
)
......@@ -184,12 +204,6 @@ def notification_create(form_code, message, account_no, sender_account_no):
'NEW NOTIFICATIONS'
)
# message = {
# 'code': 200,
# 'status': 'success',
# 'message': 'Notification successfully created!',
# }
# return Response(message, status=status.HTTP_200_OK)
return True
except Exception as e:
......
......@@ -8,4 +8,4 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
)
\ No newline at end of file
......@@ -41,4 +41,4 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
return Response(serializer.data)
\ No newline at end of file
......@@ -11,11 +11,11 @@ class UserTypeViewSet(APIView):
enums_company = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
enums_department = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
enums_user = enums.UserTypeEnum.USER.value
data = {
'Super user': enums_super,
'Overall user admin': enums_OUA,
"Company user admin": enums_company,
"Company user admin": enums_company,
"Department user admin": enums_department,
"user": enums_user
}
......
......@@ -29,6 +29,7 @@ class GenerateCode(Enum):
COMPANY = 'COMPANY'
DEPARTMENT = 'DEPARTMENT'
USER = 'USER'
DELEGATION = 'DELEGATION'
NOTIFICATION = 'NOTIF'
TEMPLATE = 'TMP'
TMP_APPROVER = 'TMPAPR'
......@@ -40,6 +41,7 @@ class GenerateCode(Enum):
FORM_STAKE = 'FRMSTK'
FORM_ATTACH = 'FRMATCH'
FORM_DETAIL = 'FRMDETAIL'
ETL = 'ETL'
ASSET_GROUP = 'AMSGRP'
......@@ -62,6 +64,7 @@ class LogEntitiesEnum(Enum):
COMPANY = "COMPANY"
DEPARTMENT = "DEPARTMENT"
MODULE = "MODULE"
DELEGATION = "DELEGATION"
ChangeRequestTemplateHeader = "ChangeRequestTemplateHeader"
ChangeRequestTemplateApprovers = "ChangeRequestTemplateApprovers"
ChangeRequestTemplateStakeHolders = "ChangeRequestTemplateStakeHolders"
......
# Generated by Django 2.2 on 2019-11-08 14:03
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0027_assetgroup'),
]
operations = [
migrations.AddField(
model_name='application',
name='excel_code',
field=models.CharField(default='rms', max_length=255),
preserve_default=False,
),
]
# Generated by Django 2.2 on 2019-10-29 15:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0027_assetgroup'),
]
operations = [
migrations.AddField(
model_name='canceltrigger',
name='cancel_type',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AddField(
model_name='remindertrigger',
name='form_code',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormHeader', to_field='form_code'),
),
migrations.AlterField(
model_name='canceltrigger',
name='frm_approver',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormApprovers', to_field='code'),
),
]
# Generated by Django 2.2 on 2019-11-04 12:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0028_auto_20191029_1513'),
]
operations = [
migrations.AlterModelTable(
name='canceltrigger',
table='trigger_cancel',
),
migrations.AlterModelTable(
name='overduetrigger',
table='trigger_overdue',
),
migrations.AlterModelTable(
name='remindertrigger',
table='trigger_reminder',
),
]
# Generated by Django 2.2 on 2019-11-08 15:04
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0028_application_excel_code'),
]
operations = [
migrations.CreateModel(
name='UserHistory',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)),
('createdby', models.CharField(max_length=255)),
('modified', models.DateTimeField(auto_now=True)),
('modifiedby', models.CharField(max_length=255)),
('name', models.CharField(max_length=255)),
('username', models.CharField(max_length=255, unique=True)),
('email', models.EmailField(max_length=255)),
('password', models.CharField(max_length=255)),
('sent', models.BooleanField(default=False)),
],
options={
'db_table': 'user_history',
},
),
]
# Generated by Django 2.2 on 2019-11-04 15:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0029_auto_20191104_1228'),
]
operations = [
migrations.AlterModelOptions(
name='assetgroup',
options={'ordering': ['-created']},
),
]
# Generated by Django 2.2 on 2019-11-07 12:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0030_auto_20191104_1507'),
]
operations = [
migrations.CreateModel(
name='Delegation',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)),
('createdby', models.CharField(max_length=255)),
('modified', models.DateTimeField(auto_now=True)),
('modifiedby', models.CharField(max_length=255)),
('code', models.CharField(max_length=255, unique=True)),
('name', models.CharField(max_length=255, unique=True)),
],
options={
'db_table': 'delegations',
},
),
migrations.AlterField(
model_name='changerequestformapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.Delegation', to_field='code'),
),
migrations.AlterField(
model_name='changerequesttemplateapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.Delegation', to_field='code'),
),
migrations.AddField(
model_name='department',
name='delegation',
field=models.ManyToManyField(to='entities.Delegation'),
),
]
# Generated by Django 2.2 on 2019-11-08 11:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0031_auto_20191107_1239'),
]
operations = [
migrations.AddField(
model_name='allowedcompany',
name='approve_cr',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='entitylog',
name='entity',
field=models.CharField(choices=[('USER', 'USER'), ('APPLICATION', 'APPLICATION'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('MODULE', 'MODULE'), ('DELEGATION', 'DELEGATION'), ('ChangeRequestTemplateHeader', 'ChangeRequestTemplateHeader'), ('ChangeRequestTemplateApprovers', 'ChangeRequestTemplateApprovers'), ('ChangeRequestTemplateStakeHolders', 'ChangeRequestTemplateStakeHolders'), ('ChangeRequestTemplateAttachments', 'ChangeRequestTemplateAttachments'), ('ChangeRequestTemplateDetails', 'ChangeRequestTemplateDetails'), ('ChangeRequestFormHeader', 'ChangeRequestFormHeader'), ('ChangeRequestFormApprovers', 'ChangeRequestFormApprovers'), ('ChangeRequestFormStakeHolders', 'ChangeRequestFormStakeHolders'), ('ChangeRequestFormAttachments', 'ChangeRequestFormAttachments'), ('ChangeRequestFormDetails', 'ChangeRequestFormDetails')], default='Add', max_length=50),
),
]
# Generated by Django 2.2 on 2019-11-08 17:25
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0032_auto_20191108_1109'),
('entities', '0029_userhistory'),
]
operations = [
]
# Generated by Django 2.2 on 2019-11-08 19:24
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0033_merge_20191108_1725'),
]
operations = [
migrations.AlterField(
model_name='allowedcompany',
name='approve_cr',
field=models.BooleanField(default=False),
),
]
# Generated by Django 2.2 on 2019-11-11 10:42
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0034_auto_20191108_1924'),
]
operations = [
migrations.AddField(
model_name='changerequesttemplateapprovers',
name='is_default',
field=models.BooleanField(default=False),
),
]
# Generated by Django 2.2 on 2019-11-11 15:49
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0035_changerequesttemplateapprovers_is_default'),
]
operations = [
migrations.AlterField(
model_name='department',
name='delegation',
field=models.ManyToManyField(related_name='departments', to='entities.Delegation'),
),
]
# Generated by Django 2.2 on 2019-11-12 14:03
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0036_auto_20191111_1549'),
]
operations = [
migrations.AlterField(
model_name='changerequestformapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='entities.Delegation', to_field='code'),
),
migrations.AlterField(
model_name='changerequesttemplateapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, to='entities.Delegation', to_field='code'),
),
]
# Generated by Django 2.2 on 2019-11-12 14:57
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0037_auto_20191112_1403'),
]
operations = [
migrations.AlterField(
model_name='changerequestformapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='entities.Delegation', to_field='code'),
),
migrations.AlterField(
model_name='changerequesttemplateapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.CASCADE, to='entities.Delegation', to_field='code'),
),
]
# Generated by Django 2.2 on 2019-11-13 10:16
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0038_auto_20191112_1457'),
]
operations = [
migrations.CreateModel(
name='ExtractTransformLoad',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)),
('createdby', models.CharField(max_length=255)),
('modified', models.DateTimeField(auto_now=True)),
('modifiedby', models.CharField(max_length=255)),
('file_name', models.CharField(max_length=255)),
('model_type', models.CharField(choices=[('APP', 'APP'), ('MODULE', 'MODULE'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('USER', 'USER'), ('DELEGATION', 'DELEGATION'), ('NOTIF', 'NOTIF'), ('TMP', 'TMP'), ('TMPAPR', 'TMPAPR'), ('TMPSTK', 'TMPSTK'), ('TMPATCH', 'TMPATCH'), ('TMPDETAIL', 'TMPDETAIL'), ('FRM', 'FRM'), ('FRMAPR', 'FRMAPR'), ('FRMSTK', 'FRMSTK'), ('FRMATCH', 'FRMATCH'), ('FRMDETAIL', 'FRMDETAIL'), ('ETL', 'ETL'), ('AMSGRP', 'AMSGRP')], default='USER', max_length=100)),
('code', models.CharField(blank=True, max_length=255, null=True, unique=True)),
],
options={
'db_table': 'csv_filenames',
},
),
migrations.AddField(
model_name='userhistory',
name='file_name',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.DO_NOTHING, related_name='extract_transform_load', to='entities.ExtractTransformLoad', to_field='code'),
),
]
# Generated by Django 2.2 on 2019-11-13 15:05
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0039_auto_20191113_1016'),
]
operations = [
migrations.AddField(
model_name='userhistory',
name='deleted',
field=models.BooleanField(default=False),
),
migrations.AlterField(
model_name='userhistory',
name='username',
field=models.CharField(max_length=255),
),
]
# Generated by Django 2.2 on 2019-11-13 19:23
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0040_auto_20191113_1505'),
]
operations = [
migrations.AlterModelTable(
name='extracttransformload',
table='extract_transform_load',
),
migrations.AlterModelTable(
name='userhistory',
table='extract_transform_load_user_history',
),
]
......@@ -32,7 +32,6 @@ class BaseAuditClass(models.Model):
modifiedby = models.CharField(max_length=255)
def save(self, *args, **kwargs):
# print('333')
if self.createdby and self.modifiedby:
# username = 'Anonymous User'
# self.createdby = username
......
......@@ -8,6 +8,9 @@ from datetime import datetime
from . import enums
from django.utils.text import slugify
from datetime import timedelta
import os
from django.conf import settings
# ********************* AUTH TABLES *********************
......@@ -27,6 +30,7 @@ class Application(AuditClass):
max_length=255
)
name = models.CharField(unique=True, max_length=255)
excel_code = models.CharField(max_length=255)
class Meta:
db_table = 'applications'
......@@ -85,6 +89,29 @@ class Module(AuditClass):
Module.objects.filter(id=self.id).update(code=code)
class Delegation(AuditClass):
code = models.CharField(
unique=True,
max_length=255
)
name = models.CharField(unique=True, max_length=255)
class Meta:
db_table = 'delegations'
def __str__(self):
return f'{self.name}'
def save(self, *args, **kwargs):
super(Delegation, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.DELEGATION.value, self.id)
if self.code == '':
self.code = code
self.created = datetime.now()
self.save()
class Company(AuditClass):
code = models.CharField(
unique=True,
......@@ -103,7 +130,6 @@ class Company(AuditClass):
def save(self, *args, **kwargs):
super(Company, self).save(*args, **kwargs)
if self.code == 'com':
print(self.code)
code = enums.GenerateCode.APP.value
code = number_generator(enums.GenerateCode.COMPANY.value, self.id)
Company.objects.filter(id=self.id).update(code=code)
......@@ -128,6 +154,10 @@ class Department(AuditClass):
default='dept'
)
name = models.CharField(max_length=255)
delegation = models.ManyToManyField(
Delegation,
related_name='departments'
)
class Meta:
db_table = 'departments'
......@@ -211,6 +241,57 @@ class RolePermission(AuditClass):
class Meta:
db_table = 'role_permissions'
class ExtractTransformLoad(AuditClass):
file_name = models.CharField(max_length=255)
model_type = models.CharField(
choices=[(tag.value, tag.value) for tag in enums.GenerateCode],
default=enums.GenerateCode.USER.value,
max_length=100
)
code = models.CharField(
unique=True,
max_length=255,
blank=True,
null=True
)
class Meta:
db_table = 'extract_transform_load'
def __str__(self):
return f'{self.file_name}'
def save(self, *args, **kwargs):
super(ExtractTransformLoad, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.ETL.value, self.id)
print(type(self.code))
if self.code == '' or self.code == None:
self.code = code
self.save()
class UserHistory(AuditClass):
file_name = models.ForeignKey(
ExtractTransformLoad,
to_field='code',
related_name='extract_transform_load',
on_delete=models.DO_NOTHING,
blank=True,
null=True
)
name = models.CharField(max_length=255)
username = models.CharField(max_length=255)
email = models.EmailField(max_length=255, unique=False)
password = models.CharField(max_length=255)
sent = models.BooleanField(default=False)
deleted = models.BooleanField(default=False)
class Meta:
db_table = 'extract_transform_load_user_history'
class User(AbstractUser):
......@@ -372,33 +453,25 @@ class BaseHeader(models.Model):
Company,
on_delete=models.PROTECT,
to_field='code')
requested_to_department = models.ForeignKey(
Department,
on_delete=models.PROTECT,
to_field='code')
requested_to_user = models.ForeignKey(
User,
on_delete=models.PROTECT,
to_field='code')
requested_to_template_name = models.CharField(max_length=255)
requested_to_objective = models.CharField(
max_length=255,
blank=True,
null=True)
requested_to_priority = models.CharField(max_length=255)
description = models.CharField(
max_length=255,
blank=True,
null=True)
created = models.DateTimeField(auto_now_add=True)
is_active = models.BooleanField(default=True)
class Meta:
......@@ -407,15 +480,18 @@ class BaseHeader(models.Model):
class BaseApprover(models.Model):
level = models.IntegerField()
user = models.ForeignKey(
User,
blank=True,
null=True,
on_delete=models.PROTECT,
to_field='code')
delegation = models.CharField(max_length=50, blank=True, null=True)
delegation = models.ForeignKey(
Delegation,
blank=True,
null=True,
on_delete=models.CASCADE,
to_field='code')
created = models.DateTimeField(
blank=True,
null=True)
......@@ -449,15 +525,29 @@ class MasterAttachment(models.Model):
blank=True,
null=True)
attch_ref = models.TextField()
def delete(self,*args,**kwargs):
print(self.url.name)
if os.path.isfile(self.url.path):
os.remove(self.url.path)
super(MasterAttachment, self).delete(*args,**kwargs)
class Meta:
db_table = 'master_attachments'
def delete(self, *args, **kwargs):
# self.url.delete()
# super().delete(*args, **kwargs)
os.remove(os.path.join(settings.MEDIA_ROOT, self.url.name))
super(MasterAttachment, self).delete(*args, **kwargs)
class BaseAttachment(models.Model):
attachment_type = models.CharField(max_length=255)
attachment_name = models.CharField(max_length=255)
file_name = models.CharField(
max_length=255,
blank=True,
......@@ -494,7 +584,6 @@ class BaseDetails(models.Model):
blank=True,
null=True
)
created = models.DateTimeField(
blank=True,
null=True)
......@@ -513,23 +602,19 @@ class ChangeRequestTemplateHeader(BaseHeader):
template_no = models.CharField(
unique=True,
max_length=255)
requested_to_template_id = models.CharField(
max_length=255,
unique=True)
created_by_user = models.ForeignKey(
User,
on_delete=models.PROTECT,
to_field='code',
related_name='created_by_user')
created_by_department = models.ForeignKey(
Department,
on_delete=models.PROTECT,
to_field='code',
related_name='created_by_department')
requested_to_target_date = models.IntegerField()
class Meta:
......@@ -569,6 +654,9 @@ class ChangeRequestTemplateApprovers(BaseApprover):
null=True,
on_delete=models.PROTECT,
to_field='code')
is_default = models.BooleanField(
default=False
)
class Meta:
db_table = 'change_request_template_approvers'
......@@ -699,7 +787,6 @@ class ChangeRequestFormHeader(BaseHeader):
on_delete=models.PROTECT,
to_field='template_no')
status = models.CharField(max_length=50)
company_desc = models.CharField(
max_length=255,
null=True,
......@@ -821,7 +908,7 @@ class ChangeRequestFormStakeHolders(BaseStakeholder):
date_added = models.DateTimeField(
blank=True,
null=True)
class Meta:
db_table = 'change_request_form_stakeholders'
......@@ -1022,9 +1109,10 @@ class AllowedCompany(models.Model):
create_change_request = models.BooleanField(default=True)
create_change_request_template = models.BooleanField(default=True)
view_all_change_request = models.BooleanField(default=True)
approve_cr = models.BooleanField(default=False)
created_at = models.DateTimeField(auto_now_add=True)
deleted_at = models.DateTimeField(null=True, blank=True)
class Meta:
db_table = 'allowed_company'
unique_together = ['company_pivot', 'group_pivots', 'id_number']
......@@ -1052,9 +1140,15 @@ class ReminderTrigger(models.Model):
blank=True)
is_sent = models.BooleanField(
default=False)
form_code = models.ForeignKey(
ChangeRequestFormHeader,
on_delete=models.PROTECT,
to_field='form_code',
null=True,
blank=True)
class Meta:
db_table = 'reminder_trigger'
db_table = 'trigger_reminder'
class CancelTrigger(models.Model):
......@@ -1065,7 +1159,9 @@ class CancelTrigger(models.Model):
frm_approver = models.ForeignKey(
ChangeRequestFormApprovers,
on_delete=models.PROTECT,
to_field='code')
to_field='code',
blank=True,
null=True)
auto_cancel_date = models.DateTimeField(
null=True,
blank=True)
......@@ -1074,9 +1170,13 @@ class CancelTrigger(models.Model):
date_submitted_last_approver = models.DateTimeField(
null=True,
blank=True)
cancel_type = models.CharField(
null=True,
blank=True,
max_length=255)
class Meta:
db_table = 'cancel_trigger'
db_table = 'trigger_cancel'
class OverdueTrigger(models.Model):
......@@ -1091,7 +1191,7 @@ class OverdueTrigger(models.Model):
default=False)
class Meta:
db_table = 'overdue_trigger'
db_table = 'trigger_overdue'
"""
......@@ -1116,6 +1216,7 @@ class AssetGroup(models.Model):
class Meta:
db_table = 'asset_groups'
ordering = ['-created']
def __str__(self):
return f'{self.code}'
......
......@@ -13,7 +13,7 @@ def error_safe(function):
def wrap(request, *args, **kwargs):
stat = status.HTTP_500_INTERNAL_SERVER_ERROR
try:
return function(request, *args, **kwargs)
return function(request, *args, **kwargs)
# except 'DoesNotExist' as ex:
# print('ddd')
# stat = status.HTTP_404_NOT_FOUND
......@@ -145,7 +145,8 @@ class rms:
@wraps(function)
def wrapper(self, request, *args, **kwargs):
if rms.user_type(self) == rms.enums_company:
if rms.user_type(self) == rms.enums_company or rms.user_type(self) == rms.enums_department:
id = rms.user(self).department.company.id
self.queryset = self.queryset.filter(
......
This diff is collapsed.
<!DOCTYPE html>
<html>
<head>
<title>RMS: Change Request Cancelled</title>
</head>
<body style="font-family: arial;">
<h3>Resource Management System &#40;RMS&#41;</h3>
<h3 style="color:#888888;">Change Request Cancelled</h3><br>
<p>Dear {name},</p><br>
<p>A change request has been cancelled. Please see the details of the change request below.</p><br>
<b>Cancelled By</b><br>{action_by}<br><br>
<b>Routing Level</b><br>{routing_level}<br><br>
<b>Status</b><br>{status}<br><br><br>
<b>CR Number</b><br>{cr_number}<br><br>
<b>CR Name</b><br>{cr_name}<br><br>
<b>Company Requested To</b><br>{company_requestedto}<br><br>
<b>Department Requested To</b><br>{department_requestedto}<br><br>
<b>Priority Level</b><br>{priority_level}<br><br>
<p>Please click <u><a href="{url}" style="text-decoration:underline;color:#007bff;" target="_blank">here</a></u> to access your change request.</p><br>
<p>Sincerely,</p>
<p>RMS Team</p><br><br>
<p>Powered by</p>
<img src="https://s3-ap-southeast-1.amazonaws.com/oneberry/img/logo_oneberry.png" class="img-responsive" style="width:150px;height:auto;" />
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>RMS: Change Request Rejected</title>
</head>
<body style="font-family: arial;">
<h3>Resource Management System &#40;RMS&#41;</h3>
<h3 style="color:#888888;">Change Request Rejected</h3><br>
<p>Dear {name},</p><br>
<p>A change request you have previously approved, has been re-submitted for your approval. Please see the details of the change request below.</p><br>
<b>Rejected By</b><br>{action_by}<br><br>
<b>Routing Level</b><br>{routing_level}<br><br>
<b>Status</b><br>{status}<br><br><br>
<b>CR Number</b><br>{cr_number}<br><br>
<b>CR Name</b><br>{cr_name}<br><br>
<b>Company Requested To</b><br>{company_requestedto}<br><br>
<b>Department Requested To</b><br>{department_requestedto}<br><br>
<b>Priority Level</b><br>{priority_level}<br><br>
<b>Remarks</b><br>{remarks}<br><br>
<p>Please click <u><a href="{url}" style="text-decoration:underline;color:#007bff;" target="_blank">here</a></u> to access your change request.</p><br>
<p>Sincerely,</p>
<p>RMS Team</p><br><br>
<p>Powered by</p>
<img src="https://s3-ap-southeast-1.amazonaws.com/oneberry/img/logo_oneberry.png" class="img-responsive" style="width:150px;height:auto;" />
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>RMS: Change Request Rejected</title>
</head>
<body style="font-family: arial;">
<h3>Resource Management System &#40;RMS&#41;</h3>
<h3 style="color:#888888;">Change Request Rejected</h3><br>
<p>Dear {name},</p><br>
<p>A change request has been submitted for your acknowledgement to revise. Please see the details of the change request below.</p><br>
<b>Rejected By</b><br>{action_by}<br><br>
<b>Routing Level</b><br>{routing_level}<br><br>
<b>Status</b><br>{status}<br><br><br>
<b>CR Number</b><br>{cr_number}<br><br>
<b>CR Name</b><br>{cr_name}<br><br>
<b>Company Requested To</b><br>{company_requestedto}<br><br>
<b>Department Requested To</b><br>{department_requestedto}<br><br>
<b>Priority Level</b><br>{priority_level}<br><br>
<b>Remarks</b><br>{remarks}<br><br>
<p>Please click <u><a href="{url}" style="text-decoration:underline;color:#007bff;" target="_blank">here</a></u> to access your change request.</p><br>
<p>Sincerely,</p>
<p>RMS Team</p><br><br>
<p>Powered by</p>
<img src="https://s3-ap-southeast-1.amazonaws.com/oneberry/img/logo_oneberry.png" class="img-responsive" style="width:150px;height:auto;" />
</body>
</html>
\ No newline at end of file
* {
box-sizing: border-box;
padding: 0;
margin: 0;
}
body {
font-family: Arial, Helvetica, sans-serif;
margin: 30px 200px 30px 200px;
font-size: 20px;
color: #8B8B8B
}
h1 {
padding-bottom: 80px;
font-size: 24px;
font-weight: 400;
}
h2 {
font-size: 22px;
font-weight: 400;
margin-bottom: 20px;
}
h3 {
font-size: 21px;
font-weight: 400;
margin-bottom: 20px;
margin-top: 20px;
}
.requested-to {
margin-top: 20px;
}
.input {
margin-bottom: 50px;
}
label {
font-size: 19px;
font-weight: 700;
color: #737373;
}
input {
display: block;
width: 500px;
color: #8B8B8B;
font-size: 19px;
border: none;
padding-top: 20px;
margin-bottom: 10px;
border-bottom: 2px #919191 solid;
}
table, th, td {
border-bottom: 1px solid #8B8B8B;
border-collapse: collapse;
}
th {
text-align: left;
}
tr {
border-bottom: 1px solid black;
}
td {
padding: 8px;
}
.table {
margin-top: 100px;
font-size: 16px;
padding: 50px;
background-color: #F2F2F2;
border-radius: 25px;
}
\ No newline at end of file
......@@ -48,6 +48,9 @@ REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLE
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']
......
......@@ -45,6 +45,9 @@ REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLE
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['LOCAL']['CATCH_EMAIL']
......
......@@ -48,6 +48,9 @@ REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLE
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['PRODUCTION']['CATCH_EMAIL']
......
......@@ -47,6 +47,9 @@ REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLE
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']
......
......@@ -48,6 +48,9 @@ REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLE
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['UAT']['CATCH_EMAIL']
......
......@@ -22,8 +22,6 @@ from django.conf import settings
from django.conf.urls.static import static
urlpatterns = [
# path('admin/', admin.site.urls),
path('api-auth/', include('rest_framework.urls')),
......
......@@ -10,9 +10,8 @@ FRONT_END_URL =
AUTH_ACCESSS_TOKEN_TIMEOUT =
USER_DEFAULT_PASSWORD =
CATCH_EMAIL = gladys@tirsolutions.com
CR_LINK = http://stagingrms.oneberrysystem.com/cms/change-request/form/view
CR_LINK = http://staging.rms.oneberrysystem.com/cms/change-request/form/view
REALTIMESERVER_IP = 127.0.0.1:8000
CORS_ORIGIN_ALLOW_ALL = False
[UAT]
DATABASE_ENGINE = django.db.backends.mysql
......@@ -22,13 +21,12 @@ DATABASE_PASSWORD =
DATABASE_HOST =
DATABASE_PORT =
SESSION_TIMEOUT =
FRONT_END_URL = http://stagingrms.oneberrysystem.com
FRONT_END_URL = http://staging.rms.oneberrysystem.com
AUTH_ACCESSS_TOKEN_TIMEOUT =
USER_DEFAULT_PASSWORD =
CATCH_EMAIL = gladys@tirsolutions.com
CR_LINK = http://stagingrms.oneberrysystem.com/cms/change-request/form/view
CR_LINK = http://staging.rms.oneberrysystem.com/cms/change-request/form/view
REALTIMESERVER_IP = 127.0.0.1:8000
CORS_ORIGIN_ALLOW_ALL = False
[DEV]
DATABASE_ENGINE = django.db.backends.mysql
......@@ -44,7 +42,6 @@ USER_DEFAULT_PASSWORD =
CATCH_EMAIL = gladys@tirsolutions.com
CR_LINK = http://devweb.rmsv2.oneberrysystem.com/cms/change-request/form/view
REALTIMESERVER_IP = 127.0.0.1:8000
CORS_ORIGIN_ALLOW_ALL = True
[STAGING]
......@@ -54,21 +51,20 @@ DATABASE_USER =
DATABASE_PASSWORD =
DATABASE_HOST =
DATABASE_PORT =
SESSION_TIMEOUT = 30
FRONT_END_URL = http://stagingrms.oneberrysystem.com
SESSION_TIMEOUT =
FRONT_END_URL = http://staging.rms.oneberrysystem.com
AUTH_ACCESSS_TOKEN_TIMEOUT = 3600
USER_DEFAULT_PASSWORD = password
CATCH_EMAIL = gladys@tirsolutions.com
CR_LINK = http://stagingrms.oneberrysystem.com/cms/change-request/form/view
CATCH_EMAIL =
CR_LINK = http://staging.rms.oneberrysystem.com/cms/change-request/form/view
REALTIMESERVER_IP = 127.0.0.1:8000
CORS_ORIGIN_ALLOW_ALL = False
[LOCAL]
DATABASE_ENGINE = django.db.backends.mysql
DATABASE_NAME = rms_db
DATABASE_USER = root
DATABASE_PASSWORD = password
DATABASE_PASSWORD = 123
DATABASE_HOST = localhost
DATABASE_PORT = 3306
SESSION_TIMEOUT = 30
......@@ -78,10 +74,10 @@ 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
CORS_ORIGIN_ALLOW_ALL = True
[SETTINGS]
CONFIG = config.settings.staging
CONFIG = config.settings.local
BATCH_UPLOAD_FORMAT_FILENAME = instruction.pdf
[NOTIFICATION_EMAIL]
APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED
......@@ -92,3 +88,6 @@ REQUESTOR_ACKNOWLEDGE_MESSAGE = has ACKNOWLEDGED the change request;RMS-CRACKNOW
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
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment