Commit 08c9a047 authored by John Red Medrano's avatar John Red Medrano

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

* commit '4efac2cb':
  fixing on download
  attachment update
  added form attachment serializer
  fixing error on history
  added created on history endpoint
  fixing on file upload at edit
  reminder
parents aa4ce06b 4efac2cb
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
CR_FRONT_LINK = settings.CR_FRONT_LINK
class CancelTriggerAPIView(views.APIView):
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'))
)
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:
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
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
department_requestedto = data.form_code.requested_to_department.name
priority_level = data.form_code.requested_to_priority
form_status = data.form_code.status
url = cr_link
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,
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')
list_of_emails.append(data.form_code.form_code)
today_mail.update(is_sent=True)
return Response(
{"list of emails": list_of_emails},
status=status.HTTP_200_OK
)
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
CR_FRONT_LINK = settings.CR_FRONT_LINK
class OverdueTriggerAPIView(views.APIView):
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'))
)
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:
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
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
department_requestedto = data.form_code.requested_to_department.name
priority_level = data.form_code.requested_to_priority
form_status = data.form_code.status
url = cr_link
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,
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')
list_of_emails.append(data.form_code.form_code)
today_mail.update(is_sent=True)
return Response(
{"list of emails": list_of_emails},
status=status.HTTP_200_OK
)
# 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 cms.applicationlayer.utilities import email
# from mongoengine.queryset.visitor import Q
# import requests
# from django.conf import settings
# from datetime import timedelta
# EMAIL = settings.EMAIL
# class ReminderAPIView(views.APIView):
# def get(self, request):
# print(request.META['HTTP_ACCOUNT_NO'])
# date_format = datetime.now()
# next_day = date_format + timedelta(days=1)
# today_mail = models.EmailNotification.objects.filter(
# Q(date_from__lte=date_format.strftime('%Y-%m-%d')) &
# Q(date_to__gte=date_format.strftime('%Y-%m-%d')) &
# Q(date_to_send=date_format.strftime('%Y-%m-%d 00:00:00.000'))
# )[0:25]
# print(len(today_mail))
# list_of_emails = []
# for data in today_mail:
# approver = requests.post(EMAIL, data=data['approver'])
# requestor = requests.post(EMAIL, data=data['requestor'])
# list_of_emails.append(data['approver'])
# list_of_emails.append(data['requestor'])
# today_mail.update(date_to_send=next_day)
# return Response(
# {"list of emails": list_of_emails},
# status=status.HTTP_200_OK
# )
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
CR_FRONT_LINK = settings.CR_FRONT_LINK
class ReminderTriggerAPIView(views.APIView):
def get(self, request):
date_now = datetime.now()
next_day = date_now + timedelta(days=1)
today_mail = models.ReminderTrigger.objects.filter(
Q(date_from__gte=date_now.strftime('%Y-%m-%d 00:00:00.000')) &
Q(date_to__lte=date_now.strftime('%Y-%m-%d 00:00:00.000')) &
Q(date_to_send=date_now.strftime('%Y-%m-%d 00:00:00.000'))
)
# print(today_mail)
list_of_emails = []
for data in today_mail:
if data.frm_approver.is_action == True:
# common details
cr_link = f'{CR_FRONT_LINK}/{data.frm_approver.form_code}'
auto_cancel_date = data.auto_cancel_date.strftime('%B %d, %Y')
date_submitted_last_approver = data.date_submitted_last_approver.strftime('%B %d, %Y')
cr_number = data.frm_approver.form_code.requested_to_template_id
cr_name = data.frm_approver.form_code.requested_to_template_name
company_requestedto = data.frm_approver.form_code.requested_to_company.name
department_requestedto = data.frm_approver.form_code.requested_to_department.name
priority_level = data.frm_approver.form_code.requested_to_priority
form_status = data.frm_approver.form_code.status
url = cr_link
admin = 'Test'
# approver details
name = data.frm_approver.user.name
recipient = data.frm_approver.user.email
args_approver = [name, auto_cancel_date, date_submitted_last_approver,
cr_number, cr_name, company_requestedto, department_requestedto,
priority_level, form_status, url, recipient, admin]
main_threading(args_approver, sender.routing_table_reminder_approver)
list_of_emails.append(data.frm_approver.code)
# requestor details
requestor_name = data.frm_approver.form_code.requested_by_user.name
requestor_recipient = data.frm_approver.form_code.requested_by_user.email
args_requestor = [requestor_name, auto_cancel_date, date_submitted_last_approver,
name, cr_number, cr_name, company_requestedto,
department_requestedto, priority_level, form_status, url,
requestor_recipient, admin]
main_threading(args_requestor, sender.routing_table_reminder_requestor)
today_mail.update(date_to_send=next_day.strftime('%Y-%m-%d 00:00:00.000'))
return Response(
{"list of emails": list_of_emails},
status=status.HTTP_200_OK
)
......@@ -25,4 +25,23 @@ class ChangeRequestFormAttachmentsSerializer(
class Meta:
model = models.ChangeRequestFormAttachments
fields = '__all__'
read_only_fields = ['created', 'code']
\ No newline at end of file
read_only_fields = ['created', 'code']
class ChangeRequestFormAttachmentsFileUploadSerializer(
serializers.ModelSerializer
):
class Meta:
model = models.ChangeRequestFormAttachments
fields = (
'attachment_type',
'attachment_name',
'file_name',
'description',
'file_upload',
'uploaded_by',
'form_code'
)
# read_only_fields = ['created', 'code']
\ No newline at end of file
......@@ -24,48 +24,14 @@ class DownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
permission_classes = (AllowAny,)
def list(self, request, *args, **kwargs):
# id_number = self.request.META.get('HTTP_ACCOUNT_NO')
# id_number = 'USER-20190923-0000001'
# print(request.user.code)
id_number = request.user.code
# id_number = self.request.query_params.get('id_number')
# approver = ChangeRequestFormApprovers.objects.filter(
# Q(user=id_number) &
# Q(deleted_at=None)
# )
# approver = [data['form_code'] for data in approver]
# stake = ChangeRequestFormStakeHolders.objects.filter(
# Q(user=id_number) &
# Q(deleted_at=None)
# )
# stake = [data['form_code'] for data in stake]
data = ChangeRequestFormHeader.objects.filter(
Q(frm_approvers__user__code=id_number) |
Q(requested_by_user=id_number) |
Q(frm_stakes__user__code=id_number)
).distinct()
# print(headers)
# print(headers)
# headers = [data['form_code'] for data in headers]
# form_code = stake + approver + headers
# self.queryset = ChangeRequestFormHeader.objects.filter(
# form_code__in=form_code,
# deleted_at=None,
# )
# exclude = self.queryset.filter(
# status='DRAFT',
# requested_by_user__ne=id_number
# )
# exclude = [data['form_code'] for data in exclude]
# self.queryset = headers
# print(data)
serializer = self.get_serializer(data, many=True)
# print(serializer.data)
serializer = headers(data=data, many=True)
return Response(serializer.data)
column_header = {
......
......@@ -27,7 +27,8 @@ from app.applicationlayer.cms.utils_cr import (number_generator,
get_max_batchno,
generate_template_id,
crhistory_create_save,
entity_log_bulk)
entity_log_bulk,
reminder_trigger_save)
from app.entities import enums
from app.applicationlayer.utils import model_to_dict
......@@ -45,7 +46,9 @@ from app.businesslayer.changerequest.change_request import (
from app.applicationlayer.cms.form.approver.serializers import ChangeRequestFormApproversSerializer
from app.applicationlayer.cms.form.stakeholder.serializers import ChangeRequestFormStakeHoldersSerializer
from app.applicationlayer.cms.form.details.serializers import ChangeRequestFormDetailsSerializer
from app.applicationlayer.cms.form.attachment.serializers import ChangeRequestFormAttachmentsSerializer
from app.applicationlayer.cms.form.attachment.serializers import (
ChangeRequestFormAttachmentsFileUploadSerializer,
ChangeRequestFormAttachmentsSerializer)
from app.applicationlayer.cms.form.header.serializers import (
ChangeRequestFormHeaderSerializer,
ChangeRequestFormHeaderSerializerList)
......@@ -733,23 +736,28 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
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=datetime.now(),
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':
......@@ -1219,7 +1227,8 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
"date_sent" : convert['date_sent'],
"delegation" : convert['delegation'],
"action" : convert['action'],
"remarks" : convert['remarks']
"remarks" : convert['remarks'],
"created": convert['action_date']
}
list_his.append(history_dict)
......@@ -1276,7 +1285,7 @@ class ChangeRequestFormsViewset(viewsets.ModelViewSet):
attach_body['attachments'],
models.ChangeRequestFormAttachments,
enums.CREntitiesEnum.CR_FRM_ATTACHMENT.value,
ChangeRequestFormAttachmentsSerializer,
ChangeRequestFormAttachmentsFileUploadSerializer,
partial,
self,
form_code,
......
......@@ -38,6 +38,11 @@ from app.applicationlayer.cms.form.details import views as detailsform
from app.applicationlayer.cms.form.attachment import views as attachmentform
# FORM
# AUTO_EMAIL
from app.applicationlayer.cms.auto_email import reminder, overdue, cancel
# AUTO_EMAIL
from app.applicationlayer.cms.form.download import views as dl
router = routers.DefaultRouter()
......@@ -80,6 +85,8 @@ urlpatterns = [
path('form-user-list/', UserListForm.as_view(), name="User List"),
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()),
]
# urlpatterns += format_suffix_patterns(urlpatterns)
......
......@@ -67,6 +67,11 @@ def get_allowed_company(id_number):
return requests.get(f'{ALLOWED_COMPANY}?id_number={id_number}')
def get_approver_details(form_code):
active_approver_instance = models.ChangeRequestFormApprovers.objects.filter(
form_code=form_code, is_action=True)
return active_approver_instance
class QuerySetHelper:
@staticmethod
......@@ -520,4 +525,43 @@ def crhistory_create_save(batch_no, main_action,
class BadRequestException(Exception):
pass
\ No newline at end of file
pass
def reminder_trigger_save(form_code,
date_now,
date_submitted_last_approver):
approver_instance = get_approver_details(form_code)
form_instance = models.ChangeRequestFormHeader.objects.get(
form_code=form_code)
date_from = date_now + timedelta(days=7)
date_to = date_now + timedelta(days=29)
auto_cancel_date = date_now + timedelta(days=30)
# create log for auto_email
counter = 0
for approver in approver_instance:
models.ReminderTrigger.objects.create(
frm_approver=approver,
date_from=date_from.strftime('%Y-%m-%d 00:00:00.000'),
date_to=date_to.strftime('%Y-%m-%d 00:00:00.000'),
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
)
if counter == 0:
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=date_submitted_last_approver,
is_sent=False,
frm_approver=approver
)
counter = counter + 1
return True
......@@ -21,30 +21,14 @@ class UserDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
filename = 'User List.xlsx'
permission_classes = (AllowAny,)
# def list(self, request, *args, **kwargs):
def list(self, request, *args, **kwargs):
# # id_number = request.user.code
# id_number = request.user.code
# self.queryset = User.objects.all()
# # print(headers)
# # print(headers)
# # headers = [data['form_code'] for data in headers]
# # form_code = stake + approver + headers
# # self.queryset = ChangeRequestFormHeader.objects.filter(
# # form_code__in=form_code,
# # deleted_at=None,
# # )
# # exclude = self.queryset.filter(
# # status='DRAFT',
# # requested_by_user__ne=id_number
# # )
# # exclude = [data['form_code'] for data in exclude]
# # self.queryset = headers
# # print(data)
# serializer = self.get_serializer(self.queryset, many=True)
# # print(serializer.data)
# return Response(serializer.data)
data = User.objects.all()
serializer = headers(data=data, many=True)
serializer.is_valid(raise_exception=False)
return Response(serializer.data)
column_header = {
'titles': [
......
......@@ -21,34 +21,14 @@ class CompanyDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
filename = 'Company List.xlsx'
permission_classes = (AllowAny,)
# def list(self, request, *args, **kwargs):
def list(self, request, *args, **kwargs):
# id_number = request.user.code
# id_number = request.user.code
# data = ChangeRequestFormHeader.objects.filter(
# Q(frm_approvers__user__code=id_number) |
# Q(requested_by_user=id_number) |
# Q(frm_stakes__user__code=id_number)
# ).distinct()
# # print(headers)
# # print(headers)
# # headers = [data['form_code'] for data in headers]
# # form_code = stake + approver + headers
# # self.queryset = ChangeRequestFormHeader.objects.filter(
# # form_code__in=form_code,
# # deleted_at=None,
# # )
# # exclude = self.queryset.filter(
# # status='DRAFT',
# # requested_by_user__ne=id_number
# # )
# # exclude = [data['form_code'] for data in exclude]
# # self.queryset = headers
# # print(data)
# serializer = self.get_serializer(data, many=True)
# # print(serializer.data)
# return Response(serializer.data)
data = Company.objects.all()
serializer = headers(data=data, many=True)
serializer.is_valid(raise_exception=False)
return Response(serializer.data)
column_header = {
'titles': [
......
......@@ -21,34 +21,14 @@ class DepartmentDownloadRequest(XLSXFileMixin, ReadOnlyModelViewSet):
filename = 'Department List.xlsx'
permission_classes = (AllowAny,)
# def list(self, request, *args, **kwargs):
def list(self, request, *args, **kwargs):
# id_number = request.user.code
# id_number = request.user.code
# data = ChangeRequestFormHeader.objects.filter(
# Q(frm_approvers__user__code=id_number) |
# Q(requested_by_user=id_number) |
# Q(frm_stakes__user__code=id_number)
# ).distinct()
# # print(headers)
# # print(headers)
# # headers = [data['form_code'] for data in headers]
# # form_code = stake + approver + headers
# # self.queryset = ChangeRequestFormHeader.objects.filter(
# # form_code__in=form_code,
# # deleted_at=None,
# # )
# # exclude = self.queryset.filter(
# # status='DRAFT',
# # requested_by_user__ne=id_number
# # )
# # exclude = [data['form_code'] for data in exclude]
# # self.queryset = headers
# # print(data)
# serializer = self.get_serializer(data, many=True)
# # print(serializer.data)
# return Response(serializer.data)
data = Department.objects.all()
serializer = headers(data=data, many=True)
serializer.is_valid(raise_exception=False)
return Response(serializer.data)
column_header = {
'titles': [
......
......@@ -371,17 +371,21 @@ def attachment_add_edit_delete(form_request_body,
}
data = {**i, **frm_code}
serializer = serializer_data(frm_instance,
data=data,
partial=partial)
serializer.is_valid(raise_exception=True)
old_instance = model_to_dict(frm_instance)
if not data_old == i:
serializer = serializer_data(frm_instance,
data=data,
partial=partial)
serializer.is_valid(raise_exception=True)
self.perform_update(serializer)
new_instance = serializer.data
# comment
#
print(new_instance)
crhistory_save(
batch_no,
main_action,
......
# Generated by Django 2.2 on 2019-10-14 16:31
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('entities', '0017_auto_20191009_1640'),
]
operations = [
migrations.CreateModel(
name='ReminderTrigger',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('auto_cancel_date', models.DateTimeField(blank=True, null=True)),
('date_submitted_last_approver', models.DateTimeField(blank=True, null=True)),
('date_from', models.DateTimeField(blank=True, null=True)),
('date_to', models.DateTimeField(blank=True, null=True)),
('date_to_send', models.DateTimeField(blank=True, null=True)),
('is_sent', models.BooleanField(default=False)),
('frm_approver', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormApprovers', to_field='code')),
],
options={
'db_table': 'reminder_trigger',
},
),
migrations.CreateModel(
name='OverdueTrigger',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('overdue_date', models.DateTimeField(blank=True, null=True)),
('is_sent', models.BooleanField(default=False)),
('form_code', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormHeader', to_field='form_code')),
],
options={
'db_table': 'overdue_trigger',
},
),
migrations.CreateModel(
name='CancelTrigger',
fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
('auto_cancel_date', models.DateTimeField(blank=True, null=True)),
('is_sent', models.BooleanField(default=False)),
('date_submitted_last_approver', models.DateTimeField(blank=True, null=True)),
('form_code', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormHeader', to_field='form_code')),
('frm_approver', models.ForeignKey(on_delete=django.db.models.deletion.PROTECT, to='entities.ChangeRequestFormApprovers', to_field='code')),
],
options={
'db_table': 'cancel_trigger',
},
),
]
......@@ -1006,49 +1006,65 @@ class AllowedCompany(models.Model):
db_table = 'allowed_company'
# class EmailNotification(models.Model):
# cr_number = models.CharField(
# null=True,
# blank=True)
# approver = models.CharField(
# null=True,
# blank=True)
# requestor = models.CharField(
# null=True,
# blank=True)
# date_from = models.DateTimeField(
# null=True,
# blank=True)
# date_to = models.DateTimeField(
# null=True,
# blank=True)
# date_to_send = models.DateTimeField(
# null=True,
# blank=True)
class ReminderTrigger(models.Model):
frm_approver = models.ForeignKey(
ChangeRequestFormApprovers,
on_delete=models.PROTECT,
to_field='code')
auto_cancel_date = models.DateTimeField(
null=True,
blank=True)
date_submitted_last_approver = models.DateTimeField(
null=True,
blank=True)
date_from = models.DateTimeField(
null=True,
blank=True)
date_to = models.DateTimeField(
null=True,
blank=True)
date_to_send = models.DateTimeField(
null=True,
blank=True)
is_sent = models.BooleanField(
default=False)
# class Meta:
# db_table = 'email_notification'
class Meta:
db_table = 'reminder_trigger'
# class CancelDateCR(Document):
# meta = {'collection': 'cancel_date_change_request'}
class CancelTrigger(models.Model):
form_code = models.ForeignKey(
ChangeRequestFormHeader,
on_delete=models.PROTECT,
to_field='form_code')
frm_approver = models.ForeignKey(
ChangeRequestFormApprovers,
on_delete=models.PROTECT,
to_field='code')
auto_cancel_date = models.DateTimeField(
null=True,
blank=True)
is_sent = models.BooleanField(
default=False)
date_submitted_last_approver = models.DateTimeField(
null=True,
blank=True)
# cr_number = fields.StringField(required=True)
# trigger_date = fields.DateTimeField(required=True)
# deleted_at = fields.DateTimeField(required=False, null=True)
# is_sent = fields.BooleanField(default=False)
# date_submitted_last_approver = fields.StringField(required=False)
# approver_pending_action = fields.StringField(required=False)
# email_content = fields.DictField(required=True)
# class Meta:
# db_table = 'email_notification'
class Meta:
db_table = 'cancel_trigger'
# class TargetDateOverdue(Document):
# meta = {'collection': 'target_date_overdue'}
# cr_number = fields.StringField(required=True)
# trigger_date = fields.DateTimeField(required=True)
# is_sent = fields.BooleanField(default=False)
# email_content = fields.DictField(required=True)
\ No newline at end of file
class OverdueTrigger(models.Model):
form_code = models.ForeignKey(
ChangeRequestFormHeader,
on_delete=models.PROTECT,
to_field='form_code')
overdue_date = models.DateTimeField(
null=True,
blank=True)
is_sent = models.BooleanField(
default=False)
class Meta:
db_table = 'overdue_trigger'
\ No newline at end of file
......@@ -691,7 +691,7 @@ def routing_table_reminder_approver(args):
recipient = args[10]
admin = args[11]
F = open(os.path.join(settings.EMAIL_TEMPLATES_ROOT, 'RMS-REMINDER-APPROVER.html'), 'r')
FC = F.read()
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment