Commit 16067611 authored by John Red Medrano's avatar John Red Medrano

Merge branch 'core-demo' into 'core-staging'

# Conflicts:
#   app/applicationlayer/management/account/serializer.py
parents 4ccc9549 7ba7e4bc
...@@ -33,7 +33,7 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet): ...@@ -33,7 +33,7 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
) )
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
# hello again
queryset = self.filter_queryset(self.get_queryset()) queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
......
from rest_framework import serializers
from app.entities.models import ChangeRequestSettings
from app.applicationlayer.utils import model_to_dict
class ChangeRequestSettingsSerializer(serializers.ModelSerializer):
def to_representation(self, instance):
ret = super().to_representation(instance)
if instance.behalf_user:
behalf_user_object = {
"id": instance.behalf_user.id,
"name": instance.behalf_user.name,
"username": instance.behalf_user.username,
"code": instance.behalf_user.code,
"email": instance.behalf_user.email,
"contact_no": instance.behalf_user.contact_no
}
ret['behalf_user'] = behalf_user_object
return ret
class Meta:
model = ChangeRequestSettings
fields = '__all__'
read_only_fields = ['created', 'code']
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestSettings
class ChangeRequestSettingsFilterSet(filters.FilterSet):
class Meta:
model = ChangeRequestSettings
fields = '__all__'
from rest_framework import status, viewsets
from rest_framework.response import Response
from app.entities import enums
from app.entities.models import ChangeRequestSettings, User
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from app.applicationlayer.cms.cms_settings.serializer import (
ChangeRequestSettingsSerializer
)
from app.applicationlayer.cms.cms_settings.table_filter import (
ChangeRequestSettingsFilterSet
)
from django.db import transaction
from rest_framework.exceptions import ValidationError
from django.db import IntegrityError
from app.applicationlayer.utils import (
main_threading, log_save, model_to_dict,
CustomPagination,status_message_response
)
from app.helper.email_service import sender
from app.applicationlayer.utils import error_message
class CMSSettingsViewSet(viewsets.ModelViewSet):
queryset = ChangeRequestSettings.objects.all()
serializer_class = ChangeRequestSettingsSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = ChangeRequestSettingsFilterSet
ordering_fields = '__all__'
search_fields = (
'active_user__code',
'behalf_user__code'
)
def list(self, request, *args, **kwargs):
logged_user = self.request.user.code
queryset = self.filter_queryset(
self.get_queryset().filter(active_user=logged_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 CMS Settings found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(
serializer.data,
status=status.HTTP_200_OK
)
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
logged_user = self.request.user.name
new_instance = model_to_dict(instance)
# behalf = ChangeRequestSettings.objects.filter(code=str(instance)).first()
behalf_name = instance.behalf_user.name
behalf_email = instance.behalf_user.email
self.perform_destroy(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.ChangeRequestSettings.value,
new_instance['id'],
new_instance,
''
)
active_user = self.request.user.name
admin = request.user.email
linking_verb = 'as'
args = [behalf_name, 'Removed', active_user, behalf_email, admin, linking_verb]
main_threading(args, sender.on_behalf)
return Response(status=status.HTTP_204_NO_CONTENT)
@transaction.atomic
def create(self, request, *args, **kwargs):
try:
logged_user = self.request.user.code
data_cms_settings = []
behalf_user_list = []
cms_settings = request.data['cms_settings']
for cms_setting in cms_settings:
if cms_setting['behalf_user'] in behalf_user_list:
return error_message('400', 'Please make sure to add unique on behalf users',
'failed', status.HTTP_400_BAD_REQUEST)
else:
behalf_user_list.append(cms_setting['behalf_user'])
cms_setting['active_user'] = logged_user
data_cms_settings.append(cms_setting)
serializer = ChangeRequestSettingsSerializer(
data=data_cms_settings, many=True
)
ChangeRequestSettings.objects.filter(
active_user=logged_user
).delete()
active_user = self.request.user.name
action = 'Added'
admin = request.user.email
linking_verb = 'on'
for data in data_cms_settings:
recipient = User.objects.get(
code=str(data['behalf_user'])
)
args = [recipient.name, action, active_user, recipient.email, admin, linking_verb]
main_threading(args, sender.on_behalf)
if serializer.is_valid(raise_exception=True):
serializer.save()
message = {
'code': 201,
'status': 'success',
'message': 'CMS Settings successfully saved!',
'results': serializer.data
}
return Response(message, status=status.HTTP_201_CREATED)
except ValidationError as e:
message = {
'code': 400,
'status': 'failed',
'message': str(e),
}
return Response(message, status=status.HTTP_400_BAD_REQUEST)
except Exception as e:
message = {
'code': 500,
'status': 'failed',
'message': str(e),
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
...@@ -213,7 +213,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -213,7 +213,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
request.query_params.get('date_required_to'), request.query_params.get('date_required_to'),
request.query_params.get('form_type'), 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()
...@@ -221,7 +220,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -221,7 +220,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
overdue_filtered = change_request.filter_overdue(self.queryset) overdue_filtered = change_request.filter_overdue(self.queryset)
overdue = overdue_filtered.count() overdue = overdue_filtered.count()
message = { message = {
'account_no': id_number, 'account_no': id_number,
'pending': pending, 'pending': pending,
...@@ -555,8 +553,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -555,8 +553,8 @@ 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)
for file_name in attch: for file_name in attch:
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)
...@@ -704,6 +702,22 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -704,6 +702,22 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
self.perform_update(serializer) self.perform_update(serializer)
new_instance = serializer.data new_instance = serializer.data
original_user = new_instance['user']['code']
if original_user == current_user:
data_update = {
"on_behalf": None
}
else:
data_update = {
"on_behalf": {
'code': self.request.user.code,
'name': self.request.user.name
}
}
new_instance = {**new_instance, **data_update}
crhistory_save( crhistory_save(
batchno, batchno,
enums.CREnum.ACTION.value, enums.CREnum.ACTION.value,
...@@ -714,7 +728,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -714,7 +728,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
new_instance new_instance
) )
change_request.cr_routing_actions(new_instance, current_user, move_to_level) # change_request.cr_routing_actions(new_instance, current_user, move_to_level)
change_request.cr_routing_actions(new_instance, original_user, move_to_level)
# ---------------- removed code # ---------------- removed code
message = status_message_response( message = status_message_response(
200, 'success', 200, 'success',
...@@ -1060,6 +1075,18 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -1060,6 +1075,18 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
data = data['toValue'].replace("'", '"').replace('None', '""').replace('True', '""').replace('False', '""') data = data['toValue'].replace("'", '"').replace('None', '""').replace('True', '""').replace('False', '""')
convert = json.loads(data) convert = json.loads(data)
try:
if convert['on_behalf'] and not convert['on_behalf'] == None:
# format: Rejected on behalf by Rita Fantilga
on_behalf = (
convert['action'].capitalize() +
' on behalf by ' +
convert['on_behalf']['name'])
else:
on_behalf = None
except Exception as e:
on_behalf = None
history_dict = { history_dict = {
"name": convert['user']['name'], "name": convert['user']['name'],
"department" : convert['department']['name'], "department" : convert['department']['name'],
...@@ -1068,6 +1095,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet): ...@@ -1068,6 +1095,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
"delegation" : convert['delegation'], "delegation" : convert['delegation'],
"action" : convert['action'], "action" : convert['action'],
"remarks" : convert['remarks'], "remarks" : convert['remarks'],
"on_behalf": on_behalf,
"created": convert['action_date'] "created": convert['action_date']
} }
...@@ -1370,4 +1398,3 @@ class ChangeRequestFormPost(APIView): ...@@ -1370,4 +1398,3 @@ class ChangeRequestFormPost(APIView):
} }
return Response(message, return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR) status=status.HTTP_500_INTERNAL_SERVER_ERROR)
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
from django.db.models import Q
from app.applicationlayer.cms.form.approver.serializers import ChangeRequestFormApproversSerializer
from app.applicationlayer.cms.form.stakeholder.serializers import ChangeRequestFormStakeHoldersSerializer
from app.applicationlayer.cms.form.details.serializers import ChangeRequestFormDetailsSerializer
from app.applicationlayer.cms.form.attachment.serializers import ChangeRequestFormAttachmentsSerializer
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(is_action=True) &
Q(user=id_number)
).order_by('level')
if current_level.count() > 0: # and 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_required'] = approver
requested_to_user = {
"id": instance.requested_to_user.id,
"name": instance.requested_to_user.name,
"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
}
requested_by_user = {
"id": instance.requested_by_user.id,
"name": instance.requested_by_user.name,
"username": instance.requested_by_user.username,
"code": instance.requested_by_user.code,
"email": instance.requested_by_user.email,
"contact_no": instance.requested_by_user.contact_no
}
ret['requested_to_company'] = {
"id": instance.requested_to_company.id,
"code": instance.requested_to_company.code,
"name": instance.requested_to_company.name
}
ret['requested_to_department'] = {
"id": instance.requested_to_department.id,
"code": instance.requested_to_department.code,
"name": instance.requested_to_department.name
}
ret['requested_to_user'] = requested_to_user
ret['requested_by_user'] = requested_by_user
ret['requested_by_department'] = {
"id": instance.requested_by_department.id,
"code": instance.requested_by_department.code,
"name": instance.requested_by_department.name
}
ret['template_object'] = model_to_dict(instance.template_no)
return ret
except Exception as e:
ret['action_required'] = "None"
ret['requested_to_company'] = "None"
ret['requested_to_department'] = "None"
ret['requested_to_user'] = "None"
ret['requested_by_user'] = "None"
ret['requested_by_department'] = "None"
ret['template_object'] = "None"
return ret
class Meta:
model = models.ChangeRequestFormHeader
fields = ('form_code', 'requested_to_template_name', 'requested_to_objective',
'requested_to_target_date', 'requested_to_priority',
'description', 'created', 'cancel_date', 'status',
'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
active_users = models.ChangeRequestSettings.objects.filter(
behalf_user=id_number).values('active_user__code')
current_level = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=ret['form_code']) &
Q(is_action=True) &
Q(user__in=active_users)
).order_by('level')
if current_level.count() > 0:
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_required'] = approver
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['requested_by'] = instance.requested_by_user.name
if instance.status.lower() == 'draft':
existing_transaction = models.ChangeRequestHistory.objects.filter(
form_code=instance.form_code
)
if existing_transaction.count() > 0:
can_delete = False
else:
can_delete = True # hard delete
elif instance.status.lower() == 'cancelled':
can_delete = False
else:
can_delete = None
ret['can_delete'] = can_delete
return ret
except Exception as e:
ret['action_required'] = "No"
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
from django_filters import rest_framework as filters
from app.entities.models import ChangeRequestFormHeader
class HeaderFilterSet(filters.FilterSet):
class Meta:
model = ChangeRequestFormHeader
fields = '__all__'
\ No newline at end of file
import os
from rest_framework import viewsets
from app.entities import models
from rest_framework.response import Response
from rest_framework import status, views
from django.db.models import Q
from app.applicationlayer.utils import (QuerySetHelper,
status_message_response)
from app.businesslayer.changerequest import change_request
from app.entities import enums
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from app.applicationlayer.cms.form.onbehalf.serializers import (
ChangeRequestFormHeaderSerializer,
ChangeRequestFormHeaderSerializerList)
from app.applicationlayer.cms.form.onbehalf.table_filters import HeaderFilterSet
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
class ChangeRequestFormsViewset(viewsets.ModelViewSet):
queryset = models.ChangeRequestFormHeader.objects.select_related(
'requested_by_user', 'requested_by_department', 'template_no'
).all()
serializer_class = ChangeRequestFormHeaderSerializer
pagination_class = CustomPagination
lookup_field = 'form_code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = HeaderFilterSet
ordering_fields = (
'form_code',
'requested_to_template_id',
'requested_to_user__name',
'requested_to_department__company__name',
'requested_to_department__name',
'requested_by_user__name',
'status',
'requested_to_priority',
'created',
'requested_to_target_date'
)
search_fields = (
"form_code", "status", "requested_to_template_id", "requested_by_user__name",
"requested_by_user__code", "requested_by_department__name",
"requested_to_company__name", "requested_to_department__name",
"requested_to_user__name", "requested_to_template_name",
"requested_to_objective", "requested_to_priority", "description"
)
def list(self, request, *args, **kwargs):
self.serializer_class = ChangeRequestFormHeaderSerializerList
behalf_user = self.request.user.code
user_active_included = []
active_users = models.ChangeRequestSettings.objects.filter(
behalf_user=behalf_user)
for active_user in active_users:
user_active_included.append(active_user.active_user.code)
self.queryset = change_request.list_by_onbehalf_without_dept(
user_active_included)
self.queryset = change_request.filter_onbehalf_crlist(
self.queryset,
user_active_included)
# 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'),
# )
queryset = self.filter_queryset(self.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 Change Request Forms for on behalf 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):
id_number = self.request.user.code
form_code = kwargs['form_code']
instance = self.get_object()
serializer = self.get_serializer(instance)
return Response(serializer.data)
...@@ -45,12 +45,26 @@ class ChangeRequestTemplatesSerializer( ...@@ -45,12 +45,26 @@ class ChangeRequestTemplatesSerializer(
"code": instance.requested_to_department.code, "code": instance.requested_to_department.code,
"name": instance.requested_to_department.name "name": instance.requested_to_department.name
} }
created_by_user_object = {
"id": instance.created_by_user.id,
"name": instance.created_by_user.name,
"username": instance.created_by_user.username,
"code": instance.created_by_user.code,
"email": instance.created_by_user.email,
"contact_no": instance.created_by_user.contact_no,
"company_code": instance.created_by_user.department.company.code,
"company_name": instance.created_by_user.department.company.name,
"department_code": instance.created_by_user.department.code,
"department_name": instance.created_by_user.department.name
}
ret['requested_to_user'] = requested_to_user_object ret['requested_to_user'] = requested_to_user_object
ret['company'] = instance.requested_to_company.name ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name ret['created_by_user'] = created_by_user_object
return ret return ret
...@@ -59,11 +73,11 @@ class ChangeRequestTemplatesSerializer( ...@@ -59,11 +73,11 @@ class ChangeRequestTemplatesSerializer(
ret['requested_to_company'] = "none" ret['requested_to_company'] = "none"
ret['requested_to_department'] = "none" ret['requested_to_department'] = "none"
ret['requested_to_user'] = "none" ret['requested_to_user'] = "none"
ret['created_by_user'] = "none"
ret['company'] = "none" ret['company'] = "none"
ret['department'] = "none" ret['department'] = "none"
ret['point_of_contact'] = "none" ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret return ret
...@@ -87,7 +101,10 @@ class ChangeRequestTemplatesSerializerList( ...@@ -87,7 +101,10 @@ class ChangeRequestTemplatesSerializerList(
def to_representation(self, instance): def to_representation(self, instance):
ret = super().to_representation(instance) ret = super().to_representation(instance)
try: try:
current_user = self.context['request'].user.code
ret['company'] = instance.requested_to_company.name ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name ret['point_of_contact'] = instance.requested_to_user.name
...@@ -96,18 +113,21 @@ class ChangeRequestTemplatesSerializerList( ...@@ -96,18 +113,21 @@ class ChangeRequestTemplatesSerializerList(
template_no=instance.template_no template_no=instance.template_no
) )
can_delete = '' can_delete = ''
owned_template = ''
if child.count() > 0: if instance.created_by_user.code == current_user:
owned_template = True
else:
owned_template = False
if child.count() > 0:
can_delete = False can_delete = False
else: else:
can_delete = True can_delete = True
ret['can_delete'] = can_delete ret['can_delete'] = can_delete
ret['owned_template'] = owned_template
return ret return ret
except Exception as e: except Exception as e:
......
...@@ -21,7 +21,8 @@ from app.applicationlayer.cms.utils_cr import ( ...@@ -21,7 +21,8 @@ from app.applicationlayer.cms.utils_cr import (
) )
from app.businesslayer.changerequest.change_request_template import ( from app.businesslayer.changerequest.change_request_template import (
tmp_add_edit_delete tmp_add_edit_delete,
list_by_dept_privilege
) )
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
...@@ -68,11 +69,11 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet): ...@@ -68,11 +69,11 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
queryset = queryset.filter(created_by_user=request.user.code,
is_active=True)
self.serializer_class = ChangeRequestTemplatesSerializerList self.serializer_class = ChangeRequestTemplatesSerializerList
id_number = self.request.user.code
self.queryset = list_by_dept_privilege(id_number)
queryset = self.filter_queryset(self.queryset)
page = self.paginate_queryset(queryset) page = self.paginate_queryset(queryset)
...@@ -82,7 +83,7 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet): ...@@ -82,7 +83,7 @@ class ChangeRequestTemplatesViewset(viewsets.ModelViewSet):
message = status_message_response( message = status_message_response(
200, 200,
'success', 'success',
'List of Templates found', 'List of Change Request Template found',
serializer.data serializer.data
) )
......
...@@ -5,6 +5,7 @@ from rest_framework.urlpatterns import format_suffix_patterns ...@@ -5,6 +5,7 @@ from rest_framework.urlpatterns import format_suffix_patterns
from app.applicationlayer.cms.allowed_company import views as allowed from app.applicationlayer.cms.allowed_company import views as allowed
from app.applicationlayer.cms.cms_settings import views as cms_settings
# MASTERS Form # MASTERS Form
from app.applicationlayer.cms.master.template.company.views import ChangeRequestCompanyTemplateViewSet from app.applicationlayer.cms.master.template.company.views import ChangeRequestCompanyTemplateViewSet
...@@ -45,6 +46,8 @@ from app.applicationlayer.cms.auto_email import reminder, overdue, cancel ...@@ -45,6 +46,8 @@ from app.applicationlayer.cms.auto_email import reminder, overdue, cancel
from app.applicationlayer.cms.form.download import views as dl from app.applicationlayer.cms.form.download import views as dl
from app.applicationlayer.cms.form.onbehalf import views as onbehalf
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'template', header.ChangeRequestTemplatesViewset) router.register(r'template', header.ChangeRequestTemplatesViewset)
...@@ -61,8 +64,11 @@ router.register(r'form-details', detailsform.ChangeRequestFormDetailsViewset) ...@@ -61,8 +64,11 @@ router.register(r'form-details', detailsform.ChangeRequestFormDetailsViewset)
router.register(r'form-download', dl.DownloadRequest) router.register(r'form-download', dl.DownloadRequest)
router.register(r'form-onbehalf', onbehalf.ChangeRequestFormsViewset)
# privilege CMS # privilege CMS
router.register(r'allowed-companies', allowed.AllowedCompanyViewSet) router.register(r'allowed-companies', allowed.AllowedCompanyViewSet)
router.register(r'cms-settings', cms_settings.CMSSettingsViewSet)
# privilege CMS # privilege CMS
# filter endpoints under Allowed Companies table # filter endpoints under Allowed Companies table
......
...@@ -817,6 +817,51 @@ def cancelled_user_trigger(form_code, ...@@ -817,6 +817,51 @@ def cancelled_user_trigger(form_code,
sender_code, 'cms') sender_code, 'cms')
def send_email_onbehalf(active_user, behalf_usernext_level):
# get details of next approver/s
next_approver = models.ChangeRequestFormApprovers.objects.filter(
level=str(next_level),
form_code=form_code
)
# LOOP on next approver for sending email
for n_approver in next_approver:
# NOTIF MSG FOR NEXT APPROVER
msg = APPROVER_MESSAGE.split(';')[0]
if n_approver.delegation.name.lower() == 'vendor/implementor':
msg = VENDOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
# next approver details --------------------------------------------------
receiver_instance = get_account_details(n_approver.user.code)
receiver_name = receiver_instance.values_list('name', flat=True)[0]
receiver_email = receiver_instance.values_list('email', flat=True)[0]
receiver_code = receiver_instance.values_list('code', flat=True)[0]
# call sender email
name = receiver_name
cr_number = cr_number
cr_name = template_name
company_requestedto = company_name
department_requestedto = dept_name
priority_level = requested_to_priority
status = cr_status
url = cr_link
recipient = receiver_email
delegation_type = n_approver.delegation.name.lower()
delegation_recipient = 'None'
admin = sender_email
args = [name, cr_number, cr_name,
company_requestedto, department_requestedto, priority_level,
status, url, recipient, delegation_type,
delegation_recipient, admin]
main_threading(args, sender.routing_table_actions_required)
def delete_master_attachment_file(attachments): def delete_master_attachment_file(attachments):
# delete master attachment data and media file attachments # delete master attachment data and media file attachments
for attachment in attachments: for attachment in attachments:
......
...@@ -22,7 +22,6 @@ class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet): ...@@ -22,7 +22,6 @@ class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
permission_classes = (AllowAny,) permission_classes = (AllowAny,)
def list(self, request, *args, **kwargs): def list(self, request, *args, **kwargs):
#comment this line
user_type = self.request.user.user_type user_type = self.request.user.user_type
company = self.request.user.department.company.code company = self.request.user.department.company.code
department = self.request.user.department.code department = self.request.user.department.code
......
...@@ -8,12 +8,21 @@ from app.entities import enums ...@@ -8,12 +8,21 @@ from app.entities import enums
from django.db.models import Q from django.db.models import Q
from app.applicationlayer.management.module.serializer import ModuleSerializer 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,
ChangeRequestSettings
) )
import os import os
import configparser import configparser
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
import os
import configparser
config = configparser.ConfigParser() config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini') config_file = os.path.join('./', 'env.ini')
config.read(config_file) config.read(config_file)
...@@ -25,12 +34,13 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer): ...@@ -25,12 +34,13 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
department = serializers.SerializerMethodField() department = serializers.SerializerMethodField()
company = serializers.SerializerMethodField() company = serializers.SerializerMethodField()
cms_privilege = serializers.SerializerMethodField() cms_privilege = serializers.SerializerMethodField()
my_successions = serializers.SerializerMethodField()
class Meta: class Meta:
model = User model = User
fields = ( fields = (
'id', 'id',
"cms_privilege", 'cms_privilege',
'code', 'name', 'code', 'name',
'username', 'contact_no', 'username', 'contact_no',
'image', 'company', 'image', 'company',
...@@ -38,10 +48,26 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer): ...@@ -38,10 +48,26 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
'email', 'default_app', 'email', 'default_app',
'user_type', 'is_active', 'user_type', 'is_active',
'doa', 'doa',
'my_successions',
) )
# exclude = ['password', 'application', 'groups', 'user_permissions'] # exclude = ['password', 'application', 'groups', 'user_permissions']
def get_my_successions(self, user):
data = user.cms_settings_behalf_users.filter(
behalf_user=user.code
).values(
'active_user__name', 'active_user__code',
"behalf_approved", 'behalf_accepted',
'behalf_rejected', 'behalf_implemented',
'behalf_completed'
)
return data
def get_department(self, user): def get_department(self, user):
data = { data = {
"id": user.department.id, "id": user.department.id,
...@@ -95,6 +121,7 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer): ...@@ -95,6 +121,7 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
} }
def get_image(self, user): def get_image(self, user):
request = self.context.get('request') request = self.context.get('request')
......
from rest_framework.views import APIView
from rest_framework import viewsets
from rest_framework.response import Response
from app.entities import enums
from app.applicationlayer.utils import main_threading
from app.helper.email_service import sender
from rest_framework.permissions import AllowAny
from app.entities.models import (
User, Company, Department
)
from app.applicationlayer.utils import CustomPagination
from app.entities import enums
from django.db.models import Count
class RMSDashBoardViewSet(APIView):
def get(self, request, format=None):
# try:
enums_company = enums.UserTypeEnum.COMPANY_USER_ADMIN.value
enums_department = enums.UserTypeEnum.DEPARTMENT_USER_ADMIN.value
enums_oua = enums.UserTypeEnum.OVERALL_USER_ADMIN.value
user_type = request.user.user_type
user_company = request.user.department.company.code
user_department = request.user.department.code
department_count = ''
company_count = ''
user_count = ''
arr_company = []
recently_company = {}
recently_users = User.objects.all().values(
'name',
'department__company__name',
'department__name',
'date_joined'
).order_by('-date_joined')
if user_type == enums_department:
company_count = 1
department_count = 1
user_count = User.objects.filter(
department=str(user_department)
).exclude(id=1).count()
recently_company['company_name'] = request.user.department.company.name
# recently_company['no_department'] = Department.objects.filter(
# code=str(user_department)
# ).exclude(id=1).count()
recently_company['no_department'] = 1
recently_company['no_users'] = user_count
recently_company['date_added'] = request.user.department.company.created
arr_company.append(recently_company)
recently_users = recently_users.filter(
department=str(user_department)
)
elif user_type == enums_company:
company_count = 1
user_count = User.objects.filter(
department__company=str(user_company)
).exclude(id=1).count()
department_count = Department.objects.filter(
company=str(user_company)
).exclude(id=1).count()
recently_company['company_name'] = request.user.department.company.name
recently_company['no_department'] = department_count
recently_company['no_users'] = User.objects.filter(
department__company__code=str(user_company)
).exclude(id=1).count()
recently_company['date_added'] = request.user.department.company.created
arr_company.append(recently_company)
recently_users = recently_users.filter(
department__company__code=str(user_company)
)
elif user_type == enums_oua:
company_count = Company.objects.count()
department_count = Department.objects.exclude(id=1).count()
user_count = User.objects.exclude(id=1).count()
companies = Company.objects.all().order_by('-created')[0:10]
for data in companies:
recently_company['company_name'] = data.name
recently_company['no_department'] = data.companies.exclude(id=1).count()
recently_company['no_users'] = User.objects.filter(
department__company__code=str(data.code)
).count()
recently_company['date_added'] = data.created
arr_company.append(recently_company)
recently_company = {}
else:
company_count = Company.objects.count()
companies = Company.objects.all().order_by('-created')[0:10]
department_count = Department.objects.count()
user_count = User.objects.all().count()
for data in companies:
recently_company['company_name'] = data.name
recently_company['no_department'] = data.companies.count()
recently_company['no_users'] = User.objects.filter(
department__company__code=str(data.code)
).count()
recently_company['date_added'] = data.created
arr_company.append(recently_company)
recently_company = {}
data = {
"company_count": company_count,
"department_count": department_count,
"user_count": user_count,
"recent_companies": arr_company,
"recent_users": recently_users[:10]
}
return Response(data)
data = {
"company_count": company_count,
"department_count": department_count,
"user_count": user_count,
"recent_companies": arr_company,
"recent_users": recently_users.exclude(id=1)[:10]
}
return Response(data)
# except Exception as e:
# return Response(
# {'message': "query params department_code and company_code are both expected"},
# status=status.HTTP_400_BAD_REQUEST
# )
...@@ -6,6 +6,7 @@ from app.applicationlayer.master.company.views import AdminCompanyViewSet ...@@ -6,6 +6,7 @@ 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.dashboard.views import RMSDashBoardViewSet
router = routers.DefaultRouter() router = routers.DefaultRouter()
router.register(r'users', AdminAccountViewSet) router.register(r'users', AdminAccountViewSet)
...@@ -16,4 +17,5 @@ router.register(r'attachments', MasterAttachmentViewSet) ...@@ -16,4 +17,5 @@ router.register(r'attachments', MasterAttachmentViewSet)
urlpatterns = [ urlpatterns = [
path('', include(router.urls)), path('', include(router.urls)),
url(r'^user-types/$', UserTypeViewSet.as_view(), name="user-types"), url(r'^user-types/$', UserTypeViewSet.as_view(), name="user-types"),
url(r'^dashboard/$', RMSDashBoardViewSet.as_view(), name="dashboard"),
] ]
...@@ -4,16 +4,14 @@ from rest_framework.response import Response ...@@ -4,16 +4,14 @@ from rest_framework.response import Response
from functools import wraps from functools import wraps
from app.entities import enums from app.entities import enums
from app.entities.models import EntityLog, Notification from app.entities.models import EntityLog, Notification
from django.conf import settings from django.conf import settings
from websocket import create_connection from websocket import create_connection
import json import json
from rest_framework import status from rest_framework import status
from rest_framework import serializers from rest_framework import serializers
import copy import copy
import json import json
import pusher from pusher import Pusher
import os import os
import configparser import configparser
...@@ -230,12 +228,6 @@ def notification_create(form_code, message, account_no, ...@@ -230,12 +228,6 @@ def notification_create(form_code, message, account_no,
ROOM = account_no ROOM = account_no
# SENDER = sender_account_no # SENDER = sender_account_no
# send_broadcast_message(
# ROOM,
# SENDER,
# 'NEW NOTIFICATIONS'
# )
if SSL != True: if SSL != True:
send_broadcast_message( send_broadcast_message(
ROOM, ROOM,
...@@ -248,6 +240,13 @@ def notification_create(form_code, message, account_no, ...@@ -248,6 +240,13 @@ def notification_create(form_code, message, account_no,
'cms-notification', 'cms-notification',
{'message': 'NEW NOTIFICATIONS'} {'message': 'NEW NOTIFICATIONS'}
) )
else:
send_broadcast_message(
ROOM,
SENDER,
'NEW NOTIFICATIONS'
)
return True return True
......
...@@ -100,6 +100,7 @@ def list_by_user_archived(user_id_number): ...@@ -100,6 +100,7 @@ def list_by_user_archived(user_id_number):
return return_queryset return return_queryset
def list_by_user_without_dept(user_id_number): def list_by_user_without_dept(user_id_number):
try: try:
return_queryset = models.ChangeRequestFormHeader.objects.filter( return_queryset = models.ChangeRequestFormHeader.objects.filter(
...@@ -809,4 +810,70 @@ def cr_routing_actions(approver_instance, current_user, move_to_level): ...@@ -809,4 +810,70 @@ def cr_routing_actions(approver_instance, current_user, move_to_level):
reset_autoemail_tables(form_code) reset_autoemail_tables(form_code)
return True
def filter_onbehalf_crlist(base_queryset,
user_id_number):
return_queryset = base_queryset
try:
on_behalf_included = []
for query in return_queryset:
next_approvers = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=query.form_code) &
Q(is_action=True)
).order_by("level")
for next_approver in next_approvers:
if next_approver.user.code in user_id_number:
on_behalf_included.append(query.form_code)
return_queryset = return_queryset.filter(
form_code__in=on_behalf_included
).exclude(
(Q(status__icontains='Rejected') |
Q(status__icontains='Completed & Accepted') |
Q(status__icontains='Cancelled') |
Q(status__icontains='Draft'))
)
except Exception as e:
pass
return return_queryset
def list_by_onbehalf_without_dept(user_id_number):
try:
return_queryset = models.ChangeRequestFormHeader.objects.filter(
(Q(frm_approvers__user__code__in=user_id_number) |
Q(frm_stakes__user__code__in=user_id_number) |
Q(requested_by_user__in=user_id_number)) &
Q(is_active=True)
).exclude(
Q(status__icontains='Draft') &
~Q(requested_by_user__in=user_id_number)
).distinct()
return return_queryset
except Exception as e:
return_queryset = None
return return_queryset
return True return True
...@@ -218,3 +218,25 @@ def validation_vendor_unique_level(approvers): ...@@ -218,3 +218,25 @@ def validation_vendor_unique_level(approvers):
if not approver['delegation'] == 'DELEGATION-20191119-0000002': if not approver['delegation'] == 'DELEGATION-20191119-0000002':
validate = approver['level'] validate = approver['level']
return validate return validate
def list_by_dept_privilege(user_id_number):
try:
priviledgeCrs = models.AllowedCompany.objects.filter(
Q(id_number=user_id_number) &
Q(view_all_change_request_template=True)
).values('group_pivots')
return_queryset = models.ChangeRequestTemplateHeader.objects.filter(
Q(is_active=True) &
(Q(created_by_user=user_id_number) |
Q(created_by_department__in=priviledgeCrs))
)
return return_queryset
except Exception as e:
return_queryset = None
return return_queryset
...@@ -32,6 +32,7 @@ class GenerateCode(Enum): ...@@ -32,6 +32,7 @@ class GenerateCode(Enum):
ETL = 'ETL' ETL = 'ETL'
ASSET_GROUP = 'AMSGRP' ASSET_GROUP = 'AMSGRP'
CMS_SETTINGS = "CMSSET"
''' '''
********* *********
...@@ -64,6 +65,7 @@ class LogEntitiesEnum(Enum): ...@@ -64,6 +65,7 @@ class LogEntitiesEnum(Enum):
ChangeRequestFormStakeHolders = "ChangeRequestFormStakeHolders" ChangeRequestFormStakeHolders = "ChangeRequestFormStakeHolders"
ChangeRequestFormAttachments = "ChangeRequestFormAttachments" ChangeRequestFormAttachments = "ChangeRequestFormAttachments"
ChangeRequestFormDetails = "ChangeRequestFormDetails" ChangeRequestFormDetails = "ChangeRequestFormDetails"
ChangeRequestSettings = 'ChangeRequestSettings'
''' '''
********* *********
......
# Generated by Django 2.2 on 2020-02-19 15:25
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0001_initial'),
]
operations = [
migrations.AlterField(
model_name='changerequestformapprovers',
name='user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='cms_form_approver_user', to=settings.AUTH_USER_MODEL, to_field='code'),
),
migrations.AlterField(
model_name='changerequesttemplateapprovers',
name='user',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, related_name='cms_temp_approver_user', to=settings.AUTH_USER_MODEL, to_field='code'),
),
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'), ('ChangeRequestSettings', 'ChangeRequestSettings')], default='Add', max_length=50),
),
migrations.AlterField(
model_name='extracttransformload',
name='model_type',
field=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'), ('CMSSET', 'CMSSET')], default='USER', max_length=100),
),
migrations.CreateModel(
name='ChangeRequestSettings',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('code', models.CharField(max_length=255, unique=True)),
('behalf_approved', models.BooleanField(default=False)),
('behalf_accepted', models.BooleanField(default=False)),
('behalf_rejected', models.BooleanField(default=False)),
('behalf_implemented', models.BooleanField(default=False)),
('behalf_completed', models.BooleanField(default=False)),
('created', models.DateTimeField(auto_now_add=True)),
('deleted_at', models.DateTimeField(blank=True, null=True)),
('active_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cms_settings_active_users', to=settings.AUTH_USER_MODEL, to_field='code')),
('behalf_user', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='cms_settings_behalf_users', to=settings.AUTH_USER_MODEL, to_field='code')),
],
options={
'db_table': 'change_request_settings',
'ordering': ['-created'],
'unique_together': {('active_user', 'behalf_user')},
},
),
]
# Generated by Django 2.2 on 2020-02-27 17:46
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0002_auto_20200219_1525'),
]
operations = [
migrations.AddField(
model_name='allowedcompany',
name='view_all_change_request_template',
field=models.BooleanField(default=True),
),
]
...@@ -478,12 +478,6 @@ class BaseHeader(models.Model): ...@@ -478,12 +478,6 @@ class BaseHeader(models.Model):
class BaseApprover(models.Model): class BaseApprover(models.Model):
level = models.IntegerField() level = models.IntegerField()
user = models.ForeignKey(
User,
blank=True,
null=True,
on_delete=models.PROTECT,
to_field='code')
delegation = models.ForeignKey( delegation = models.ForeignKey(
Delegation, Delegation,
blank=True, blank=True,
...@@ -653,6 +647,13 @@ class ChangeRequestTemplateApprovers(BaseApprover): ...@@ -653,6 +647,13 @@ class ChangeRequestTemplateApprovers(BaseApprover):
is_default = models.BooleanField( is_default = models.BooleanField(
default=False default=False
) )
user = models.ForeignKey(
User,
blank=True,
null=True,
on_delete=models.PROTECT,
to_field='code',
related_name='cms_temp_approver_user')
class Meta: class Meta:
db_table = 'change_request_template_approvers' db_table = 'change_request_template_approvers'
...@@ -846,6 +847,13 @@ class ChangeRequestFormApprovers(BaseApprover): ...@@ -846,6 +847,13 @@ class ChangeRequestFormApprovers(BaseApprover):
blank=True, blank=True,
null=True, null=True,
to_field='code') to_field='code')
user = models.ForeignKey(
User,
blank=True,
null=True,
on_delete=models.PROTECT,
to_field='code',
related_name='cms_form_approver_user')
class Meta: class Meta:
db_table = 'change_request_form_approvers' db_table = 'change_request_form_approvers'
...@@ -1102,9 +1110,11 @@ class AllowedCompany(models.Model): ...@@ -1102,9 +1110,11 @@ class AllowedCompany(models.Model):
create_change_request_template = models.BooleanField(default=True) create_change_request_template = models.BooleanField(default=True)
view_all_change_request = models.BooleanField(default=True) view_all_change_request = models.BooleanField(default=True)
approve_cr = models.BooleanField(default=False) approve_cr = models.BooleanField(default=False)
view_all_change_request_template = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True) created_at = models.DateTimeField(auto_now_add=True)
deleted_at = models.DateTimeField(null=True, blank=True) deleted_at = models.DateTimeField(null=True, blank=True)
class Meta: class Meta:
db_table = 'allowed_company' db_table = 'allowed_company'
unique_together = ['company_pivot', 'group_pivots', 'id_number'] unique_together = ['company_pivot', 'group_pivots', 'id_number']
...@@ -1221,3 +1231,43 @@ class AssetGroup(models.Model): ...@@ -1221,3 +1231,43 @@ class AssetGroup(models.Model):
self.code = code self.code = code
self.created = datetime.now() self.created = datetime.now()
self.save() self.save()
class ChangeRequestSettings(models.Model):
code = models.CharField(unique=True, max_length=255)
active_user = models.ForeignKey(
User,
on_delete=models.CASCADE,
to_field='code',
related_name='cms_settings_active_users'
)
behalf_user = models.ForeignKey(
User,
on_delete=models.CASCADE,
to_field='code',
related_name='cms_settings_behalf_users'
)
behalf_approved = models.BooleanField(default=False)
behalf_accepted = models.BooleanField(default=False)
behalf_rejected = models.BooleanField(default=False)
behalf_implemented = models.BooleanField(default=False)
behalf_completed = models.BooleanField(default=False)
created = models.DateTimeField(auto_now_add=True)
deleted_at = models.DateTimeField(null=True, blank=True)
class Meta:
db_table = 'change_request_settings'
ordering = ['-created']
unique_together = ['active_user', 'behalf_user']
def __str__(self):
return f'{self.code}'
def save(self, *args, **kwargs):
super(ChangeRequestSettings, self).save(*args, **kwargs)
code = number_generator(enums.GenerateCode.CMS_SETTINGS.value, self.id)
if self.code == '':
self.code = code
self.created = datetime.now()
self.save()
...@@ -596,3 +596,51 @@ def routing_table_overdue(args): ...@@ -596,3 +596,51 @@ def routing_table_overdue(args):
modifiedby=admin modifiedby=admin
) )
return True return True
# RMS-ONBEHALF
def on_behalf(args):
name = args[0]
action = args[1]
active_user = args[2]
recipient = args[3]
admin = args[4]
linking_verb = args[5]
F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'RMS-ONBEHALF.html'), 'r')
FC = F.read()
FC = FC.replace('{name}', name)
FC = FC.replace('{action}', action)
FC = FC.replace('{active_user}', active_user)
FC = FC.replace('{linking_verb}', linking_verb)
try:
send_mail(
subject='Resource Management System - On Behalf User',
message='',
from_email=settings.EMAIL_DEFAULT_SENDER,
recipient_list=(recipient,),
html_message=FC,
fail_silently=False
)
models.EmailLogs.objects.create(
template='RMS-ONBEHALF.html',
recipients=recipient,
content=FC,
is_sent=True,
createdby=admin,
modifiedby=admin
)
except Exception as e:
models.EmailLogs.objects.create(
template='RMS-ONBEHALF.html',
recipients=recipient,
content=FC,
is_sent=False,
createdby=admin,
modifiedby=admin
)
return True
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<title>RMS: ASSIGNED ON BEHALF</title>
</head>
<body style="font-family: arial;">
<h3>Resource Management System &#40;RMS&#41;</h3>
<h3 style="color:#888888;">{action} on Behalf</h3><br>
<p>Dear {name},</p><br>
<p>Please be informed that {active_user} {action} you {linking_verb} their behalf for change requests under Actions on Behalf. </p><br>
<!-- <p>Please be informed that {active_user} {action} you as on behalf user for 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
Product Environment:
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b product-dev
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b product-sit
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b product-staging
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b product-demo
JTC Environment:
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b jtc-dev
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b jtc-sit
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b jtc-staging
http://administrator@42.61.118.105:7990/scm/rms/api-main-service.git -b jtc-demo
Product Environment:
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b product-dev
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b product-sit
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b product-staging
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b product-demo
JTC Environment:
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b jtc-dev
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b jtc-sit
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b jtc-staging
http://Administrator@52.76.133.252:7990/scm/rms/web.git -b jtc-demo
\ No newline at end of file
...@@ -26,7 +26,6 @@ BASE_DIR = os.path.dirname( ...@@ -26,7 +26,6 @@ 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 = False
ALLOWED_HOSTS = ['*'] ALLOWED_HOSTS = ['*']
CORS_ORIGIN_ALLOW_ALL = True CORS_ORIGIN_ALLOW_ALL = True
...@@ -163,8 +162,8 @@ EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/template ...@@ -163,8 +162,8 @@ EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/template
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 = 'AKIAYA4XVX5XFZHRQATF' EMAIL_HOST_USER = 'AKIAIPRWQKYV6N5SMLUA'
EMAIL_HOST_PASSWORD = 'BIOG15v+WTbTiBtPKkn+LCjg0UHqO3nLFQezh4pi6g3y' EMAIL_HOST_PASSWORD = 'ApK1dtH2qpT/oMl9MEauFvyN9XZDQ1fjzd8TumIs71NG'
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'
...@@ -184,8 +183,9 @@ CHANNEL_LAYERS = { ...@@ -184,8 +183,9 @@ CHANNEL_LAYERS = {
'default': { 'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer', 'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': { 'CONFIG': {
"hosts": [('172.17.0.1', 6379)], # "hosts": [('172.17.0.1', 6379)],
# "hosts": [('127.0.0.1', 6379)], # "hosts": [(os.environ.get('REDIS_HOST', 'localhost'),6379)],
"hosts": [('127.0.0.1', 6379)],
}, },
}, },
} }
...@@ -201,9 +201,12 @@ DATABASES = { ...@@ -201,9 +201,12 @@ DATABASES = {
} }
} }
# **************** # ****************
# PROGRAM SETTINGS # PROGRAM SETTINGS
# **************** # ****************
DEBUG = config['SETTINGS']['DEBUG']
SESSION_TIMEOUT = config['SETTINGS']['SESSION_TIMEOUT'] SESSION_TIMEOUT = config['SETTINGS']['SESSION_TIMEOUT']
FRONT_END_URL = config['SETTINGS']['FRONT_END_URL'] FRONT_END_URL = config['SETTINGS']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['SETTINGS']['AUTH_ACCESSS_TOKEN_TIMEOUT'] AUTH_ACCESSS_TOKEN_TIMEOUT = config['SETTINGS']['AUTH_ACCESSS_TOKEN_TIMEOUT']
...@@ -227,4 +230,3 @@ APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE' ...@@ -227,4 +230,3 @@ APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE'
CATCH_EMAIL = config['SETTINGS']['CATCH_EMAIL'] CATCH_EMAIL = config['SETTINGS']['CATCH_EMAIL']
CR_FRONT_LINK = config['SETTINGS']['CR_LINK'] CR_FRONT_LINK = config['SETTINGS']['CR_LINK']
...@@ -10,3 +10,4 @@ services: ...@@ -10,3 +10,4 @@ services:
- "7020:8000" - "7020:8000"
container_name: dev_rmsv2_api_container container_name: dev_rmsv2_api_container
restart: always restart: always
...@@ -64,6 +64,7 @@ REALTIMESERVER_IP = 127.0.0.1:8000 ...@@ -64,6 +64,7 @@ REALTIMESERVER_IP = 127.0.0.1:8000
[SETTINGS] [SETTINGS]
CONFIG = config.settings.local CONFIG = config.settings.local
BATCH_UPLOAD_FORMAT_FILENAME = instruction.pdf BATCH_UPLOAD_FORMAT_FILENAME = instruction.pdf
SSL = 1
[NOTIFICATION_EMAIL] [NOTIFICATION_EMAIL]
APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED
......
This diff is collapsed.
INSERT INTO `applications` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `excel_code`) VALUES
(1, '2019-09-23 12:43:33.754098', 'superuser', '2019-09-23 12:43:33.754098', 'superuser', 'APP-20190923-0000001', 'Resource Management System', 'rms'),
(2, '2019-09-23 12:43:40.512905', 'superuser', '2019-09-23 12:43:40.512905', 'superuser', 'APP-20190923-0000002', 'Change Request Management System', 'cms'),
(3, '2019-09-23 12:43:55.957076', 'superuser', '2019-09-23 12:43:55.957076', 'superuser', 'APP-20190923-0000003', 'Asset Management System', 'ams');
INSERT INTO `auth_user` (`id`, `last_login`, `is_superuser`, `first_name`, `last_name`, `is_staff`, `is_active`, `date_joined`, `user_type`, `code`, `name`, `username`, `password`, `contact_no`, `email`, `default_app_id`, `department_id`, `doa_id`) VALUES
(1, '2019-11-25 14:25:06.048963', 1, '', '', 1, 1, '2019-09-23 12:42:37.938304', 'SU', 'USER-20190923-0000001', '', 'superuser', 'pbkdf2_sha256$150000$YLmqqWBQGsJG$r4NYkY05q1zlmgzh106ejBbzd0NY00YEfylllyVQyk0=', NULL, 'red@tirsolutions.com', 'APP-20190923-0000001', 'DEPARTMENT-20190923-0000001', NULL);
INSERT INTO `auth_user_application` (`id`, `user_id`, `application_id`) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3);
INSERT INTO `auth_user_images` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `name`, `image`, `is_primary`, `user_id`) VALUES
(11, '2019-10-15 12:27:13.058304', 'superuser', '2019-10-15 12:27:13.058352', 'superuser', '_profile_pic.png', 'user_images/_profile_pic.png', 1, 'USER-20190923-0000001');
INSERT INTO `companies` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `contact_details`) VALUES
(1, '2019-09-23 12:45:31.058709', 'superuser', '2019-10-01 18:10:40.098534', 'superuser', 'COMPANY-20190923-0000001', 'Oneberry Technologies Pte Ltd', '2152509');
DELETE FROM `delegations`;
INSERT INTO `delegations` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`) VALUES
(1, '2019-11-19 17:46:08.984731', 'superuser', '2019-11-19 17:46:08.984731', 'superuser', 'DELEGATION-20191119-0000001', 'Requestor'),
(2, '2019-11-19 17:46:18.010437', 'superuser', '2019-11-19 17:46:18.010437', 'superuser', 'DELEGATION-20191119-0000002', 'Vendor/Implementor'),
(3, '2019-11-19 17:46:26.168693', 'superuser', '2019-11-22 10:03:40.605242', 'superuser', 'DELEGATION-20191119-0000003', 'Head of Department'),
(4, '2019-11-19 17:46:34.020753', 'superuser', '2019-11-19 17:46:34.020753', 'superuser', 'DELEGATION-20191119-0000004', 'SD/OD'),
(5, '2019-11-19 17:46:41.461203', 'superuser', '2019-11-19 17:46:41.462205', 'superuser', 'DELEGATION-20191119-0000005', 'Change Control Board'),
(6, '2019-11-19 17:46:49.472397', 'superuser', '2019-11-19 17:46:49.472397', 'superuser', 'DELEGATION-20191119-0000006', 'Approver'),
(12, '2019-11-21 09:46:42.763973', 'superuser', '2019-11-21 09:46:55.656089', 'superuser', 'DELEGATION-20191121-0000012', 'Facilities Manager'),
(13, '2019-11-21 09:47:04.092120', 'superuser', '2019-11-21 10:08:40.239094', 'superuser', 'DELEGATION-20191121-0000013', 'Move Manager');
INSERT INTO `departments` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `company_id`) VALUES
(1, '2019-09-23 12:45:52.531178', 'superuser', '2019-10-01 18:12:27.956536', 'superuser', 'DEPARTMENT-20190923-0000001', 'Super User', 'COMPANY-20190923-0000001');
INSERT INTO `email_logs` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `template`, `recipients`, `content`, `is_sent`) VALUES
(1, '2019-12-11 15:57:36.338584', 'red@tirsolutions.com', '2019-12-11 15:57:36.338637', 'red@tirsolutions.com', 'RMS-NEWUSER.html', 'tirsamemail+fan@gmail.com', '<!DOCTYPE html>\n<html>\n<head>\n<title>RMS: New User Created</title>\n</head>\n<body style="font-family: arial;">\n\n<h3>Resource Management System &#40;RMS&#41;</h3>\n<h3 style="color:#888888;">New User Created</h3><br>\n\n<p>Dear Rita Fantilga,</p><br>\n<p>You have been created as a new user of RMS. Please see your default login details below.</p><br>\n \n<b>Username</b><br>ob-rita<br><br>\n<b>Password</b><br>xqZgDfBjZR<br><br>\n\n<p>You may change your password through the <u><a href="http://devweb.rmsv2.oneberrysystem.com/cms/profile" style="text-decoration:underline;color:#007bff;" target="_blank">my profile</a></u> section of RMS any time.</p><br>\n \n<p>Sincerely,</p>\n<p>RMS Team</p><br><br>\n \n<p>Powered by</p>\n<img src="https://s3-ap-southeast-1.amazonaws.com/oneberry/img/logo_oneberry.png" class="img-responsive" style="width:150px;height:auto;" />\n \n</body>\n</html>', 1);
INSERT INTO `master_attachments` (`id`, `url`, `attch_ref`) VALUES
(323, 'uploads/RMS_-_Forgot_Password_3_A77aRmz.html', 'url'),
(324, 'uploads/batch_upload.xlsx', 'url'),
(325, 'uploads/batch_upload_rewd8IS.xlsx', 'sa1w1ypu4qbk39jbkek'),
(332, 'uploads/zzzzz7_6yOT3ai.xlsx', 'url'),
(374, 'uploads/instruction.pdf', 'url'),
(507, 'uploads/fred.png', 'url'),
(612, 'uploads/zzzzz7.xlsx', 'url'),
(818, 'uploads/user_format.csv', 'etl_gen');
INSERT INTO `modules` (`id`, `created`, `createdby`, `modified`, `modifiedby`, `code`, `name`, `sort_id`, `component`, `application_id`, `parent_id`) VALUES
(1, '2019-09-27 12:49:27.795897', 'superuser', '2019-09-27 12:49:27.795897', 'superuser', 'MODULE-20190927-0000001', 'Application Management', 1, 'rms/application-management', 'APP-20190923-0000001', NULL),
(2, '2019-09-27 12:49:31.756321', 'superuser', '2019-09-27 13:00:57.280102', 'superuser', 'MODULE-20190927-0000002', 'Company Management', 2, 'rms/company-management', 'APP-20190923-0000001', NULL),
(3, '2019-09-27 12:49:49.528430', 'superuser', '2019-09-27 13:00:18.423200', 'superuser', 'MODULE-20190927-0000003', 'Department Management', 4, 'rms/department-management', 'APP-20190923-0000001', NULL),
(4, '2019-09-27 12:49:57.378955', 'superuser', '2019-09-27 12:58:07.634481', 'superuser', 'MODULE-20190927-0000004', 'Module Management', 5, 'rms/module-management', 'APP-20190923-0000001', NULL),
(5, '2019-09-27 12:50:01.383432', 'superuser', '2019-09-30 14:37:53.210860', 'superuser', 'MODULE-20190927-0000005', 'User Management', 6, 'rms/user-management', 'APP-20190923-0000001', NULL),
(6, '2019-09-27 12:50:15.910699', 'superuser', '2019-09-27 19:04:53.805099', 'superuser', 'MODULE-20190927-0000006', 'Change Request Template', 3, 'cms/change-request/template', 'APP-20190923-0000002', NULL),
(10, '2019-09-28 12:28:20.174483', 'superuser', '2019-09-30 14:38:38.604217', 'superuser', 'MODULE-20190928-0000010', 'Change Request Form', 2, 'cms/change-request/form', 'APP-20190923-0000002', NULL),
(11, '2019-09-30 17:15:33.022534', 'superuser', '2019-09-30 17:15:33.022578', 'superuser', 'MODULE-20190930-0000011', 'Notification', 1, 'cms/notifications', 'APP-20190923-0000002', NULL),
(19, '2019-11-07 17:27:21.486248', 'superuser', '2019-11-07 17:27:21.486290', 'superuser', 'MODULE-20191107-0000019', 'Delegation Management', 7, 'rms/delegation-management', 'APP-20190923-0000001', NULL);
...@@ -20,3 +20,4 @@ docker run -d --restart=always -p 3001:3000 sit_rms_webv2 npm start ...@@ -20,3 +20,4 @@ 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 docker exec -it container-name redis-cli FLUSHALL
config set stop-writes-on-bgsave-error no config set stop-writes-on-bgsave-error no
docker run -p 6379:6379 -d redis:2.8
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