Commit 179726b3 authored by Gladys Forte's avatar Gladys Forte

Merge pull request #794 in RMS/api-main-service from product-dev to product-sit

* commit '386dd902': (91 commits)
  {dev bugfix} manually added migrations from demo branch
  {dev bugfix} removed f on filter at company
  {dev bugfixed} removed unused codes, comments and imports
  remove unused import from CMS folders
  {dev bugfix} clean imports
  {dev bugfix} removed all import that used the deleted files
  {dev bugfix} delete un used codes and folder
  delete migrations
  test commit for merging environments
  fixing conflicts on product dev
  revert "set domain email to rms-hub.com"
  set domain email to rms-hub.com
  testing
  delete branch endpoint
  testing pull on all environment
  fixing recent_companies
  fixing serving profile picture on account
  dev debug=True
  page size set 100 branches viewset
  filter files for all dependent of branches endpoint
  ...
parents 9aef46b1 386dd902
......@@ -108,7 +108,6 @@ class CurrentUser(APIView):
class ForgotPassword(APIView):
permission_classes = (AllowAny,)
# @decorators.error_safe
@transaction.atomic
def post(self, request, *args, **kwargs):
email = request.data['email']
......
......@@ -77,4 +77,4 @@ class AssetGroupViewset(viewsets.ModelViewSet):
instance = self.get_object()
self.perform_destroy(instance)
return Response(status=status.HTTP_204_NO_CONTENT)
\ No newline at end of file
return Response(status=status.HTTP_204_NO_CONTENT)
from django.apps import AppConfig
class AuthenticationConfig(AppConfig):
name = 'authentication'
from django.db import models
# Create your models here.
from django.shortcuts import render
# Create your views here.
......@@ -2,6 +2,7 @@ from rest_framework import serializers
from app.entities.models import AllowedCompany
from app.applicationlayer.utils import model_to_dict
class AllowedCompanySerializer(serializers.ModelSerializer):
def to_representation(self, instance):
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import AllowedCompany
from django.db.models import Q
......
# from rest_framework.views import APIView
from rest_framework import status, viewsets
from rest_framework.response import Response
from app.entities import enums
from app.entities.models import AllowedCompany
from app.applicationlayer.utils import CustomPagination, status_message_response
# from rest_framework.exceptions import ParseError
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
......@@ -20,7 +18,6 @@ from django.db import IntegrityError
class AllowedCompanyViewSet(viewsets.ModelViewSet):
# queryset = AllowedCompany.objects.all()
queryset = AllowedCompany.objects.select_related(
'id_number', 'company_pivot', 'group_pivots'
).all()
......@@ -34,8 +31,7 @@ class AllowedCompanyViewSet(viewsets.ModelViewSet):
'id_number__code', 'company_pivot__code',
'group_pivots__code'
)
# @decorators.rms.user_list
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
......
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
from rest_framework.response import Response
from rest_framework import status, views
from django.db.models import Q
import requests
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
......@@ -27,7 +23,7 @@ class CancelTriggerAPIView(views.APIView):
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 is False and data.form_code.status == 'Pending' and data.frm_approver.is_action is True:
cr_link = f'{CR_FRONT_LINK}/{data.form_code}'
......@@ -45,7 +41,7 @@ class CancelTriggerAPIView(views.APIView):
requestor_recipient = data.form_code.requested_by_user.email
admin = 'Test'
args_requestor = [requestor_name, auto_cancel_date,
args_requestor = [requestor_name, auto_cancel_date,
date_submitted_last_approver, approver_pending_action,
cr_number, cr_name, company_requestedto,
department_requestedto, priority_level, form_status, url,
......
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
from rest_framework.response import Response
from rest_framework import status, views
from django.db.models import Q
import requests
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
......@@ -28,7 +24,7 @@ class OverdueTriggerAPIView(views.APIView):
list_of_emails = []
for data in today_mail:
if data.is_sent == False and (data.form_code.status == 'Pending' or
if data.is_sent is False and (data.form_code.status == 'Pending' or
data.form_code.status == 'Approved' or
data.form_code.status == 'Rejected'):
......
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
from rest_framework.response import Response
from rest_framework import status, views
from django.db.models import Q
import requests
from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
......@@ -30,7 +27,7 @@ class ReminderTriggerAPIView(views.APIView):
list_of_emails = []
for data in today_mail:
if data.frm_approver.is_action == True and data.form_code.status == 'Pending':
if data.frm_approver.is_action is True and data.form_code.status == 'Pending':
# common details
cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}'
......
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
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 = []
cms_settings = request.data['cms_settings']
for cms_setting in cms_settings:
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)
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class ChangeRequestFormApproversSerializer(
......
......@@ -12,8 +12,7 @@ from app.applicationlayer.utils import (
class ChangeRequestFormApproversViewset(viewsets.ModelViewSet):
# queryset = models.ChangeRequestFormApprovers.objects.all().order_by('level')
queryset = models.ChangeRequestFormApprovers.objects.select_related(
'form_code', 'tmp_approver'
).all().order_by('level')
......
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class ChangeRequestFormAttachmentsSerializer(
......
from app.entities import models
from rest_framework import serializers
from app.applicationlayer.utils import model_to_dict
class ChangeRequestFormDetailsSerializer(
......
......@@ -12,8 +12,7 @@ from app.applicationlayer.utils import (
class ChangeRequestFormDetailsViewset(viewsets.ModelViewSet):
# queryset = models.ChangeRequestFormDetails.objects.all()
queryset = models.ChangeRequestFormDetails.objects.select_related(
'form_code'
).all()
......
from rest_framework import viewsets as meviewsets
from rest_framework.viewsets import ReadOnlyModelViewSet
from drf_renderer_xlsx.mixins import XLSXFileMixin
from drf_renderer_xlsx.renderers import XLSXRenderer
from app.entities.models import (
ChangeRequestFormHeader,
ChangeRequestFormApprovers,
ChangeRequestFormStakeHolders,
AllowedCompany
)
# from app.applicationlayer.form_listing_ import headers
from app.applicationlayer.cms.form.download.serializers import headers
from django.db.models import CharField, Value
from django.db.models import Q
from rest_framework.response import Response
from rest_framework.permissions import AllowAny
# from cms.applicationlayer.utilities import logged_user
class DownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
......
import configparser
import shutil
import os
from django.shortcuts import render
from rest_framework import viewsets
from rest_framework.views import APIView
from app.entities import models
from datetime import datetime
from datetime import timedelta
from rest_framework.response import Response
from rest_framework import status, views
from rest_framework.decorators import action
from django.http import Http404
from django.db.models import Q
import requests
from django.conf import settings
from rest_framework.exceptions import ValidationError
from django.db import transaction, IntegrityError, connection
from app.applicationlayer.utils import (QuerySetHelper,
status_message_response,
send_broadcast_message)
from django.db import transaction
from app.applicationlayer.utils import (status_message_response,
send_broadcast_message,
CustomPagination,
model_to_dict,
main_threading,
error_message)
from app.businesslayer.changerequest import (change_request,
change_request_template)
from app.applicationlayer.cms.utils_cr import (number_generator,
send_mail_requestor,
next_approver_email,
from app.applicationlayer.cms.utils_cr import (next_approver_email,
crhistory_save,
send_mail_vendor,
get_max_batchno,
generate_template_id,
crhistory_create_save,
entity_log_bulk,
reminder_trigger_save,
overdue_trigger_save,
reset_autoemail_tables,
delete_master_attachment_file)
from app.entities import enums
from app.applicationlayer.utils import model_to_dict
import json
from django.shortcuts import get_object_or_404
from django.db.models import Min
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from rest_framework.exceptions import ParseError
from app.businesslayer.changerequest.change_request import (
form_add_edit_delete
)
......@@ -66,8 +58,6 @@ from app.applicationlayer.cms.form.header.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
import json
from app.applicationlayer.utils import main_threading
from django.core.files.base import ContentFile
from django.conf import settings
......@@ -76,9 +66,6 @@ from django.http import HttpResponse
from xhtml2pdf import pisa
from app.helper.decorators import *
from app.applicationlayer.utils import error_message
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
......@@ -130,7 +117,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
self.serializer_class = ChangeRequestFormHeaderSerializerList
id_number = self.request.user.code
self.queryset = change_request.list_by_user(id_number)
self.queryset = change_request.filter_base(
self.queryset,
request.query_params.get('company_requested_to'),
......@@ -223,23 +210,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
overdue_filtered = change_request.filter_overdue(self.queryset)
overdue = overdue_filtered.count()
# server side computations
# status_total = pending + approved + rejected + cancelled + completed
# close = rejected + cancelled + completed
# opened = pending + approved
# open_percent = round((opened/status_total) * 100)
# close_percent = round((close/status_total) * 100)
# priority_total = high + normal
# high_percent = round((high/priority_total) * 100)
# normal_percent = round((normal/priority_total) * 100)
message = {
'account_no': id_number,
'pending': pending,
......@@ -251,10 +221,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
'normal': normal,
'awaiting': awaiting,
'overdue': overdue,
# 'open_percent': open_percent,
# 'close_percent': close_percent,
# 'high_percent': high_percent,
# 'normal_percent': normal_percent,
'code': 200,
'status': 'success',
'message': 'Dashboard Summary'
......@@ -415,7 +381,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
instance = self.get_object()
serializer = self.get_serializer(instance)
# queryset = self.get_serializer_class().setup_eager_loading(self.queryset)
# models.Notification.objects.filter(
......@@ -577,15 +543,12 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
# full_file_name = os.path.join(my_folder, file_name)
# if os.path.isfile(full_file_name):
# shutil.copy(full_file_name, dest)
for file_name in attch:
print(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'])
# print(full_file_name)
if os.path.isfile(a):
print(a)
# print(type(a))
b = open(a, 'r')
shutil.copy(b, my_folder)
else:
......@@ -728,7 +691,23 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
self.perform_update(serializer)
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(
batchno,
enums.CREnum.ACTION.value,
......@@ -739,7 +718,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
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
message = status_message_response(
200, 'success',
......@@ -1085,6 +1065,18 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
data = data['toValue'].replace("'", '"').replace('None', '""').replace('True', '""').replace('False', '""')
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 = {
"name": convert['user']['name'],
"department" : convert['department']['name'],
......@@ -1093,6 +1085,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
"delegation" : convert['delegation'],
"action" : convert['action'],
"remarks" : convert['remarks'],
"on_behalf": on_behalf,
"created": convert['action_date']
}
......@@ -1395,4 +1388,3 @@ class ChangeRequestFormPost(APIView):
}
return Response(message,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
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,
send_broadcast_message)
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)
......@@ -12,7 +12,7 @@ from app.applicationlayer.utils import (
class ChangeRequestFormStakeHoldersViewset(viewsets.ModelViewSet):
# queryset = models.ChangeRequestFormStakeHolders.objects.all()
queryset = models.ChangeRequestFormStakeHolders.objects.select_related(
'form_code'
).all()
......
This diff is collapsed.
......@@ -4,7 +4,6 @@ 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 rest_framework import status
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company
from django.db.models import Q
......
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from rest_framework.filters import SearchFilter, OrderingFilter
from app.entities.models import (
Company, AllowedCompany,
ChangeRequestFormHeader, AllowedCompany
ChangeRequestFormHeader
)
from rest_framework import viewsets, status
from rest_framework import viewsets
from app.businesslayer.company.serializer import AdminCompanySerializer
from app.applicationlayer.utils import CustomPagination, status_message_response
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.company import serializer
from app.applicationlayer.cms.master.form.company.table_filters import (
ChangeRequestCompanyFilterSet
)
from app.helper.decorators import rms
from rest_framework.response import Response
from django.db.models import Q
from rest_framework.decorators import action
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department
from django.db.models import Q
......
from rest_framework import viewsets, status
from rest_framework import viewsets
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, Delegation
from app.entities.models import Department, AllowedCompany
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.cms.master.form.department.table_filters import (
ChangeRequestDepartmentFilterSet
)
from app.helper.decorators import rms
from django.db.models import Q
from rest_framework.exceptions import ParseError
class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
......
......@@ -3,10 +3,7 @@ from app.applicationlayer.utils import (CustomPagination,
status_message_response)
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, F
from rest_framework import status
# from django.db.models import F
from django.db.models import Q
class UserListTemplate(APIView):
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company
from django.db.models import Q
......
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Company, AllowedCompany
from rest_framework import viewsets, status
from rest_framework import viewsets
from app.businesslayer.company.serializer import AdminCompanySerializer
from app.applicationlayer.utils import CustomPagination, status_message_response
from django_filters.rest_framework import DjangoFilterBackend
......@@ -9,7 +9,6 @@ from app.applicationlayer.management.company import serializer
from app.applicationlayer.cms.master.template.company.table_filters import (
ChangeRequestCompanyFilterSet
)
from app.helper.decorators import rms
from rest_framework.response import Response
from django.db.models import Q
......
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):
......
from rest_framework import viewsets, status
from rest_framework import viewsets
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
......@@ -13,9 +12,7 @@ from app.applicationlayer.cms.master.template.default_approver import serializer
from app.applicationlayer.cms.master.template.default_approver.table_filter import (
DefaultApproverFilterSet
)
from app.helper.decorators import rms
from django.db.models import Q
from rest_framework.exceptions import ParseError
class DefaultApproverViewSet(viewsets.ModelViewSet):
......
......@@ -9,7 +9,7 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
ret = super().to_representation(instance)
ret['company'] = model_to_dict(instance.company)
return ret
class Meta:
model = Department
fields = '__all__'
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department
from django.db.models import Q
......
from rest_framework import viewsets, status
from rest_framework import viewsets
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
......@@ -13,9 +12,7 @@ from app.applicationlayer.master.department import serializer
from app.applicationlayer.cms.master.template.department.table_filters import (
ChangeRequestDepartmentFilterSet
)
from app.helper.decorators import rms
from django.db.models import Q
from rest_framework.exceptions import ParseError
class ChangeRequestDepartmentTemplateViewSet(viewsets.ModelViewSet):
......
from rest_framework import viewsets, status
from rest_framework import viewsets
from rest_framework.response import Response
from app.entities.models import ChangeRequestTemplateHeader, AllowedCompany
from app.applicationlayer.cms.master.template_list.serializers import ChangeRequestTemplatesSerializer
......
from rest_framework import serializers
from app.entities import models
from app.applicationlayer.utils import model_to_dict
class ChangeRequestTemplateApproversSerializer(
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateApprovers
from django.db.models import Q
class ApproverFilter(filters.FilterSet):
......
from rest_framework import serializers
from app.entities import models
from app.applicationlayer.utils import model_to_dict
class ChangeRequestTemplateAttachmentsSerializer(
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateAttachments
from django.db.models import Q
class AttachmentFilter(filters.FilterSet):
......
from rest_framework import serializers
from app.entities import models
from app.applicationlayer.utils import model_to_dict
class ChangeRequestTemplateDetailsSerializer(
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateDetails
from django.db.models import Q
class DetailsFilter(filters.FilterSet):
......
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from django.conf import settings
from app.applicationlayer.utils import model_to_dict
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
from app.applicationlayer.cms.template.attachment.serializers import ChangeRequestTemplateAttachmentsSerializer
from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer
from django.conf import settings
from rest_framework.exceptions import ValidationError
from app.applicationlayer.cms.utils_cr import (
BadRequestException
)
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateHeader
from django.db.models import Q
class HeaderFilterSet(filters.FilterSet):
......
from rest_framework.views import APIView
from rest_framework import viewsets
from app.entities import models
from app.entities import enums, models
from rest_framework.response import Response
from rest_framework import status, views
......@@ -11,24 +11,18 @@ from django.db.models import Q
from rest_framework.exceptions import ValidationError
from django.db import transaction
from app.applicationlayer.utils import (CustomPagination,
status_message_response)
status_message_response,
log_save,
model_to_dict)
from app.applicationlayer.cms.utils_cr import (
entity_log_bulk,
delete_master_attachment_file
)
from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models
from django.db.models import Q
from app.applicationlayer.utils import log_save, CustomPagination
from rest_framework.exceptions import ParseError
from app.businesslayer.changerequest.change_request_template import (
tmp_add_edit_delete,
validation_approver_same_level,
validation_existing_vendor_requestor
tmp_add_edit_delete
)
from app.applicationlayer.management.account.serializer import ChangeRequestList
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
from app.applicationlayer.cms.template.details.serializers import ChangeRequestTemplateDetailsSerializer
......@@ -38,11 +32,6 @@ from app.applicationlayer.cms.template.header.serializers import ChangeRequestTe
from app.applicationlayer.cms.template.header.table_filters import HeaderFilterSet
from app.helper.decorators import *
# from django_filters import rest_framework as filters
# from rest_framework.filters import SearchFilter, OrderingFilter
# from django_filters.rest_framework import DjangoFilterBackend
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
......
from app.entities import models
from rest_framework import serializers
from django.db.models import Q
from app.applicationlayer.utils import model_to_dict
from drf_writable_nested import WritableNestedModelSerializer
from app.applicationlayer.cms.utils_cr import (get_account_details,
get_dept_details,
get_companies_details)
from app.applicationlayer.cms.template.approver.serializers import ChangeRequestTemplateApproversSerializer
from app.applicationlayer.cms.template.stakeholder.serializers import ChangeRequestTemplateStakeHoldersSerializer
class ChangeRequestTemplateAttachmentsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestTemplateDetailsSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestTemplateDetails
fields = '__all__'
read_only_fields = ['created', 'code']
class ChangeRequestTemplatesSerializer(
serializers.ModelSerializer
):
tmp_approvers = ChangeRequestTemplateApproversSerializer(
many=True, read_only=True)
tmp_stakes = ChangeRequestTemplateStakeHoldersSerializer(
many=True, read_only=True)
tmp_attachments = ChangeRequestTemplateAttachmentsSerializer(
many=True, read_only=True)
tmp_details = ChangeRequestTemplateDetailsSerializer(
many=True, read_only=True)
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
# fields = '__all__'
fields = ('template_no', 'requested_to_template_name',
'requested_to_objective', 'requested_to_target_date',
'requested_to_priority', 'description', 'created',
'requested_to_template_id', 'requested_to_company',
'requested_to_department', 'requested_to_user',
'created_by_user', 'created_by_department',
'tmp_approvers', 'tmp_stakes', 'tmp_attachments',
'tmp_details')
read_only_fields = ['created', 'template_no']
class ChangeRequestTemplatesSerializerList(
serializers.ModelSerializer
):
def to_representation(self, instance):
ret = super().to_representation(instance)
try:
ret['company'] = instance.requested_to_company.name
ret['department'] = instance.requested_to_department.name
ret['point_of_contact'] = instance.requested_to_user.name
ret['created_by'] = instance.created_by_user.name
return ret
except Exception as e:
ret['company'] = "none"
ret['department'] = "none"
ret['point_of_contact'] = "none"
ret['created_by'] = "none"
return ret
class Meta:
model = models.ChangeRequestTemplateHeader
fields = '__all__'
read_only_fields = ['created', 'template_no']
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import ChangeRequestTemplateStakeHolders
from django.db.models import Q
class StakeHolderFilter(filters.FilterSet):
......
This diff is collapsed.
......@@ -4,8 +4,8 @@ from django.conf.urls import url
from rest_framework.urlpatterns import format_suffix_patterns
from app.applicationlayer.cms.form import views as crform_views
from app.applicationlayer.cms.allowed_company import views as allowed
from app.applicationlayer.cms.cms_settings import views as cms_settings
# MASTERS Form
from app.applicationlayer.cms.master.template.company.views import ChangeRequestCompanyTemplateViewSet
......@@ -46,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.onbehalf import views as onbehalf
router = routers.DefaultRouter()
router.register(r'template', header.ChangeRequestTemplatesViewset)
......@@ -62,8 +64,11 @@ router.register(r'form-details', detailsform.ChangeRequestFormDetailsViewset)
router.register(r'form-download', dl.DownloadRequest)
router.register(r'form-onbehalf', onbehalf.ChangeRequestFormsViewset)
# privilege CMS
router.register(r'allowed-companies', allowed.AllowedCompanyViewSet)
router.register(r'cms-settings', cms_settings.CMSSettingsViewSet)
# privilege CMS
# filter endpoints under Allowed Companies table
......
from datetime import datetime
from django.db.models.functions import Lower
from functools import wraps
from django.conf import settings
import requests
from app.entities import models
from datetime import timedelta
from django.db.models import Q
......@@ -11,10 +8,8 @@ from app.helper.email_service import sender
from app.applicationlayer.utils import log_save
from app.entities import enums
from app.applicationlayer.utils import model_to_dict
from rest_framework.exceptions import ParseError
from django.db import IntegrityError
from rest_framework.exceptions import APIException
from django.db.models import Max
import os
......@@ -822,6 +817,51 @@ def cancelled_user_trigger(form_code,
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):
# delete master attachment data and media file attachments
for attachment in attachments:
......
......@@ -8,12 +8,21 @@ from app.entities import enums
from django.db.models import Q
from app.applicationlayer.management.module.serializer import ModuleSerializer
from app.entities.models import (
User, Department, UserImage, AllowedCompany, Application, Module
User, Department, UserImage, AllowedCompany, Application, Module,
ChangeRequestSettings
)
import os
import configparser
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
import os
import configparser
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
......@@ -26,6 +35,7 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
company = serializers.SerializerMethodField()
create_form = serializers.SerializerMethodField()
create_template = serializers.SerializerMethodField()
my_successions = serializers.SerializerMethodField()
class Meta:
model = User
......@@ -40,10 +50,26 @@ class UserManagementRetreiveSerializer(serializers.ModelSerializer):
'email', 'default_app',
'user_type', 'is_active',
'doa',
'my_successions',
)
# 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):
data = {
"id": user.department.id,
......
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 AccountFilterset(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = User
fields = '__all__'
......@@ -2,14 +2,14 @@ import copy
import threading
import pandas as pd
import csv
import io, os
from django.db.models import Q
from app.entities import enums
from django.db import transaction
from app.helper import decorators
from rest_framework.views import APIView
from rest_framework.decorators import action
from app.helper.decorators import rms, error_safe
from app.helper.email_service import sender
from rest_framework import viewsets, status
from rest_framework.decorators import action
from django.contrib.auth import authenticate
from django.contrib.auth.hashers import check_password
from rest_framework.response import Response
......@@ -19,7 +19,7 @@ from app.entities.models import (
ChangeRequestFormHeader, ChangeRequestTemplateHeader,
AllowedCompany, Company, Department, UserHistory
)
from app.helper.decorators import rms, error_safe
from django.contrib.auth.hashers import make_password
from django_filters import rest_framework as filters
from django_filters.rest_framework import DjangoFilterBackend
......@@ -32,8 +32,6 @@ from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save,
main_threading
)
from rest_framework.exceptions import ParseError
from django.db.models import Q
class UserViewSet(viewsets.ModelViewSet):
......@@ -199,10 +197,6 @@ class UserViewSet(viewsets.ModelViewSet):
if cms_form.count() > 0 or cms_template.count() > 0:
# raise ParseError(
# 'Cannot update this record the user has a record on change request it might cause a data error'
# )
error = 'Cannot update this record the user has a record on change request it might cause a data error'
message = {
'code': 400,
......@@ -225,10 +219,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']
app = Application.objects.filter(
code__in=app
......@@ -295,7 +285,6 @@ class UserViewSet(viewsets.ModelViewSet):
else:
# raise Exception('User not found')
error = 'User not found'
message = {
'code': 400,
......@@ -314,7 +303,6 @@ class UserViewSet(viewsets.ModelViewSet):
methods=['put'],
url_path='change-password',
name="Change Password of User")
# @decorators.error_safe
@transaction.atomic
def ChangePassword(self, request, code=None):
......@@ -323,11 +311,9 @@ class UserViewSet(viewsets.ModelViewSet):
if serialized.is_valid():
# form = copy.deepcopy(serialized.validated_data)
form = request.data
if form['new_password'] != form['new_password_confirm']:
# raise Exception('Passwords must match')
error = 'Passwords must match'
message = {
'code': 400,
......@@ -362,7 +348,6 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_200_OK
)
else:
# raise Exception('User not found')
error = 'User not found'
message = {
'code': 400,
......@@ -392,18 +377,11 @@ class UserViewSet(viewsets.ModelViewSet):
if serialized.is_valid():
# form = copy.deepcopy(serialized.validated_data)
# form = request.data
# if form['new_password'] != form['new_password_confirm']:
# raise Exception('Passwords must match')
existingUser = User.objects.filter(code=code)
pk = self.get_object()
if existingUser:
# existingUser.first().set_password(form['new_password_confirm'])
fromObj = copy.copy(existingUser.first())
existingUser.first().save()
toObj = copy.copy(existingUser.first())
......@@ -421,7 +399,6 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_200_OK
)
else:
# raise Exception('User not found')
error = 'User not found'
message = {
'code': 400,
......@@ -443,7 +420,6 @@ class UserViewSet(viewsets.ModelViewSet):
methods=['put'],
url_path='picture',
name="Uploads Profile Picture of User")
# @decorators.error_safe
@transaction.atomic
def UploadProfilePicture(self, request, code=None):
existingUser = User.objects.filter(code=code).first()
......@@ -454,10 +430,8 @@ class UserViewSet(viewsets.ModelViewSet):
if (eximages):
for item in eximages:
item.delete()
# DELETE FROM PHYSICAL
FileHelper.DeleteFile(path=item.image.path)
# self.serializer_class = serializer.UserImageSerializer
data = serializer.UserImageSerializer(data=request.data)
data.is_valid(raise_exception=True)
......@@ -468,7 +442,6 @@ class UserViewSet(viewsets.ModelViewSet):
status=status.HTTP_201_CREATED,
headers=headers)
else:
# raise ParseError('User not found')
error = 'User not found'
message = {
'code': 400,
......
from rest_framework import serializers
from app.entities.models import Application
import ast
class ApplicationSerializer(serializers.ModelSerializer):
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Application
from django.db.models import Q
class ApplicationFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = Application
fields = '__all__'
......@@ -6,7 +6,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 Application, EntityLog
from app.entities.models import Application
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save
)
......
import os
import sys
import os
import zipfile
import shutil
import datetime
import threading
import configparser
......@@ -29,7 +26,6 @@ from app.applicationlayer.utils import (
main_threading, PaginationForETL
)
from django.db.models import Q
from rest_framework.exceptions import ParseError
from rest_framework.decorators import action
from django.contrib.auth.hashers import make_password
from django_filters.rest_framework import DjangoFilterBackend
......@@ -38,11 +34,6 @@ from app.applicationlayer.management.batchupload.table_filters import ExtractTra
from django.db.models import F, Value
from django.core.files.base import ContentFile
from django.conf import settings
from io import BytesIO
from django.http import HttpResponse
from django.template.loader import get_template
from xhtml2pdf import pisa
from django.core.files.storage import FileSystemStorage
from django.core.exceptions import ObjectDoesNotExist
from reportlab.platypus import SimpleDocTemplate, Spacer, Paragraph
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
......@@ -225,16 +216,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
'Privilege_Department_Code'
)
# if departments.count() > 0:
# company = [departments[0]['Privilege_Company']]
# department = [departments[0]['Privilege_Department']]
# department_code = [departments[0]['Privilege_Department_Code']]
# else:
# company = "Oneberry Technologies"
# department = "Sample Department"
# department_code = "DEPARTMENT-20190101-0000000"
# departments = {"Privilege_Company": ['No Department Data']}
data = {
'Username': ["ob-john"],
'Name': ["John Doe"],
......@@ -292,9 +273,7 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
return self.get_paginated_response(message)
# @transaction.atomic
def create(self, request, **kwargs):
# sp1 = transaction.savepoint() # nothing will save to db
csv_file = request.FILES['file']
extension_file = str(csv_file).split('.')[1]
......@@ -343,26 +322,19 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
)
if not request_department:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": company_error},
# {"message": str(e)},
status=status.HTTP_400_BAD_REQUEST
)
elif request.user.user_type == enums_department:
if keys['Department_Code'] != request.user.department.code:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": department_error},
# {"message": str(e)},
status=status.HTTP_400_BAD_REQUEST
)
# raise ParseError(
# department_error
# )
# user type authorization and user type per user
else:
user_department = Department.objects.filter(
......@@ -414,8 +386,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
users['file_name'] = etl2
users['password'] = password
# users['admin'] = logged_user_email
UserHistory.objects.create(
**users
)
......@@ -438,7 +408,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
crt = True if str(keys['Create_Template']).lower() == 'yes' else False
view_all = True if str(keys['View_All_CR']).lower() == 'yes' else False
approve_cr = True if str(keys['Approve_CR']).lower() == 'yes' else False
privilege_object = {
"id_number": current_user,
......@@ -454,16 +423,13 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
except IntegrityError as e:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": f"Duplicate user privilege at row {data + 2}"},
# {"message": str(e)},
status=status.HTTP_400_BAD_REQUEST
)
except ObjectDoesNotExist as e:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": f"Department Does not Exist at Privilege row {data + 2}"},
status=status.HTTP_400_BAD_REQUEST
......@@ -471,7 +437,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
except IntegrityError as e:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": f"Record already exist at row {data + 2}"},
status=status.HTTP_400_BAD_REQUEST
......@@ -479,7 +444,6 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
except KeyError as e:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": f"Missing column {e.args[0]}"},
status=status.HTTP_400_BAD_REQUEST
......@@ -487,18 +451,11 @@ class BatchUploadViewSet(viewsets.ModelViewSet):
except ObjectDoesNotExist as e:
etl2.delete()
# transaction.savepoint_rollback(sp1)
return Response(
{"message": f"Department Does not Exist at row {data + 2}"},
status=status.HTTP_400_BAD_REQUEST
)
# except ValueError as e:
# return Response(
# {"message": f"Invalid department code. Please check at line {data + 2}"},
# status=status.HTTP_400_BAD_REQUEST
# )
send_mail = UserHistory.objects.filter(sent=False).values(
'name', 'username', 'email', 'password'
)
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Company
from django.db.models import Q
class CompanyFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = Company
fields = '__all__'
......@@ -5,7 +5,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 Delegation, Department
from app.entities.models import Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save
)
......
......@@ -9,7 +9,6 @@ class DepartmentSerializer(serializers.ModelSerializer):
).values().first()
ret = super().to_representation(instance)
ret['company'] = company_name
# ret['application'] = application_name
return ret
......
from django_filters import rest_framework as filters
from django.db.models import Count
from app.entities.models import Department
from django.db.models import Q
class DepartmentFilterSet(filters.FilterSet):
# search = filters.CharFilter(method='search_bar', label='search')
# def search_bar(self, queryset, name, value):
# return queryset.filter(
# Q(username__icontains=value) |
# Q(first_name__icontains=value) |
# Q(last_name__icontains=value))
class Meta:
model = Department
fields = '__all__'
......@@ -5,7 +5,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, EntityLog
from app.entities.models import Department
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save
)
......
from rest_framework import serializers
from app.entities.models import Module, Application
# from app.applicationlayer.management.application import ApplicationSerializer
class SubModuleField(serializers.Field):
......
......@@ -5,8 +5,6 @@ import json
from rest_framework import viewsets as meviewsets
from app.applicationlayer.management.notification import serializers
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
from rest_framework.response import Response
......
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
from app.applicationlayer.master.department.views import AdminDepartmentViewSet
from app.applicationlayer.master.user_type.views import UserTypeViewSet
from app.applicationlayer.master.attachment.views import MasterAttachmentViewSet
from app.applicationlayer.master.dashboard.views import RMSDashBoardViewSet
router = routers.DefaultRouter()
router.register(r'users', AdminAccountViewSet)
......@@ -16,4 +17,5 @@ router.register(r'attachments', MasterAttachmentViewSet)
urlpatterns = [
path('', include(router.urls)),
url(r'^user-types/$', UserTypeViewSet.as_view(), name="user-types"),
url(r'^dashboard/$', RMSDashBoardViewSet.as_view(), name="dashboard"),
]
from rest_framework import pagination
from collections import OrderedDict
from rest_framework.response import Response
from django.core.paginator import InvalidPage
from rest_framework.exceptions import NotFound
from django.utils import six
from django.utils.translation import ugettext_lazy as _
class SimplePageNumberPagination(pagination.PageNumberPagination):
page_query_param = 'page'
page_size_query_param = 'page-size'
max_page_size = 1000
invalid_page_message = _('Invalid page.')
def paginate_queryset(self, queryset, request, view=None):
"""
Paginate a queryset if required, either returning a
page object, or `None` if pagination is not configured for this view.
"""
page_size = self.get_page_size(request)
if not page_size:
return None
paginator = self.django_paginator_class(queryset, page_size)
page_number = request.query_params.get(self.page_query_param, 1)
if page_number in self.last_page_strings:
page_number = paginator.num_pages
try:
if len(queryset) < page_size:
page_number = 1
self.page = paginator.page(page_number)
except InvalidPage as exc:
msg = self.invalid_page_message.format(
page_number=page_number, message=six.text_type(exc)
)
raise NotFound(msg)
if paginator.num_pages > 1 and self.template is not None:
# The browsable API should display pagination controls.
self.display_page_controls = True
self.request = request
return list(self.page)
def get_paginated_response(self, data, additional_info=None):
content = [
('count', self.page.paginator.count),
('next', self.get_next_link()),
('previous', self.get_previous_link()),
('results', data),
('page', self.page.number),
('additional_info', additional_info)
]
return Response(OrderedDict(content))
from rest_framework import serializers
from app.entities import models
class DepartmentSerializer(serializers.ModelSerializer):
class Meta:
model = models.Department
fields = ('__all__')
depth = 0
from django.shortcuts import render
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
......@@ -31,7 +30,6 @@ from app.applicationlayer.cms.utils_cr import (
from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models
from app.applicationlayer.utils import log_save, CustomPagination
from app.applicationlayer.cms.template import serializers
from django.db.models import Min
from django.conf import settings
......@@ -102,6 +100,7 @@ def list_by_user_archived(user_id_number):
return return_queryset
def list_by_user_without_dept(user_id_number):
try:
return_queryset = models.ChangeRequestFormHeader.objects.filter(
......@@ -737,9 +736,9 @@ def cr_routing_actions(approver_instance, current_user, move_to_level):
if (the_last_vendor and current_user == the_last_vendor.user.code and
level == the_last_vendor.level):
update_form_header_status(form_code, 'Approved')
else:
the_next_vendor = check_vendor_level(
'next', next_level, form_code)
......@@ -811,4 +810,70 @@ def cr_routing_actions(approver_instance, current_user, move_to_level):
reset_autoemail_tables(form_code)
return True
\ No newline at end of file
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
from django.shortcuts import render
from app.entities import models
from app.applicationlayer import paginators
from datetime import datetime
......@@ -18,7 +17,6 @@ from app.applicationlayer.cms.utils_cr import (
from app.applicationlayer.utils import model_to_dict
from app.entities import enums, models
from app.applicationlayer.utils import log_save, CustomPagination
from app.applicationlayer.cms.template import serializers
import itertools
from operator import itemgetter
......
......@@ -2,18 +2,6 @@ from enum import Enum
class ModelSeriesEnum(Enum):
USER = "USR"
# CLIENT = "CLI"
# CONSUMABLEPRODUCTS = "CSP"
# PROJECT = "PRJ"
# SERIALIZEITEM = "ITM"
# SERIALIZEPRODUCT = "SRP"
# SUPPLIER = "SUP"
# WAREHOUSE = "WHL"
# ACQUISITION = 'AQN'
# REQUISITION = 'RQN'
# PURCHASEREQUEST = 'PR'
# STOCKTAKE = 'STK'
# CHECKOUT = 'CHK'
class UserTypeEnum(Enum):
SUPER_USER = "SU"
......@@ -44,6 +32,7 @@ class GenerateCode(Enum):
ETL = 'ETL'
ASSET_GROUP = 'AMSGRP'
CMS_SETTINGS = "CMSSET"
'''
*********
......@@ -76,22 +65,7 @@ class LogEntitiesEnum(Enum):
ChangeRequestFormStakeHolders = "ChangeRequestFormStakeHolders"
ChangeRequestFormAttachments = "ChangeRequestFormAttachments"
ChangeRequestFormDetails = "ChangeRequestFormDetails"
# BRAND = "Brand"
# CATEGORY = "Category"
# CURRENCY = "Currency"
# UNIT_MATERIAL = "Unit Material"
# NEWS = "News"
# PROJECT = "Project"
# PROJECT_LOCATION = "Project Location"
# WAREHOUSE = "Warehouse"
# SUPPLIER = "Supplier"
# CLIENT = "Client"
# PRODUCT = "Product"
# ACQUISITION_ITEM = "Acquisition Item"
# STOCK = "Stock"
# STOCK_ITEM = "Stock Item"
# REQUISITION = "Requisition Header"
ChangeRequestSettings = 'ChangeRequestSettings'
'''
*********
......
......@@ -732,4 +732,4 @@ class Migration(migrations.Migration):
'unique_together': {('company_pivot', 'group_pivots', 'id_number')},
},
),
]
]
\ No newline at end of file
......@@ -23,4 +23,4 @@ class Migration(migrations.Migration):
field=models.ForeignKey(default=1, on_delete=django.db.models.deletion.PROTECT, related_name='template_attachments', to='entities.MasterAttachment'),
preserve_default=False,
),
]
]
\ No newline at end of file
......@@ -22,4 +22,4 @@ class Migration(migrations.Migration):
model_name='changerequestformheader',
name='requested_desc',
),
]
]
\ No newline at end of file
# Generated by Django 2.2 on 2020-02-11 15:12
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0003_auto_20200206_1422'),
]
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')},
},
),
]
......@@ -478,12 +478,6 @@ 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.ForeignKey(
Delegation,
blank=True,
......@@ -653,6 +647,13 @@ class ChangeRequestTemplateApprovers(BaseApprover):
is_default = models.BooleanField(
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:
db_table = 'change_request_template_approvers'
......@@ -846,6 +847,13 @@ class ChangeRequestFormApprovers(BaseApprover):
blank=True,
null=True,
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:
db_table = 'change_request_form_approvers'
......@@ -1221,3 +1229,43 @@ class AssetGroup(models.Model):
self.code = code
self.created = datetime.now()
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()
......@@ -595,4 +595,52 @@ def routing_table_overdue(args):
createdby=admin,
modifiedby=admin
)
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,7 @@ BASE_DIR = os.path.dirname(
SECRET_KEY = 'w!dkk7gc*dk#4!6ow3s1wc32%_yp$=osgybm=n0vw6k1j^sqo&'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = False
DEBUG = True
ALLOWED_HOSTS = ['*']
CORS_ORIGIN_ALLOW_ALL = True
......@@ -163,8 +163,8 @@ EMAIL_TEMPLATES_ROOT = os.path.join(BASE_DIR, "app/helper/email_service/template
EMAIL_HOST = 'email-smtp.us-west-2.amazonaws.com'
EMAIL_PORT = 587
EMAIL_HOST_USER = 'AKIAYA4XVX5XFZHRQATF'
EMAIL_HOST_PASSWORD = 'BIOG15v+WTbTiBtPKkn+LCjg0UHqO3nLFQezh4pi6g3y'
EMAIL_HOST_USER = 'AKIAIPRWQKYV6N5SMLUA'
EMAIL_HOST_PASSWORD = 'ApK1dtH2qpT/oMl9MEauFvyN9XZDQ1fjzd8TumIs71NG'
EMAIL_USE_SSL = False
EMAIL_USE_TLS = True
EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
......@@ -227,4 +227,3 @@ APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE'
CATCH_EMAIL = config['SETTINGS']['CATCH_EMAIL']
CR_FRONT_LINK = config['SETTINGS']['CR_LINK']
from .base import *
import configparser
DEBUG = False
ALLOWED_HOSTS = ['*']
# CORS_ORIGIN_ALLOW_ALL = True
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('172.17.0.1', 6379)],
# "hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['DEMO']['DATABASE_ENGINE'],
'NAME': config['DEMO']['DATABASE_NAME'],
'USER': config['DEMO']['DATABASE_USER'],
'PASSWORD': config['DEMO']['DATABASE_PASSWORD'],
'HOST': config['DEMO']['DATABASE_HOST'],
'PORT': config['DEMO']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['DEMO']['SESSION_TIMEOUT']
FRONT_END_URL = config['DEMO']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['DEMO']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['DEMO']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['DEMO']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['DEMO']['CATCH_EMAIL']
CR_FRONT_LINK = config['DEMO']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = True
ALLOWED_HOSTS = ['*']
# CORS_ORIGIN_ALLOW_ALL = True
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('172.17.0.1', 6379)],
# "hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['DEV']['DATABASE_ENGINE'],
'NAME': config['DEV']['DATABASE_NAME'],
'USER': config['DEV']['DATABASE_USER'],
'PASSWORD': config['DEV']['DATABASE_PASSWORD'],
'HOST': config['DEV']['DATABASE_HOST'],
'PORT': config['DEV']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['DEV']['SESSION_TIMEOUT']
FRONT_END_URL = config['DEV']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['DEV']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['DEV']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['DEV']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['DEV']['CATCH_EMAIL']
CR_FRONT_LINK = config['DEV']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = True
ALLOWED_HOSTS = ['*']
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('172.17.0.1', 6379)],
# "hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['SIT']['DATABASE_ENGINE'],
'NAME': config['SIT']['DATABASE_NAME'],
'USER': config['SIT']['DATABASE_USER'],
'PASSWORD': config['SIT']['DATABASE_PASSWORD'],
'HOST': config['SIT']['DATABASE_HOST'],
'PORT': config['SIT']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['SIT']['SESSION_TIMEOUT']
FRONT_END_URL = config['SIT']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['SIT']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['SIT']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['SIT']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['SIT']['CATCH_EMAIL']
CR_FRONT_LINK = config['SIT']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
from .base import *
import configparser
DEBUG = False
ALLOWED_HOSTS = ['*']
config = configparser.ConfigParser()
config_file = os.path.join('./', 'env.ini')
config.read(config_file)
CHANNEL_LAYERS = {
'default': {
'BACKEND': 'channels_redis.core.RedisChannelLayer',
'CONFIG': {
"hosts": [('172.17.0.1', 6379)],
# "hosts": [('127.0.0.1', 6379)],
},
},
}
DATABASES = {
'default': {
'ENGINE': config['STAGING']['DATABASE_ENGINE'],
'NAME': config['STAGING']['DATABASE_NAME'],
'USER': config['STAGING']['DATABASE_USER'],
'PASSWORD': config['STAGING']['DATABASE_PASSWORD'],
'HOST': config['STAGING']['DATABASE_HOST'],
'PORT': config['STAGING']['DATABASE_PORT'],
}
}
# ****************
# PROGRAM SETTINGS
# ****************
SESSION_TIMEOUT = config['STAGING']['SESSION_TIMEOUT']
FRONT_END_URL = config['STAGING']['FRONT_END_URL']
AUTH_ACCESSS_TOKEN_TIMEOUT = config['STAGING']['AUTH_ACCESSS_TOKEN_TIMEOUT']
USER_DEFAULT_PASSWORD = config['STAGING']['USER_DEFAULT_PASSWORD']
REALTIMESERVER_IP = config['STAGING']['REALTIMESERVER_IP']
# Notification Messages
APPROVER_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_MESSAGE']
REQUESTOR_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_MESSAGE']
REQUESTOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_REJECT_MESSAGE']
VENDOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_ACKNOWLEDGE_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_ACKNOWLEDGE_MESSAGE']
REQUESTOR_COMPLETION_MESSAGE = config['NOTIFICATION_EMAIL']['REQUESTOR_COMPLETION_MESSAGE']
VENDOR_ACCEPTANCE_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_ACCEPTANCE_MESSAGE']
VENDOR_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['VENDOR_REJECT_MESSAGE']
REVISED_MESSAGE = config['NOTIFICATION_EMAIL']['REVISED_MESSAGE']
CANCEL_MESSAGE = config['NOTIFICATION_EMAIL']['CANCEL_MESSAGE']
APPROVER_REJECT_MESSAGE = config['NOTIFICATION_EMAIL']['APPROVER_REJECT_MESSAGE']
#ADMIN PROFILE
CATCH_EMAIL = config['STAGING']['CATCH_EMAIL']
CR_FRONT_LINK = config['STAGING']['CR_LINK']
CORS_ORIGIN_ALLOW_ALL = True
......@@ -10,3 +10,4 @@ services:
- "7020:8000"
container_name: dev_rmsv2_api_container
restart: always
......@@ -64,6 +64,7 @@ REALTIMESERVER_IP = 127.0.0.1:8000
[SETTINGS]
CONFIG = config.settings.local
BATCH_UPLOAD_FORMAT_FILENAME = instruction.pdf
SSL = 1
[NOTIFICATION_EMAIL]
APPROVER_MESSAGE = has sent you an APPROVAL REQUEST for change request;RMS-ACTIONREQUIRED
......@@ -76,4 +77,4 @@ 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
APPROVER_REJECT_MESSAGE = has REJECTED the change request for your approval;RMS-CRREJECTED-APPROVER
Username,Name,Company,Department,Department_Code,Email,Contact_No,Application,Default_app,Privilege_Company,Privilege_Department,Privilege_Department_Code,Create_CR,Create_Template,View_All_CR,Approve_CR
ob-john,John Doe,Oneberry Technologies Pte Ltd,Admin Department,DEPARTMENT-20191218-0000067,johndoe@gmail.com,123456,"cms,ams",cms,Oneberry Technologies Pte Ltd,Admin Department,DEPARTMENT-20191218-0000067,Yes,No,Yes,Yes
ob-john,John Doe,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,johndoe@gmail.com,123456,"cms,ams",cms,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,Yes,No,Yes,Yes
,,,,,,,,,Please use this department code as reference,,,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,Admin Department,DEPARTMENT-20191218-0000067,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20191121-0000064,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,IT Department,DEPARTMENT-20191219-0000069,,,,
,,,,,,,,,Jurong Town Corporation,Facilities Management,DEPARTMENT-20191121-0000062,,,,
,,,,,,,,,Jurong Town Corporation,Sample Department,DEPARTMENT-20191218-0000068,,,,
,,,,,,,,,Jurong Town Corporation,Security Division,DEPARTMENT-20191121-0000061,,,,
,,,,,,,,,Jurong Town Corporation,Warehouse Department,DEPARTMENT-20191121-0000065,,,,
,,,,,,,,,Oneberry Technologies Pte Ltd,Business Development,DEPARTMENT-20200122-0000003,,,,
,,,,,,,,,JTC Corporation,Security,DEPARTMENT-20200122-0000002,,,,
,,,,,,,,,Sample Company,Facilities Management,DEPARTMENT-20200130-0000004,,,,
{
"info": {
"_postman_id": "e22e74b6-003f-42b5-a067-7e7cc1674e5e",
"_postman_id": "c5ad0726-f9e0-4795-88d2-924ab3aa1201",
"name": "RMSv2",
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
},
......@@ -139,6 +139,25 @@
},
"response": []
},
{
"name": "Dashboard",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/master/dashboard/",
"host": [
"{{baseurl}}"
],
"path": [
"master",
"dashboard",
""
]
}
},
"response": []
},
{
"name": "User Listing",
"request": {
......@@ -2014,14 +2033,14 @@
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form/FRM-20191121-0000211/",
"raw": "{{baseurl}}/change-request/form/FRM-20200115-0000245/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
"FRM-20191121-0000211",
"FRM-20200115-0000245",
""
]
}
......@@ -2067,7 +2086,7 @@
],
"body": {
"mode": "raw",
"raw": "{\r\n \"id\": 1079,\r\n \"form_code\": \"FRM-20191126-0000237\",\r\n \"delegation\": \"DELEGATION-20191119-0000003\",\r\n \"action\": \"Rejected\",\r\n \"level\": \"1\",\r\n \"remarks\": \"try lang\",\r\n \"move_to_level\": \"5\"\r\n}"
"raw": "{\r\n \"id\": 1111,\r\n \"form_code\": \"FRM-20200115-0000245\",\r\n \"delegation\": \"DELEGATION-20191119-0000003\",\r\n \"action\": \"Approved\",\r\n \"level\": \"1\",\r\n \"remarks\": \"\",\r\n \"move_to_level\": \"\"\r\n}"
},
"url": {
"raw": "{{baseurl}}/change-request/form/actions/",
......@@ -2262,14 +2281,14 @@
"raw": ""
},
"url": {
"raw": "{{baseurl}}/change-request/form/FRM-20191025-0000040/history/",
"raw": "{{baseurl}}/change-request/form/FRM-20200115-0000245/history/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
"FRM-20191025-0000040",
"FRM-20200115-0000245",
"history",
""
]
......@@ -2510,6 +2529,52 @@
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
},
{
"name": "CR Form On Behalf",
"item": [
{
"name": "List of Forms On Behalf",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form-onbehalf/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form-onbehalf",
""
]
}
},
"response": []
},
{
"name": "View Form On Behalf",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form-onbehalf/FRM-20200115-0000245/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form-onbehalf",
"FRM-20200115-0000245",
""
]
}
},
"response": []
}
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
}
],
"protocolProfileBehavior": {},
......@@ -3120,6 +3185,67 @@
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
},
{
"name": "CMS Settings",
"item": [
{
"name": "List of CMS Settings",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/cms-settings/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"cms-settings",
""
]
}
},
"response": []
},
{
"name": "Create CMS Settings",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n\t\"cms_settings\": [\n {\n \"behalf_approved\": true,\n \"behalf_accepted\": true,\n \"behalf_rejected\": true,\n \"behalf_implemented\": true,\n \"behalf_completed\": true,\n \"behalf_user\": \"USER-20191121-0000412\"\n },\n {\n \"behalf_approved\": true,\n \"behalf_accepted\": true,\n \"behalf_rejected\": true,\n \"behalf_implemented\": true,\n \"behalf_completed\": true,\n \"behalf_user\": \"USER-20191121-0000415\"\n }\n ]\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseurl}}/change-request/cms-settings/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"cms-settings",
""
]
}
},
"response": []
}
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
}
],
"protocolProfileBehavior": {}
......@@ -3436,7 +3562,7 @@
"bearer": [
{
"key": "token",
"value": "1bc82df8030501015e54bb3f1f78356b9041f796",
"value": "a678eb844bc34f0177d07daaef90206a86b67e03",
"type": "string"
}
]
......
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
Clear Cache REDIS
docker exec -it container-name redis-cli FLUSHALL
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