Commit 2e875deb authored by John Red Medrano's avatar John Red Medrano

Merge branch 'RMSv2' of http://42.61.118.105:7990/scm/rms/api-main-service into red-develop

parents 7a8bddaa de9e7054
......@@ -10,11 +10,14 @@ from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK
class CancelTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request):
date_now = datetime.now()
today_mail = models.CancelTrigger.objects.filter(
......
......@@ -10,28 +10,32 @@ from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK
class OverdueTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request):
date_now = datetime.now()
today_mail = models.CancelTrigger.objects.filter(
Q(auto_cancel_date=date_now.strftime('%Y-%m-%d 00:00:00.000'))
today_mail = models.OverdueTrigger.objects.filter(
Q(overdue_date=date_now.strftime('%Y-%m-%d 00:00:00.000')) &
Q(is_sent=False)
)
list_of_emails = []
for data in today_mail:
if data.is_sent == False and data.form_code.status == 'Pending' and data.frm_approver.is_action == True:
if data.is_sent == False and (data.form_code.status == 'Pending' or
data.form_code.status == 'Approved' or
data.form_code.status == 'Rejected'):
cr_link = f'{CR_FRONT_LINK}/{data.form_code}'
requestor_name = data.form_code.requested_by_user.name
auto_cancel_date = data.auto_cancel_date.strftime('%B %d, %Y')
date_submitted_last_approver = data.date_submitted_last_approver.strftime('%B %d, %Y')
approver_pending_action = data.frm_approver.user.name
target_date = data.form_code.requested_to_target_date.strftime('%B %d, %Y')
cr_number = data.form_code.requested_to_template_id
cr_name = data.form_code.requested_to_template_name
company_requestedto = data.form_code.requested_to_company.name
......@@ -42,17 +46,12 @@ class OverdueTriggerAPIView(views.APIView):
requestor_recipient = data.form_code.requested_by_user.email
admin = 'Test'
args_requestor = [requestor_name, auto_cancel_date,
date_submitted_last_approver, approver_pending_action,
args_requestor = [requestor_name, target_date,
cr_number, cr_name, company_requestedto,
department_requestedto, priority_level, form_status, url,
requestor_recipient, admin]
main_threading(args_requestor, sender.routing_table_cancelled)
cancel = models.ChangeRequestFormHeader.objects.filter(
form_code=data.form_code
).update(status='Cancelled')
main_threading(args_requestor, sender.routing_table_overdue)
list_of_emails.append(data.form_code.form_code)
......
......@@ -10,11 +10,14 @@ from django.conf import settings
from datetime import timedelta
from app.helper.email_service import sender
from app.applicationlayer.utils import main_threading
from rest_framework.permissions import AllowAny
CR_FRONT_LINK = settings.CR_FRONT_LINK
class ReminderTriggerAPIView(views.APIView):
permission_classes = (AllowAny,)
def get(self, request):
date_now = datetime.now()
next_day = date_now + timedelta(days=1)
......@@ -26,7 +29,7 @@ class ReminderTriggerAPIView(views.APIView):
# print(today_mail)
list_of_emails = []
for data in today_mail:
if data.frm_approver.is_action == True:
if data.frm_approver.is_action == True and data.form_code.status == 'Pending':
# common details
cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}'
......
......@@ -28,32 +28,44 @@ class ChangeRequestFormApproversSerializer(
"contact_no": instance.user.contact_no
}
ret['user'] = user_object
ret['delegation'] = {
"id": instance.delegation.id,
"code": instance.delegation.code,
"name": instance.delegation.name
}
if instance.form_code.status == 'Draft':
if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_user'] = False
else:
ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_comp'] = False
else:
ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_dept'] = False
else:
ret['editable_dept'] = True
if instance.tmp_approver.delegation or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_deleg'] = False
else:
ret['editable_deleg'] = True
else:
ret['editable_user'] = True
ret['editable_comp'] = True
ret['editable_dept'] = True
ret['editable_deleg'] = True
else:
ret['editable_user'] = False
ret['editable_comp'] = False
ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret
......@@ -61,13 +73,13 @@ class ChangeRequestFormApproversSerializer(
if instance.form_code.status == 'Draft':
if instance.tmp_approver:
if instance.tmp_approver.user or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.user or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['editable_user'] = False
else:
ret['user'] = None
ret['editable_user'] = True
if instance.tmp_approver.company or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.company or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['company'] = {
"id": instance.tmp_approver.company.id,
"code": instance.tmp_approver.company.code,
......@@ -79,7 +91,7 @@ class ChangeRequestFormApproversSerializer(
ret['company'] = None
ret['editable_comp'] = True
if instance.tmp_approver.department or instance.tmp_approver.delegation.lower() == 'requestor':
if instance.tmp_approver.department or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['department'] = {
"id": instance.tmp_approver.department.id,
"code": instance.tmp_approver.department.code,
......@@ -90,6 +102,17 @@ class ChangeRequestFormApproversSerializer(
ret['department'] = None
ret['editable_dept'] = True
if instance.tmp_approver.delegation or instance.tmp_approver.delegation.name.lower() == 'requestor':
ret['delegation'] = {
"id": instance.tmp_approver.delegation.id,
"code": instance.tmp_approver.delegation.code,
"name": instance.tmp_approver.delegation.name
}
ret['editable_deleg'] = False
else:
ret['delegation'] = None
ret['editable_deleg'] = True
else:
ret['editable_user'] = True
ret['editable_comp'] = True
......
......@@ -30,7 +30,9 @@ from app.applicationlayer.cms.utils_cr import (number_generator,
generate_template_id,
crhistory_create_save,
entity_log_bulk,
reminder_trigger_save)
reminder_trigger_save,
overdue_trigger_save,
reset_autoemail_tables)
from app.entities import enums
from app.applicationlayer.utils import model_to_dict
......@@ -494,100 +496,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
return Response(e,
status=status.HTTP_500_INTERNAL_SERVER_ERROR)
@transaction.atomic()
@action(
methods=['PATCH'], detail=True,
url_path='re_route', url_name='re_route'
)
def re_route(self, request, *args, **kwargs):
# generate batchno history
batchno = get_max_batchno("batch")
# partial update
partial = kwargs.pop('partial', True)
instance = self.get_object()
form_code = kwargs['form_code']
status_update = {"status": 'Pending'}
serializer = self.get_serializer(instance,
data=status_update,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
form_header = get_object_or_404(models.ChangeRequestFormHeader,
pk=instance.id)
new_instance = model_to_dict(form_header)
# save history in form header
crhistory_save(
batchno,
enums.CREnum.REROUTE.value,
enums.CREnum.UPDATE.value,
enums.CREntitiesEnum.CR_FRM_HEADER.value,
form_code,
old_instance,
new_instance
)
approver_data = []
# get all approvers of form
approvers = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code)
for approver in approvers:
approver_add = {
'id': approver.id,
'action': None,
'remarks': None,
'date_sent': None,
'action_date': None,
'is_action': False
}
approver_data.append(approver_add)
change_request.form_add_edit_delete(
approver_data,
models.ChangeRequestFormApprovers,
enums.CREntitiesEnum.CR_FRM_APPROVER.value,
ChangeRequestFormApproversSerializer,
partial,
self,
form_code,
batchno,
enums.CREnum.REROUTE.value
)
min_level = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code
).aggregate(Min('level'))
min_level = min_level.get('level__min')
next_approver_email(form_code, min_level)
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(min_level))
).update(
date_sent=datetime.now()
)
message = status_message_response(
200, 'success',
'Change request form successfully re routed',
serializer.data
)
return Response(message, status=status.HTTP_200_OK)
@transaction.atomic()
@action(
methods=['PATCH'], detail=True,
......@@ -688,15 +596,13 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
def actions(self, request, *args, **kwargs):
current_user = self.request.user.code
action_body = request.data
id = action_body.get('id', False)
form_code = action_body.get('form_code', False)
delegation = action_body.get('delegation', False)
# delegation = action_body.get('delegation', False)
action = action_body.get('action', False)
level = action_body.get('level', False)
next_level = int(level) + 1
# level = action_body.get('level', False)
# next_level = int(level) + 1
remarks = action_body.get('remarks', False)
# generate batchno history
......@@ -724,8 +630,6 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
self.perform_update(serializer)
new_instance = serializer.data
print(new_instance['action'])
crhistory_save(
batchno,
enums.CREnum.ACTION.value,
......@@ -736,248 +640,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
new_instance
)
if action.lower() == 'approved':
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=int(next_level),
delegation='Vendor/Implementor'
).first()
if the_next_vendor:
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
if the_next_vendor == the_last_vendor:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
# NOTIF MSG FOR NEXT APPROVER
notification_msg = APPROVER_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
next_approver_email(form_code, next_level)
date_now = datetime.now()
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(next_level))
).update(
date_sent=date_now,
is_action=True
)
# update current approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
reminder_trigger_save(form_code, date_now,
approver_instance.date_sent)
elif action.lower() == 'rejected':
# send email to vendor
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
notification_msg, action,
remarks, level
)
prev_level = int(level) - 1
# reset last vendor details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(level=int(prev_level))
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
else:
prev_vendor = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(action='Completed') &
Q(delegation='Vendor/Implementor') &
Q(level__lte=int(level))
)
if not prev_vendor.count() > 0:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Rejected')
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
else:
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, 'others',
notification_msg, action,
remarks, level
)
last_action_vendor = prev_vendor.last()
models.ChangeRequestFormApprovers.objects.filter(
code=last_action_vendor
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
level = last_action_vendor.level + 1
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level__gte=int(level))
).update(
is_action=False,
action=None,
remarks=None,
action_date=None,
date_sent=None
)
elif action.lower() == 'completed':
the_last_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, delegation='Vendor/Implementor'
).order_by('level').last()
if (current_user == the_last_vendor.user.code and
level == the_last_vendor.level):
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
else:
the_next_vendor = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, level=int(next_level),
delegation='Vendor/Implementor'
).first()
if the_next_vendor:
if the_next_vendor.user.code == the_last_vendor.user.code:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Approved')
else:
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Pending')
next_approver_email(form_code, next_level)
models.ChangeRequestFormApprovers.objects.filter(
Q(level=int(next_level))
).update(
date_sent=datetime.now(),
is_action=True
)
# update current approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'accepted':
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status='Completed & Accepted')
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
# update is_action for current level
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
elif action.lower() == 'cancelled':
# changed form status to cancelled
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code).update(status='Cancelled')
# update is_action for current level
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
change_request.cr_routing_actions(new_instance, current_user)
# ---------------- removed code
message = status_message_response(
200, 'success',
'Action performed',
......@@ -1155,7 +819,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
new_instance = model_to_dict(form_header)
print(serializer.errors)
# print(serializer.errors)
# save history in form header
crhistory_create_save(
......@@ -1225,6 +889,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
next_approver_email(form_code, min_level)
date_now = datetime.now()
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(min_level))
......@@ -1233,6 +899,13 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
is_action=True
)
# save details for overdue and auto cancellation
overdue_trigger_save(form_code)
# save details for reminder for first approver
reminder_trigger_save(form_code, date_now,
date_now)
serializer = self.get_serializer(instance)
message = status_message_response(
......@@ -1544,14 +1217,23 @@ class ChangeRequestFormPost(APIView):
next_approver_email(frm_id, min_level)
date_now = datetime.now()
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=frm_id) & Q(level=int(min_level))
).update(
date_sent=datetime.now(),
date_sent=date_now,
is_action=True
)
# save details for overdue and auto cancellation
overdue_trigger_save(frm_id)
# save details for reminder for first approver
reminder_trigger_save(frm_id, date_now,
date_now)
message = {
'code': 201,
'status': 'success',
......
......@@ -3,7 +3,7 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Department, AllowedCompany
from app.entities.models import Department, AllowedCompany, Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
......@@ -53,3 +53,8 @@ class ChangeRequestDepartmentFormViewSet(viewsets.ModelViewSet):
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
......@@ -48,11 +48,23 @@ class ChangeRequestTemplateApproversSerializer(
else:
ret['editable_user'] = True
if instance.delegation.lower() == 'requestor':
if instance.delegation:
ret['delegation'] = {
"id": instance.delegation.id,
"code": instance.delegation.code,
"name": instance.delegation.name
}
ret['editable_deleg'] = False
else:
ret['editable_deleg'] = True
if instance.delegation.name.lower() == 'requestor':
ret['editable_user'] = False
ret['editable_comp'] = False
ret['editable_dept'] = False
ret['editable_deleg'] = False
return ret
except Exception as e:
......@@ -60,6 +72,7 @@ class ChangeRequestTemplateApproversSerializer(
ret['editable_user'] = True
ret['editable_comp'] = True
ret['editable_dept'] = True
ret['editable_deleg'] = True
return ret
......
......@@ -362,6 +362,12 @@ class ChangeRequestTemplatePost(APIView):
sp1 = transaction.savepoint() # nothing will save to db
# cr_prefix = request.data['requested_to_template_id'])
# models.ChangeRequestTemplateHeader.objects.filter(
# requested_to_template_id=cr_prefix
# )
serializer = ChangeRequestTemplatesSerializer(
data=template_header_data)
......
......@@ -86,7 +86,8 @@ urlpatterns = [
path('template-user-list/', UserListTemplate.as_view(), name="User List"),
# filter endpoints under Allowed Companies table
path('reminder/', reminder.ReminderTriggerAPIView.as_view()),
# path('cancelled/', cancel.CancelTriggerAPIView.as_view()),
path('cancelled/', cancel.CancelTriggerAPIView.as_view()),
path('overdue/', overdue.OverdueTriggerAPIView.as_view()),
]
# urlpatterns += format_suffix_patterns(urlpatterns)
......
......@@ -219,7 +219,7 @@ def send_mail_vendor(requestor,
# create notification
notification_create(form_code, message, vendor_code,
sender_code)
sender_code, 'cms')
def send_mail_requestor(current_user,
......@@ -287,7 +287,7 @@ def send_mail_requestor(current_user,
# create notification
notification_create(form_code, message, requestor_code,
current_user)
current_user, 'cms')
def next_approver_email(form_code, next_level):
......@@ -361,7 +361,7 @@ def next_approver_email(form_code, next_level):
# create notification
notification_create(form_code, message, receiver_code,
sender_code)
sender_code, 'cms')
def cancel_overdue(request):
......@@ -551,7 +551,8 @@ def reminder_trigger_save(form_code,
date_to_send=date_from.strftime('%Y-%m-%d 00:00:00.000'),
auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'),
date_submitted_last_approver=date_submitted_last_approver,
is_sent=False
is_sent=False,
form_code=form_instance
)
if counter == 0:
......@@ -560,8 +561,55 @@ def reminder_trigger_save(form_code,
auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'),
date_submitted_last_approver=date_submitted_last_approver,
is_sent=False,
frm_approver=approver
frm_approver=approver,
cancel_type='from_approval'
)
counter = counter + 1
return True
def overdue_trigger_save(form_code):
form_instance = models.ChangeRequestFormHeader.objects.get(
form_code=form_code)
requested_to_target_date = form_instance.requested_to_target_date
overdue_date = requested_to_target_date + timedelta(days=1)
auto_cancel_date = overdue_date + timedelta(days=30)
models.OverdueTrigger.objects.create(
form_code=form_instance,
overdue_date=overdue_date.strftime('%Y-%m-%d 00:00:00.000'),
is_sent=False
)
models.CancelTrigger.objects.create(
form_code=form_instance,
auto_cancel_date=auto_cancel_date.strftime('%Y-%m-%d 00:00:00.000'),
date_submitted_last_approver=None,
is_sent=False,
frm_approver=None,
cancel_type='from_target_date'
)
return True
def reset_autoemail_tables(form_code):
models.ReminderTrigger.objects.filter(
form_code=form_code
).delete()
models.CancelTrigger.objects.filter(
form_code=form_code
).delete()
models.OverdueTrigger.objects.filter(
form_code=form_code
).delete()
return True
\ No newline at end of file
from rest_framework import serializers
from app.entities.models import Delegation
class DelegationSerializer(serializers.ModelSerializer):
class Meta:
model = Delegation
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
from django_filters import rest_framework as filters
from app.entities.models import Delegation
class DelegationFilterSet(filters.FilterSet):
class Meta:
model = Delegation
fields = '__all__'
from app.entities import enums
from django.db import transaction
from rest_framework import viewsets, status
from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response, log_save
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.management.delegation import serializer
from app.applicationlayer.management.delegation.table_filters import DelegationFilterSet
from app.helper import decorators
class DelegationViewSet(viewsets.ModelViewSet):
queryset = Delegation.objects.all().order_by('-created')
serializer_class = serializer.DelegationSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
filterset_class = DelegationFilterSet
ordering_fields = '__all__'
search_fields = ('name')
@transaction.atomic
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)
serializer.is_valid(raise_exception=True)
self.perform_create(serializer)
message = status_message_response(
201, 'success',
'New Delegation created', serializer.data
)
return Response(
message
)
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of Delegation found',
serializer.data
)
return self.get_paginated_response(message)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
@decorators.error_safe
@transaction.atomic
def destroy(self, request, *args, **kwargs):
instance = self.get_object()
new_instance = model_to_dict(instance)
# restrictions
if (new_instance['name'].lower() == 'head of department' or
new_instance['name'].lower() == 'sd/od' or
new_instance['name'].lower() == 'change control board' or
new_instance['name'].lower() == 'approver' or
new_instance['name'].lower() == 'vendor/implementor' or
new_instance['name'].lower() == 'requestor'):
print("hello")
self.perform_destroy(instance)
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.DELEGATION.value,
new_instance['id'],
new_instance,
''
)
return Response(status=status.HTTP_204_NO_CONTENT)
@transaction.atomic
def update(self, request, *args, **kwargs):
partial = kwargs.pop('partial', False)
instance = self.get_object()
serializer = self.get_serializer(instance, data=request.data, partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(instance)
self.perform_update(serializer)
new_instance = serializer.data
log_save(
enums.LogEnum.DELETED.value,
enums.LogEntitiesEnum.DELEGATION.value,
old_instance['id'],
old_instance,
new_instance
)
return Response(serializer.data)
from rest_framework import serializers
from app.entities.models import Department
from app.entities.models import Department, Delegation
from app.applicationlayer.utils import model_to_dict
......@@ -16,3 +16,12 @@ class AdminDepartmentSerializer(serializers.ModelSerializer):
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
class DelegationSerializer(serializers.ModelSerializer):
class Meta:
model = Delegation
fields = '__all__'
read_only_fields = (
'created', 'createdby', 'modified', 'modifiedby', 'code',
)
\ No newline at end of file
......@@ -3,20 +3,23 @@ from rest_framework.response import Response
from app.applicationlayer.utils import model_to_dict
from rest_framework.filters import SearchFilter, OrderingFilter
from django_filters import rest_framework as filters
from app.entities.models import Department
from app.entities.models import Department, Delegation
from app.applicationlayer.utils import (
CustomPagination, status_message_response
)
from django_filters.rest_framework import DjangoFilterBackend
from app.applicationlayer.master.department import serializer
from app.applicationlayer.master.department.serializer import (
AdminDepartmentSerializer,
DelegationSerializer)
from app.applicationlayer.management.department.table_filters import DepartmentFilterSet
from app.helper.decorators import rms
from rest_framework.decorators import action
class AdminDepartmentViewSet(viewsets.ModelViewSet):
queryset = Department.objects.all().order_by('-created')
serializer_class = serializer.AdminDepartmentSerializer
serializer_class = AdminDepartmentSerializer
pagination_class = CustomPagination
lookup_field = 'code'
filter_backends = (DjangoFilterBackend, SearchFilter, OrderingFilter)
......@@ -44,7 +47,6 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
)
return self.get_paginated_response(message)
except Exception as e:
# serializer = self.get_serializer(queryset, many=True)
message = status_message_response(
400,
'failed',
......@@ -52,3 +54,34 @@ class AdminDepartmentViewSet(viewsets.ModelViewSet):
''
)
return Response(message)
@action(detail=True,
methods=['get'],
url_path='delegations',
name="Delegation Filtered List")
def delegations(self, request, *args, **kwargs):
try:
dept_code = kwargs['code']
queryset = Delegation.objects.filter(department__code=dept_code)
page = self.paginate_queryset(queryset)
if page is not None:
self.serializer_class = DelegationSerializer
serializer = self.get_serializer(page, many=True)
message = status_message_response(
200,
'success',
'list of filtered delegations found',
serializer.data
)
return self.get_paginated_response(message)
except Exception as e:
message = status_message_response(
400,
'failed',
str(e),
''
)
return Response(message)
\ No newline at end of file
......@@ -9,6 +9,7 @@ from app.applicationlayer.management.module.views import ModuleViewSet
from app.applicationlayer.management.account.views import UserViewSet
from app.businesslayer.company.views import AdminCompanyViewSet
from app.applicationlayer.management.notification.views import NotificationsViewset
from app.applicationlayer.management.delegation.views import DelegationViewSet
from app.applicationlayer.download.accounts.views import UserDownloadRequest
from app.applicationlayer.download.department.views import DepartmentDownloadRequest
......@@ -26,6 +27,7 @@ router.register(r'notifications', NotificationsViewset)
router.register(r'user-download', UserDownloadRequest)
router.register(r'department-download', DepartmentDownloadRequest)
router.register(r'company-download', CompanyDownloadRequest)
router.register(r'delegations', DelegationViewSet)
urlpatterns = (
path('', include(router.urls)),
......
......@@ -161,7 +161,8 @@ def send_broadcast_message(room_name, sender, message):
ws.close()
def notification_create(form_code, message, account_no, sender_account_no):
def notification_create(form_code, message, account_no,
sender_account_no, app):
try:
......@@ -170,7 +171,7 @@ def notification_create(form_code, message, account_no, sender_account_no):
notif_type='TASK',
message=message,
is_read=False,
app='APP-20190909-0000002',
app=app,
account_no=account_no,
sender_account_no=sender_account_no
)
......@@ -184,12 +185,6 @@ def notification_create(form_code, message, account_no, sender_account_no):
'NEW NOTIFICATIONS'
)
# message = {
# 'code': 200,
# 'status': 'success',
# 'message': 'Notification successfully created!',
# }
# return Response(message, status=status.HTTP_200_OK)
return True
except Exception as e:
......
......@@ -13,14 +13,33 @@ from django.http import Http404
from django.db.models import Q
from app.applicationlayer.cms.utils_cr import (
number_generator, crhistory_save, entity_log_bulk,
crhistory_log_bulk_delete
number_generator,
crhistory_save,
entity_log_bulk,
crhistory_log_bulk_delete,
send_mail_requestor,
next_approver_email,
send_mail_vendor,
crhistory_create_save,
reminder_trigger_save,
overdue_trigger_save,
reset_autoemail_tables
)
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
APPROVER_MESSAGE = settings.APPROVER_MESSAGE
REQUESTOR_MESSAGE = settings.REQUESTOR_MESSAGE
REQUESTOR_REJECT_MESSAGE = settings.REQUESTOR_REJECT_MESSAGE
VENDOR_ACKNOWLEDGE_MESSAGE = settings.VENDOR_ACKNOWLEDGE_MESSAGE
REQUESTOR_ACKNOWLEDGE_MESSAGE = settings.REQUESTOR_ACKNOWLEDGE_MESSAGE
REQUESTOR_COMPLETION_MESSAGE = settings.REQUESTOR_COMPLETION_MESSAGE
VENDOR_ACCEPTANCE_MESSAGE = settings.VENDOR_ACCEPTANCE_MESSAGE
VENDOR_REJECT_MESSAGE = settings.VENDOR_REJECT_MESSAGE
def list_by_user(user_id_number):
......@@ -443,7 +462,9 @@ def check_vendor_level(position, routing_level, form_code):
form_code=form_code,
level=int(routing_level),
delegation='Vendor/Implementor'
)
).first()
return query
elif position == 'last':
......@@ -452,15 +473,275 @@ def check_vendor_level(position, routing_level, form_code):
delegation='Vendor/Implementor'
).order_by('level').last()
return query
elif position == 'prev':
query = models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(action='Completed') &
Q(delegation='Vendor/Implementor') &
Q(level__lte=int(level))
Q(level__lte=int(routing_level))
)
return query
def update_form_approver(form_code, level, apprv_type, date_now):
if apprv_type == 'next':
# update next approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
date_sent=date_now,
is_action=True
)
elif apprv_type == 'current':
# update current approver details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level=int(level))
).update(
is_action=False
)
def update_form_header_status(form_code, status):
models.ChangeRequestFormHeader.objects.filter(
form_code=form_code
).update(status=status)
return True
def cr_routing_actions(approver_instance, current_user):
form_code = approver_instance['form_code']
delegation = approver_instance['delegation']
action = approver_instance['action'].lower()
level = approver_instance['level']
next_level = int(approver_instance['level']) + 1
remarks = approver_instance['remarks']
if approver_instance['action'].lower() == 'approved':
the_next_vendor = check_vendor_level(
'next', next_level, form_code)
if the_next_vendor:
the_last_vendor = check_vendor_level(
'last', level, form_code)
# changed form status to Approved
if the_next_vendor == the_last_vendor:
update_form_header_status(form_code, 'Approved')
# NOTIF MSG FOR REQUESTOR
requestor_notification_msg = REQUESTOR_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
# def cr_routing_actions(approver_instance):
next_approver_email(form_code, next_level)
date_now = datetime.now()
# update next approver details
update_form_approver(form_code, next_level, 'next', date_now)
# update current approver details
update_form_approver(form_code, level, 'current', date_now)
#save details for reminder trigger
reminder_trigger_save(form_code, date_now, date_now)
elif approver_instance['action'].lower() == 'rejected':
# send email to vendor
if delegation.lower() == 'requestor':
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
# send reject email to vendor
send_mail_vendor(
current_user, form_code, delegation,
notification_msg, action,
remarks, level
)
prev_level = int(level) - 1
# reset last vendor details
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) &
Q(level=int(prev_level))
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
else:
prev_vendor = check_vendor_level(
'prev', level, form_code)
if not prev_vendor.count() > 0:
update_form_header_status(form_code, 'Rejected')
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
else:
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_REJECT_MESSAGE.split(';')[0]
# SEND EMAIL AND NOTIF TO REQUESTOR
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
notification_msg = VENDOR_REJECT_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, 'others',
notification_msg, action,
remarks, level
)
last_action_vendor = prev_vendor.last()
models.ChangeRequestFormApprovers.objects.filter(
code=last_action_vendor
).update(
is_action=True,
action='Acknowledged',
action_date=datetime.now(),
date_sent=datetime.now()
)
level = last_action_vendor.level + 1
models.ChangeRequestFormApprovers.objects.filter(
Q(form_code=form_code) & Q(level__gte=int(level))
).update(
is_action=False,
action=None,
remarks=None,
action_date=None,
date_sent=None
)
elif approver_instance['action'].lower() == 'completed':
the_last_vendor = check_vendor_level(
'last', level, form_code)
if (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)
if the_next_vendor:
if the_next_vendor.user.code == the_last_vendor.user.code:
update_form_header_status(form_code, 'Approved')
else:
update_form_header_status(form_code, 'Pending')
next_approver_email(form_code, next_level)
date_now = datetime.now()
# update next approver details
update_form_approver(form_code, next_level, 'next', date_now)
# update current approver details
update_form_approver(form_code, level, 'current', date_now)
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_COMPLETION_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'acknowledged':
# EMAIL CODE FOR REQUESTOR
requestor_notification_msg = REQUESTOR_ACKNOWLEDGE_MESSAGE.split(';')[0]
send_mail_requestor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
elif action.lower() == 'accepted':
update_form_header_status(form_code, 'Completed & Accepted')
# EMAIL CODE FOR VENDOR
requestor_notification_msg = VENDOR_ACCEPTANCE_MESSAGE.split(';')[0]
send_mail_vendor(
current_user, form_code, delegation,
requestor_notification_msg, action,
remarks, level
)
date_now = datetime.now()
# update current approver details
update_form_approver(form_code, level, 'current', date_now)
elif action.lower() == 'cancelled':
# changed form status to cancelled
update_form_header_status(form_code, 'Cancelled')
date_now = datetime.now()
# update is_action for current level
update_form_approver(form_code, level, 'current', date_now)
reset_autoemail_tables(form_code)
return True
......@@ -29,6 +29,7 @@ class GenerateCode(Enum):
COMPANY = 'COMPANY'
DEPARTMENT = 'DEPARTMENT'
USER = 'USER'
DELEGATION = 'DELEGATION'
NOTIFICATION = 'NOTIF'
TEMPLATE = 'TMP'
TMP_APPROVER = 'TMPAPR'
......@@ -62,6 +63,7 @@ class LogEntitiesEnum(Enum):
COMPANY = "COMPANY"
DEPARTMENT = "DEPARTMENT"
MODULE = "MODULE"
DELEGATION = "DELEGATION"
ChangeRequestTemplateHeader = "ChangeRequestTemplateHeader"
ChangeRequestTemplateApprovers = "ChangeRequestTemplateApprovers"
ChangeRequestTemplateStakeHolders = "ChangeRequestTemplateStakeHolders"
......
# Generated by Django 2.2 on 2019-10-29 15:13
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0027_assetgroup'),
]
operations = [
migrations.AddField(
model_name='canceltrigger',
name='cancel_type',
field=models.CharField(blank=True, max_length=255, null=True),
),
migrations.AddField(
model_name='remindertrigger',
name='form_code',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormHeader', to_field='form_code'),
),
migrations.AlterField(
model_name='canceltrigger',
name='frm_approver',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormApprovers', to_field='code'),
),
]
# Generated by Django 2.2 on 2019-11-04 12:28
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0028_auto_20191029_1513'),
]
operations = [
migrations.AlterModelTable(
name='canceltrigger',
table='trigger_cancel',
),
migrations.AlterModelTable(
name='overduetrigger',
table='trigger_overdue',
),
migrations.AlterModelTable(
name='remindertrigger',
table='trigger_reminder',
),
]
# Generated by Django 2.2 on 2019-11-04 15:07
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
('entities', '0029_auto_20191104_1228'),
]
operations = [
migrations.AlterModelOptions(
name='assetgroup',
options={'ordering': ['-created']},
),
]
# Generated by Django 2.2 on 2019-11-07 12:39
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0030_auto_20191104_1507'),
]
operations = [
migrations.CreateModel(
name='Delegation',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('created', models.DateTimeField(auto_now_add=True)),
('createdby', models.CharField(max_length=255)),
('modified', models.DateTimeField(auto_now=True)),
('modifiedby', models.CharField(max_length=255)),
('code', models.CharField(max_length=255, unique=True)),
('name', models.CharField(max_length=255, unique=True)),
],
options={
'db_table': 'delegations',
},
),
migrations.AlterField(
model_name='changerequestformapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.Delegation', to_field='code'),
),
migrations.AlterField(
model_name='changerequesttemplateapprovers',
name='delegation',
field=models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.PROTECT, to='entities.Delegation', to_field='code'),
),
migrations.AddField(
model_name='department',
name='delegation',
field=models.ManyToManyField(to='entities.Delegation'),
),
]
# Generated by Django 2.2 on 2019-11-08 11:09
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('entities', '0031_auto_20191107_1239'),
]
operations = [
migrations.AddField(
model_name='allowedcompany',
name='approve_cr',
field=models.BooleanField(default=True),
),
migrations.AlterField(
model_name='entitylog',
name='entity',
field=models.CharField(choices=[('USER', 'USER'), ('APPLICATION', 'APPLICATION'), ('COMPANY', 'COMPANY'), ('DEPARTMENT', 'DEPARTMENT'), ('MODULE', 'MODULE'), ('DELEGATION', 'DELEGATION'), ('ChangeRequestTemplateHeader', 'ChangeRequestTemplateHeader'), ('ChangeRequestTemplateApprovers', 'ChangeRequestTemplateApprovers'), ('ChangeRequestTemplateStakeHolders', 'ChangeRequestTemplateStakeHolders'), ('ChangeRequestTemplateAttachments', 'ChangeRequestTemplateAttachments'), ('ChangeRequestTemplateDetails', 'ChangeRequestTemplateDetails'), ('ChangeRequestFormHeader', 'ChangeRequestFormHeader'), ('ChangeRequestFormApprovers', 'ChangeRequestFormApprovers'), ('ChangeRequestFormStakeHolders', 'ChangeRequestFormStakeHolders'), ('ChangeRequestFormAttachments', 'ChangeRequestFormAttachments'), ('ChangeRequestFormDetails', 'ChangeRequestFormDetails')], default='Add', max_length=50),
),
]
......@@ -9,7 +9,6 @@ from . import enums
from django.utils.text import slugify
from datetime import timedelta
# ********************* AUTH TABLES *********************
......@@ -86,6 +85,26 @@ class Module(AuditClass):
Module.objects.filter(id=self.id).update(code=code)
class Delegation(AuditClass):
code = models.CharField(
unique=True,
max_length=255
)
name = models.CharField(unique=True, max_length=255)
class Meta:
db_table = 'delegations'
def __str__(self):
return f'{self.name}'
def save(self, *args, **kwargs):
super(Delegation, self).save(*args, **kwargs)
code = enums.GenerateCode.DELEGATION.value
code = number_generator(enums.GenerateCode.DELEGATION.value, self.id)
Delegation.objects.filter(id=self.id).update(code=code)
class Company(AuditClass):
code = models.CharField(
unique=True,
......@@ -129,6 +148,9 @@ class Department(AuditClass):
default='dept'
)
name = models.CharField(max_length=255)
delegation = models.ManyToManyField(
Delegation
)
class Meta:
db_table = 'departments'
......@@ -427,7 +449,13 @@ class BaseApprover(models.Model):
on_delete=models.PROTECT,
to_field='code')
delegation = models.CharField(max_length=50, blank=True, null=True)
# delegation = models.CharField(max_length=50, blank=True, null=True)
delegation = models.ForeignKey(
Delegation,
blank=True,
null=True,
on_delete=models.PROTECT,
to_field='code')
created = models.DateTimeField(
blank=True,
null=True)
......@@ -1034,6 +1062,7 @@ class AllowedCompany(models.Model):
create_change_request = models.BooleanField(default=True)
create_change_request_template = models.BooleanField(default=True)
view_all_change_request = models.BooleanField(default=True)
approve_cr = models.BooleanField(default=True)
created_at = models.DateTimeField(auto_now_add=True)
deleted_at = models.DateTimeField(null=True, blank=True)
......@@ -1064,9 +1093,15 @@ class ReminderTrigger(models.Model):
blank=True)
is_sent = models.BooleanField(
default=False)
form_code = models.ForeignKey(
ChangeRequestFormHeader,
on_delete=models.PROTECT,
to_field='form_code',
null=True,
blank=True)
class Meta:
db_table = 'reminder_trigger'
db_table = 'trigger_reminder'
class CancelTrigger(models.Model):
......@@ -1077,7 +1112,9 @@ class CancelTrigger(models.Model):
frm_approver = models.ForeignKey(
ChangeRequestFormApprovers,
on_delete=models.PROTECT,
to_field='code')
to_field='code',
blank=True,
null=True)
auto_cancel_date = models.DateTimeField(
null=True,
blank=True)
......@@ -1086,9 +1123,13 @@ class CancelTrigger(models.Model):
date_submitted_last_approver = models.DateTimeField(
null=True,
blank=True)
cancel_type = models.CharField(
null=True,
blank=True,
max_length=255)
class Meta:
db_table = 'cancel_trigger'
db_table = 'trigger_cancel'
class OverdueTrigger(models.Model):
......@@ -1103,7 +1144,7 @@ class OverdueTrigger(models.Model):
default=False)
class Meta:
db_table = 'overdue_trigger'
db_table = 'trigger_overdue'
"""
......@@ -1128,6 +1169,7 @@ class AssetGroup(models.Model):
class Meta:
db_table = 'asset_groups'
ordering = ['-created']
def __str__(self):
return f'{self.code}'
......
......@@ -5,7 +5,6 @@ from app.entities import models
from django.conf import settings
# def account_created(args, username, password, receiver) :
def account_created(args):
name = args[0]
username = args[1]
......@@ -51,20 +50,7 @@ def account_created(args):
def cronjob(args):
# name = args[0]
# username = args[1]
# password = args[2]
# recipient = args[3]
# admin = args[4]
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'RMS-NEWUSER.html'), 'r')
# FC = F.read()
# FC = FC.replace('{name}', name)
# FC = FC.replace('{username}', username)
# FC = FC.replace('{password}', password)
# FC = FC.replace('{url}', settings.FRONT_END_URL + '/cms/profile') #changed
try:
send_mail(
subject='Resource Management System: Welcome!',
......@@ -145,24 +131,6 @@ def forgot_password(args):
)
# def password_changed(username, date, receiver) :
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'password-changed.html'), 'r')
# FC = F.read()
# FC = FC.replace('[Username]', username)
# FC = FC.replace('[Datetime]', date)
# FC = FC.replace('[URL]', settings.FRONT_END_URL)
# send_mail(
# subject='OB RMS: Password Changed!',
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=[receiver,],
# html_message=FC
# )
def admin_changepassword(args):
name = args[0]
username = args[1]
......@@ -188,342 +156,6 @@ def admin_changepassword(args):
)
# def account_created(username, password, receiver) :
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'account-created.html'), 'r')
# FC = F.read()
# FC = FC.replace('[Username]', username)
# FC = FC.replace('[Password]', password)
# FC = FC.replace('[URL]', settings.FRONT_END_URL)
# send_mail(
# subject='OB IMS: Welcome!',
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=[receiver,],
# html_message=FC
# )
# def stock_requisition_new(sr_id,
# sr_no,
# requestor,
# requested_on,
# project,
# remarks,
# receiver,
# requested_items=[],
# purchase_items=[],
# required_date=None):
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'stock-requisition.html'), 'r')
# FC = F.read()
# FC = FC.replace('[SR No]', sr_no)
# FC = FC.replace('[Requestor]', requestor)
# FC = FC.replace('[Requested On]', requested_on)
# FC = FC.replace('[Project]', project)
# FC = FC.replace('[Remarks]', remarks)
# # PRINT SR ITEMS
# if requested_items and len(requested_items) > 0:
# appendedList = ''
# for item in requested_items :
# prodNo = str(item.product.product_no)
# prodName = str(item.product.name)
# brand = str(item.product.brand.name)
# qty = str(item.quantity)
# unit = str(item.product.unit_material.name)
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="sr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# # PRINT PR ITEMS
# if purchase_items and len(purchase_items) > 0 :
# FC = FC.replace('[Required Date]', required_date)
# appendedList = ''
# for item in purchase_items :
# prodNo = str(item.product.product_no)
# prodName = str(item.product.name)
# brand = str(item.product.brand.name)
# qty = str(item.quantity)
# unit = str(item.product.unit_material.name)
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="pr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# urlApprove = f"{settings.FRONT_END_URL}/{'transaction/requisition/approve'}/{sr_id}/basic"
# urlReject = f"{settings.FRONT_END_URL}/{'transaction/requisition/reject'}/{sr_id}/basic"
# FC = FC.replace('ApproveToken', urlApprove)
# FC = FC.replace('RejectToken', urlReject)
# send_mail(
# subject='OB IMS: '+ sr_no +' by ' + requestor,
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=[receiver,],
# html_message=FC
# )
# def stock_requisition_approve(sr_no,
# requestor,
# requestor_email,
# requested_on,
# requestor_contact,
# project,
# remarks,
# approved_by,
# approved_date,
# requested_items=[],
# purchase_items=[],
# required_date=None):
# # requested_items
# # LIST OF "RequisitionApproveItem"
# # purchase_items
# # LIST OF "PurchaseRequestApproveItem"
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'stock-requisition-approved.html'), 'r')
# FC = F.read()
# FC = FC.replace('[SR No]', sr_no)
# FC = FC.replace('[Requestor]', requestor)
# FC = FC.replace('[Requested On]', requested_on)
# FC = FC.replace('[Project]', project)
# FC = FC.replace('[Remarks]', remarks)
# FC = FC.replace('[Approved By]', approved_by)
# FC = FC.replace('[Approved On]', approved_date)
# # PRINT SR ITEMS
# if len(requested_items) > 0 :
# appendedList = ''
# for item in requested_items :
# prodNo = item.requisition_product.product.product_no
# prodName = item.requisition_product.product.name
# brand = item.requisition_product.product.brand.name
# qty = str(item.quantity)
# unit = item.requisition_product.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="sr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# # PRINT PR ITEMS
# if len(purchase_items) > 0 :
# FC = FC.replace('[Required Date]', required_date)
# appendedList = ''
# for item in purchase_items :
# prodNo = item.purchase_request_item.product.product_no
# prodName = item.purchase_request_item.product.name
# brand = item.purchase_request_item.product.brand.name
# qty = str(item.quantity)
# unit = item.purchase_request_item.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="pr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# approver_emails = []
# # roles_receives = ['Receive Stock Requisition Authorization Email',
# # 'Allow Purchase Requests Authorisation',
# # 'Receive Stock Request Email',
# # 'Receive Purchase Request Email']
# # qry = models.User.objects.filter(user_roles__role__code__in=roles_receives).values('email').distinct()
# # for item in qry:
# # approver_emails.append(item['email'])
# approver_emails.append(requestor_email)
# if len(approver_emails) > 0:
# send_mail(
# subject='OB IMS Stock Request: '+ sr_no,
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=approver_emails,
# html_message=FC
# )
# def stock_requisition_reject(sr_no,
# requestor,
# requestor_email,
# requested_on,
# project,
# remarks,
# rejected_reason,
# rejected_by,
# rejected_date,
# requested_items=[],
# purchase_items=[],
# required_date=None):
# # requested_items
# # LIST OF "RequisitionRejectItem"
# # purchase_items
# # LIST OF "PurchaseRequestRejectItem"
# F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'stock-requisition-rejected.html'), 'r')
# FC = F.read()
# FC = FC.replace('[SR No]', sr_no)
# FC = FC.replace('[Requestor]', requestor)
# FC = FC.replace('[Requested On]', requested_on)
# FC = FC.replace('[Project]', project)
# FC = FC.replace('[Remarks]', remarks)
# FC = FC.replace('[Rejected By]', rejected_by)
# FC = FC.replace('[Rejected On]', rejected_date)
# FC = FC.replace('[Rejected Reason]', rejected_reason)
# # PRINT SR ITEMS
# if len(requested_items) > 0 :
# appendedList = ''
# for item in requested_items :
# prodNo = item.requisition_product.product.product_no
# prodName = item.requisition_product.product.name
# brand = item.requisition_product.product.brand.name
# qty = str(item.quantity)
# unit = item.requisition_product.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="sr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# # PRINT PR ITEMS
# if len(purchase_items) > 0 :
# FC = FC.replace('[Required Date]', required_date)
# appendedList = ''
# for item in purchase_items :
# prodNo = item.purchase_request_item.product.product_no
# prodName = item.purchase_request_item.product.name
# brand = item.purchase_request_item.product.brand.name
# qty = str(item.quantity)
# unit = item.purchase_request_item.product.unit_material.name
# appendedList += '\t\t\t\t \
# <tr bgcolor="#FFFFFF"> \
# <td>' + prodNo + '</td> \
# <td>' + prodName + '</td> \
# <td>' + brand + '</td> \
# <td>' + qty + '</td> \
# <td>' + unit + '</td> \
# </tr>'
# FC = FC.replace('<tr bgcolor="#FFFFFF" id="pr">\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n <td>&nbsp;</td>\n </tr>', appendedList)
# approver_emails = []
# # roles_receives = ['Receive Stock Requisition Authorization Email', 'Allow Purchase Requests Authorisation', 'Receive Stock Request Email', 'Receive Purchase Request Email']
# # qry = models.User.objects.filter(user_roles__role__code__in=roles_receives).values('email').distinct()
# # for item in qry :
# # approver_emails.append(item['email'])
# approver_emails.append(requestor_email)
# if len(approver_emails) > 0:
# send_mail(
# subject='OB IMS: '+ sr_no +' by ' + requestor,
# message='',
# from_email=settings.EMAIL_DEFAULT_SENDER,
# recipient_list=approver_emails,
# html_message=FC
# )
# # def account_password_reset(username, password, receiver, date_reset) :
# # F = open(os.path.join(EMAIL_TEMPLATES_ROOT, 'reset-password.html'), 'r')
# # FC = F.read()
# # FC = FC.replace('[Username]', username)
# # FC = FC.replace('[Password]', password)
# # FC = FC.replace('[Reset Datetime]', date_reset)
# # send_mail(
# # subject='OB IMS: Password Reset!',
# # message='',
# # from_email=EMAIL_DEFAULT_SENDER,
# # recipient_list=[receiver,],
# # html_message=FC
# # )
# RMS-CRAPPROVED ; RMS-CRACKNOWLEDGE ; RMS-CRCOMPLETED ; RMS-CRACCEPTED ;
# RMS-CRREJECTED ; RMS-CRREJECTED-VENDOR
......
......@@ -497,7 +497,7 @@
],
"body": {
"mode": "raw",
"raw": "{\n \"name\": \"Business Develsopment\",\n \"company\": \"COMPANY-20190923-0000001\"\n}"
"raw": "{\n \"name\": \"Product Dept\",\n \"company\": \"COMPANY-20190923-0000001\",\n \"delegation\":[2, 3]\n}"
},
"url": {
"raw": "{{baseurl}}/management/departments/",
......@@ -1111,6 +1111,143 @@
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
},
{
"name": "Delegation Management",
"item": [
{
"name": "List of Delegations",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/management/delegations/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
""
]
}
},
"response": []
},
{
"name": "View Delegation",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/management/delegations/DELEGATION-20191107-0000002/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
"DELEGATION-20191107-0000002",
""
]
}
},
"response": []
},
{
"name": "Create Delegation",
"request": {
"method": "POST",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n\t\"name\": \"Head of Department\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseurl}}/management/delegations/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
""
]
}
},
"response": []
},
{
"name": "Edit Delegation",
"request": {
"method": "PUT",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"value": "application/json",
"type": "text"
}
],
"body": {
"mode": "raw",
"raw": "{\n\t\"name\": \"SOD/ODs\"\n}",
"options": {
"raw": {
"language": "json"
}
}
},
"url": {
"raw": "{{baseurl}}/management/delegations/DELEGATION-20191107-0000002/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
"DELEGATION-20191107-0000002",
""
]
}
},
"response": []
},
{
"name": "Delete Delegation",
"request": {
"method": "DELETE",
"header": [],
"url": {
"raw": "{{baseurl}}/management/delegations/DELEGATION-20191107-0000001/",
"host": [
"{{baseurl}}"
],
"path": [
"management",
"delegations",
"DELEGATION-20191107-0000001",
""
]
}
},
"response": []
}
],
"protocolProfileBehavior": {},
"_postman_isSubFolder": true
}
],
"protocolProfileBehavior": {},
......@@ -1158,7 +1295,7 @@
"formdata": [
{
"key": "username",
"value": "ryu",
"value": "ob-rita",
"type": "text"
},
{
......@@ -1323,7 +1460,7 @@
"response": []
},
{
"name": "Form Dashboard Copy",
"name": "Form Dashboard w/ Filter",
"protocolProfileBehavior": {
"disableBodyPruning": true
},
......@@ -1499,66 +1636,6 @@
}
},
"response": []
},
{
"name": "Form History",
"protocolProfileBehavior": {
"disableBodyPruning": true
},
"request": {
"auth": {
"type": "oauth2",
"oauth2": [
{
"key": "accessToken",
"value": "cJeBxXT2KVtu7yPUQ5HlESDqTmss8G6m",
"type": "string"
},
{
"key": "tokenType",
"type": "any"
},
{
"key": "addTokenTo",
"value": "header",
"type": "string"
}
]
},
"method": "GET",
"header": [
{
"key": "Content-Type",
"name": "Content-Type",
"type": "text",
"value": "application/json"
}
],
"body": {
"mode": "raw",
"raw": ""
},
"url": {
"raw": "{{baseurl}}/change-request-service/form/FRM-20190823-0000002/history/?page=2",
"host": [
"{{baseurl}}"
],
"path": [
"change-request-service",
"form",
"FRM-20190823-0000002",
"history",
""
],
"query": [
{
"key": "page",
"value": "2"
}
]
}
},
"response": []
}
],
"protocolProfileBehavior": {},
......@@ -1581,7 +1658,7 @@
],
"body": {
"mode": "raw",
"raw": "{\r\n \"requested_to_template_name\": \"XXXXXXX\",\r\n \"requested_to_objective\": \"tesa\",\r\n \"requested_to_target_date\": \"2020-05-24T04:37:36.611000\",\r\n \"requested_to_priority\": \"Normal\",\r\n \"description\": \"test\",\r\n \"status\": \"Pending\",\r\n \"company_desc\": null,\r\n \"department_desc\": null,\r\n \"requested_desc\": null,\r\n \"requested_to_template_id\": \"test555\",\r\n \"requested_to_company\": \"COMPANY-20190923-0000001\",\r\n \"requested_to_department\": \"DEPARTMENT-20191004-0000026\",\r\n \"requested_to_user\": \"USER-20191004-0000087\",\r\n \"requested_by_user\": \"USER-20191004-0000087\",\r\n \"requested_by_department\": \"DEPARTMENT-20191004-0000026\",\r\n \"template_no\": \"TMP-20191004-0000044\",\r\n \"frm_approvers\": [\r\n \t{\r\n \"level\": 1,\r\n \"delegation\": \"Head of Department\",\r\n \"user\": \"USER-20191004-0000082\"\r\n \t}\r\n ],\r\n \"frm_stakes\": [],\r\n \"frm_attachments\": [],\r\n \"frm_details\": []\r\n}"
"raw": "{\r\n \"requested_to_template_name\": \"XXXXXXX\",\r\n \"requested_to_objective\": \"tesa\",\r\n \"requested_to_target_date\": \"2020-05-24T04:37:36.611000\",\r\n \"requested_to_priority\": \"Normal\",\r\n \"description\": \"test\",\r\n \"status\": \"Pending\",\r\n \"company_desc\": null,\r\n \"department_desc\": null,\r\n \"requested_desc\": null,\r\n \"requested_to_template_id\": \"test555\",\r\n \"requested_to_company\": \"COMPANY-20191025-0000017\",\r\n \"requested_to_department\": \"DEPARTMENT-20191025-0000050\",\r\n \"requested_to_user\": \"USER-20191025-0000150\",\r\n \"requested_by_user\": \"USER-20191025-0000151\",\r\n \"requested_by_department\": \"DEPARTMENT-20191025-0000050\",\r\n \"template_no\": \"TMP-20191025-0000032\",\r\n \"frm_approvers\": [\r\n \t{\r\n \"level\": 1,\r\n \"delegation\": \"Head of Department\",\r\n \"user\": \"USER-20191025-0000149\"\r\n \t}\r\n ],\r\n \"frm_stakes\": [],\r\n \"frm_attachments\": [],\r\n \"frm_details\": []\r\n}"
},
"url": {
"raw": "{{baseurl}}/change-request/form-post/",
......@@ -1603,26 +1680,7 @@
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
""
]
}
},
"response": []
},
{
"name": "List of Forms Copy",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form/?date_modified_from=2019-10-11&date_modified_to=2019-10-11",
"raw": "{{baseurl}}/change-request/form/?company_requested_to=COMPANY-20191004-0000011&department_requested_to=DEPARTMENT-20191004-0000029&form_type=closed&date_modified_from=2019-10-11&date_modified_to=2019-10-11",
"host": [
"{{baseurl}}"
],
......@@ -1634,18 +1692,15 @@
"query": [
{
"key": "company_requested_to",
"value": "COMPANY-20191004-0000011",
"disabled": true
"value": "COMPANY-20191004-0000011"
},
{
"key": "department_requested_to",
"value": "DEPARTMENT-20191004-0000029",
"disabled": true
"value": "DEPARTMENT-20191004-0000029"
},
{
"key": "form_type",
"value": "closed",
"disabled": true
"value": "closed"
},
{
"key": "date_modified_from",
......@@ -1680,27 +1735,6 @@
},
"response": []
},
{
"name": "Re Route for Approval",
"request": {
"method": "PATCH",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/form/FRM-20190930-0000035/re_route/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
"FRM-20190930-0000035",
"re_route",
""
]
}
},
"response": []
},
{
"name": "Resubmit",
"request": {
......@@ -1736,7 +1770,7 @@
],
"body": {
"mode": "raw",
"raw": "{\r\n \"id\": 530,\r\n \"form_code\": \"FRM-20191017-0000135\",\r\n \"delegation\": \"Head of Department\",\r\n \"action\": \"Rejected\",\r\n \"level\": \"1\",\r\n \"remarks\": \"This is rejected by approver before vendor\"\r\n}",
"raw": "{\r\n \"id\": 369,\r\n \"form_code\": \"FRM-20191025-0000041\",\r\n \"delegation\": \"Vendor/Implementor\",\r\n \"action\": \"Completed\",\r\n \"level\": \"2\",\r\n \"remarks\": \"\"\r\n}",
"options": {
"raw": {
"language": "json"
......@@ -1947,14 +1981,14 @@
"raw": ""
},
"url": {
"raw": "{{baseurl}}/change-request/form/FRM-20191007-0000078/history/",
"raw": "{{baseurl}}/change-request/form/FRM-20191025-0000040/history/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
"FRM-20191007-0000078",
"FRM-20191025-0000040",
"history",
""
]
......@@ -1976,7 +2010,7 @@
],
"body": {
"mode": "raw",
"raw": "{\r\n\t\"attachments\": [\r\n\t\t{\r\n\t\t\t\"id\": 2,\r\n\t\t\t\"attachment_type\": \"Before\",\r\n\t\t\t\"attachment_name\": \"we\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"we\",\r\n\t\t\t\"file_upload\": 140,\r\n\t\t\t\"uploaded_by\": \"USER-20191004-0000098\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"attachment_type\": \"hello\",\r\n\t\t\t\"attachment_name\": \"hello name\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"hello desc\",\r\n\t\t\t\"file_upload\": 139,\r\n\t\t\t\"attachment_no\": \"\",\r\n\t\t\t\"date_uploaded\": \"\",\r\n\t\t\t\"file\": \"\",\r\n\t\t\t\"template_no\": \"\",\r\n\t\t\t\"upload_no\": \"\"\r\n\t\t}\r\n\t]\r\n}\r\n",
"raw": "{\r\n\t\"attachments\": [\r\n\t\t{\r\n\t\t\t\"attachment_type\": \"Before\",\r\n\t\t\t\"attachment_name\": \"we\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"we\",\r\n\t\t\t\"file_upload\": 302,\r\n\t\t\t\"uploaded_by\": \"USER-20191004-0000098\"\r\n\t\t},\r\n\t\t{\r\n\t\t\t\"attachment_type\": \"hello\",\r\n\t\t\t\"attachment_name\": \"hello name\",\r\n\t\t\t\"file_name\": \"logo_oneberry.png\",\r\n\t\t\t\"description\": \"hello desc\",\r\n\t\t\t\"file_upload\": 63,\r\n\t\t\t\"attachment_no\": \"\",\r\n\t\t\t\"date_uploaded\": \"\",\r\n\t\t\t\"file\": \"\",\r\n\t\t\t\"template_no\": \"\",\r\n\t\t\t\"upload_no\": \"\"\r\n\t\t}\r\n\t]\r\n}\r\n",
"options": {
"raw": {
"language": "json"
......@@ -1984,14 +2018,14 @@
}
},
"url": {
"raw": "{{baseurl}}/change-request/form/FRM-20191004-0000072/file_upload/",
"raw": "{{baseurl}}/change-request/form/FRM-20191029-0000171/file_upload/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"form",
"FRM-20191004-0000072",
"FRM-20191029-0000171",
"file_upload",
""
]
......@@ -2272,14 +2306,14 @@
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/change-request/template/TMP-20191022-0000092/",
"raw": "{{baseurl}}/change-request/template/TMP-20191025-0000032/",
"host": [
"{{baseurl}}"
],
"path": [
"change-request",
"template",
"TMP-20191022-0000092",
"TMP-20191025-0000032",
""
]
}
......@@ -2805,7 +2839,7 @@
"raw": ""
},
"url": {
"raw": "{{baseurl}}/management/notifications/?account_no=USER-20190927-0000011",
"raw": "{{baseurl}}/management/notifications/?account_no=USER-20191025-0000155&app=ams",
"host": [
"{{baseurl}}"
],
......@@ -2817,7 +2851,11 @@
"query": [
{
"key": "account_no",
"value": "USER-20190927-0000011"
"value": "USER-20191025-0000155"
},
{
"key": "app",
"value": "ams"
}
]
}
......@@ -3070,6 +3108,25 @@
}
},
"response": []
},
{
"name": "List Asset Group",
"request": {
"method": "GET",
"header": [],
"url": {
"raw": "{{baseurl}}/asset-management/asset-group/",
"host": [
"{{baseurl}}"
],
"path": [
"asset-management",
"asset-group",
""
]
}
},
"response": []
}
],
"protocolProfileBehavior": {},
......@@ -3084,7 +3141,7 @@
"bearer": [
{
"key": "token",
"value": "1e3ef7cc7a343b5fa0b54bd2d1699cfee6ca6afe",
"value": "76b9d1a5c987488501f106346dee80e1dc4afeb1",
"type": "string"
}
]
......
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