Skip to content

Commit

Permalink
Merge pull request #18 from shibaken/compliance_mgt
Browse files Browse the repository at this point in the history
shibaken/compliance-mgt to djandwich/compliance-mgt
  • Loading branch information
Djandwich authored Mar 5, 2021
2 parents 41f9851 + adc98a5 commit 3dabd72
Show file tree
Hide file tree
Showing 14 changed files with 191 additions and 95 deletions.
144 changes: 79 additions & 65 deletions wildlifecompliance/components/sanction_outcome/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,10 +35,12 @@
send_caution_notice, send_letter_of_advice, send_parking_infringement_without_offenders, \
send_remediation_action_submitted_notice, send_remediation_action_accepted_notice, \
send_remediation_action_request_amendment_mail, send_infringement_notice_issued_on_paper, \
send_remediation_notice_issued_on_paper
send_remediation_notice_issued_on_paper, create_infringement_notice_ybw
from wildlifecompliance.components.sanction_outcome.models import SanctionOutcome, RemediationAction, \
SanctionOutcomeCommsLogEntry, AllegedCommittedOffence, SanctionOutcomeUserAction, SanctionOutcomeCommsLogDocument, \
AmendmentRequestReason, SanctionOutcomeDocument, SanctionOutcomeDocumentAccessLog
from wildlifecompliance.components.sanction_outcome.pdf import create_remediation_notice_pdf, create_caution_notice_pdf, \
create_letter_of_advice_pdf
from wildlifecompliance.components.sanction_outcome.serializers import SanctionOutcomeSerializer, \
SaveSanctionOutcomeSerializer, SaveRemediationActionSerializer, SanctionOutcomeDatatableSerializer, \
UpdateAssignedToIdSerializer, SanctionOutcomeCommsLogEntrySerializer, SanctionOutcomeUserActionSerializer, \
Expand Down Expand Up @@ -1030,26 +1032,32 @@ def send_parking_infringement(self, request, instance=None, *args, **kwargs):
try:
with transaction.atomic():
instance = self.get_object() if not instance else instance
instance.endorse_parking_infringement()
# instance.endorse_parking_infringement()

workflow_entry = self.add_comms_log(request, instance, workflow=True)
instance.endorse()
if not instance.issued_on_paper:
attachments = create_infringement_notice_ybw(instance, workflow_entry)

# Log action
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE_AND_ISSUE.format(instance.lodgement_number), request)

# Email to the offender, and bcc to the respoinsible officer, manager and infringement notice coordinators
inc_group = SanctionOutcome.get_compliance_permission_group(None, SanctionOutcome.WORKFLOW_ENDORSE)
inc_emails = [member.email for member in inc_group.members]
to_address = [instance.get_offender()[0].email, ]
cc = None
bcc = [instance.responsible_officer.email, request.user.email] + inc_emails
email_data = send_infringement_notice(to_address, instance, workflow_entry, request, cc, bcc)
# inc_group = SanctionOutcome.get_compliance_permission_group(None, SanctionOutcome.WORKFLOW_ENDORSE)
# inc_emails = [member.email for member in inc_group.members]
# to_address = [instance.get_offender()[0].email, ]
# cc = None
# bcc = [instance.responsible_officer.email, request.user.email] + inc_emails
# email_data = send_infringement_notice(to_address, instance, workflow_entry, request, cc, bcc)

# Log the above email as a communication log entry
if email_data:
email_data['sanction_outcome'] = instance.id
serializer = SanctionOutcomeCommsLogEntrySerializer(instance=workflow_entry, data=email_data, partial=True)
serializer.is_valid(raise_exception=True)
serializer.save()
# if email_data:
# email_data['sanction_outcome'] = instance.id
# serializer = SanctionOutcomeCommsLogEntrySerializer(instance=workflow_entry, data=email_data, partial=True)
# serializer.is_valid(raise_exception=True)
# serializer.save()

instance.log_user_action(SanctionOutcomeUserAction.ACTION_ISSUE_PARKING_INFRINGEMENT.format(instance.lodgement_number, ', '.join(to_address)), request)
# instance.log_user_action(SanctionOutcomeUserAction.ACTION_ISSUE_PARKING_INFRINGEMENT.format(instance.lodgement_number, ', '.join(to_address)), request)

return Response(
# return_serializer.data,
Expand Down Expand Up @@ -1121,7 +1129,7 @@ def extend_due_date(self, request, instance=None, *args, **kwargs):
workflow_entry = instance.comms_logs.get(id=comms_log_id)
else:
workflow_entry = self.add_comms_log(request, instance, workflow=True)
workflow_entry.text = 'test katsu'
# workflow_entry.text = 'test katsu'
workflow_entry.save()

new_due_date = request.data.get('new_due_date', None)
Expand Down Expand Up @@ -1216,74 +1224,77 @@ def workflow_action(self, request, instance=None, *args, **kwargs):
email_data = send_decline_email(to_address, instance, workflow_entry, request, cc, bcc)

elif workflow_type == SanctionOutcome.WORKFLOW_ENDORSE:
if instance.type in (SO_TYPE_LETTER_OF_ADVICE, SO_TYPE_CAUTION_NOTICE):
instance.endorse(request)
if instance.type == SO_TYPE_LETTER_OF_ADVICE:
instance.endorse()
if not instance.issued_on_paper:
to_address = [instance.get_offender()[0].email, ]
cc = None
bcc = [member.email for member in instance.allocated_group.members]
if instance.type == SO_TYPE_CAUTION_NOTICE:
email_data = send_caution_notice(to_address, instance, workflow_entry, request, cc, bcc)
else:
email_data = send_letter_of_advice(to_address, instance, workflow_entry, request, cc, bcc)
pdf_file_name = 'letter_of_advice_{}_{}.pdf'.format(instance.lodgement_number, datetime.now().strftime("%Y%m%d%H%M%S"))
document = create_letter_of_advice_pdf(pdf_file_name, instance)

# Action log for endorsement and issuance
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE_AND_ISSUE.format(instance.lodgement_number), request)
instance.status = SanctionOutcome.STATUS_AWAITING_PRINT_AND_POST
instance.save()
else:
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE.format(instance.lodgement_number), request)
instance.status = SanctionOutcome.STATUS_CLOSED
instance.log_user_action(SanctionOutcomeUserAction.ACTION_CLOSE.format(instance.lodgement_number), request)
instance.save()

# close letter_of_advice/caution_notice
instance.status = SanctionOutcome.STATUS_CLOSED
instance.save()
elif instance.type == SO_TYPE_CAUTION_NOTICE:
instance.endorse()
if not instance.issued_on_paper:
pdf_file_name = 'caution_notice_{}_{}.pdf'.format(instance.lodgement_number, datetime.now().strftime("%Y%m%d%H%M%S"))
document = create_caution_notice_pdf(pdf_file_name, instance)

# Action log for closure of this instance
instance.log_user_action(SanctionOutcomeUserAction.ACTION_CLOSE.format(instance.lodgement_number),
request)
elif not instance.is_parking_offence or (instance.is_parking_offence and instance.offender):
instance.endorse(request)
# Action log for endorsement and issuance
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE_AND_ISSUE.format(instance.lodgement_number), request)
instance.status = SanctionOutcome.STATUS_AWAITING_PRINT_AND_POST
instance.save()
else:
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE.format(instance.lodgement_number), request)
instance.status = SanctionOutcome.STATUS_CLOSED
instance.log_user_action(SanctionOutcomeUserAction.ACTION_CLOSE.format(instance.lodgement_number), request)
instance.save()

elif instance.type == SO_TYPE_REMEDIATION_NOTICE:
instance.endorse()
if not instance.issued_on_paper:
# Email to the offender, and bcc to the respoinsible officer, manager and infringement notice coordinators
inc_group = SanctionOutcome.get_compliance_permission_group(None, SanctionOutcome.WORKFLOW_ENDORSE)
inc_emails = [member.email for member in inc_group.members]
to_address = [instance.get_offender()[0].email, ]
cc = None
bcc = [instance.responsible_officer.email, request.user.email] + inc_emails
if instance.type == SO_TYPE_INFRINGEMENT_NOTICE:
email_data = send_infringement_notice(to_address, instance, workflow_entry, request, cc, bcc)
# email_data = send_remediation_notice(to_address, instance, workflow_entry, request, cc, bcc)
pdf_file_name = 'remediation_notice_{}_{}.pdf'.format(instance.lodgement_number, datetime.now().strftime( "%Y%m%d%H%M%S"))
document = create_remediation_notice_pdf(pdf_file_name, instance)
else:
# Nothing to do here. All done in the instance.endorse() method
pass
elif instance.type == SO_TYPE_INFRINGEMENT_NOTICE:
# This is Infringement Notice
if not instance.is_parking_offence or (instance.is_parking_offence and instance.offender):
instance.endorse()
if not instance.issued_on_paper:
attachments = create_infringement_notice_ybw(instance, workflow_entry)

# Log action
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE_AND_ISSUE.format(instance.lodgement_number), request)
else:
email_data = send_remediation_notice(to_address, instance, workflow_entry, request, cc, bcc)

# Log action
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE_AND_ISSUE.format(instance.lodgement_number), request)
# Nothing to do here. All done in the instance.endorse() method
pass
else:
# Email
# This is a parking infringement but no offenders are set
instance.send_to_inc()

inc_group = SanctionOutcome.get_compliance_permission_group(None, SanctionOutcome.WORKFLOW_ENDORSE)
inc_emails = [member.email for member in inc_group.members]
to_address = inc_emails
cc = [instance.responsible_officer.email,]
bcc = None
if instance.type == fanctionOutcome.TYPE_INFRINGEMENT_NOTICE:
email_data = send_infringement_notice_issued_on_paper(to_address, instance, workflow_entry, request, cc, bcc)
else:
email_data = send_remediation_notice_issued_on_paper(to_address, instance, workflow_entry, request, cc, bcc)
cc = [instance.responsible_officer.email, request.user.email]
bcc = []

# Email to infringement notice coordinators
email_data = send_parking_infringement_without_offenders(to_address, instance, workflow_entry, request, cc, bcc)

# Log action
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE.format(instance.lodgement_number), request)
else:
# This is a parking infringement but no offenders are set
instance.send_to_inc()

inc_group = SanctionOutcome.get_compliance_permission_group(None, SanctionOutcome.WORKFLOW_ENDORSE)
inc_emails = [member.email for member in inc_group.members]
to_address = inc_emails
cc = [instance.responsible_officer.email, request.user.email]
bcc = []

# Email to infringement notice coordinators
email_data = send_parking_infringement_without_offenders(to_address, instance, workflow_entry, request, cc, bcc)

# Log action
instance.log_user_action(SanctionOutcomeUserAction.ACTION_ENDORSE.format(instance.lodgement_number), request)
# Should not reach here
pass

elif workflow_type == SanctionOutcome.WORKFLOW_RETURN_TO_OFFICER:
if not reason:
Expand Down Expand Up @@ -1340,6 +1351,9 @@ def workflow_action(self, request, instance=None, *args, **kwargs):
bcc = None
email_data = send_return_to_infringement_notice_coordinator_email(to_address, instance, workflow_entry, request, cc, bcc)

elif workflow_type == SanctionOutcome.WORKFLOW_MARK_DOCUMENT_POSTED:
instance.mark_document_posted(request)

else:
# Should not reach here
# instance.save()
Expand Down
4 changes: 2 additions & 2 deletions wildlifecompliance/components/sanction_outcome/email.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
from wildlifecompliance.components.main.email import prepare_attachments, _extract_email_headers
from wildlifecompliance.components.sanction_outcome.pdf import create_infringement_notice_pdf, \
create_letter_of_advice_pdf, \
create_caution_notice_pdf, create_remediation_notice_pdf_bytes
create_caution_notice_pdf, create_remediation_notice_pdf

logger = logging.getLogger(__name__)

Expand Down Expand Up @@ -300,7 +300,7 @@ def send_remediation_notice(to_address, sanction_outcome, workflow_entry, reques
}

pdf_file_name = 'remediation_notice_{}_{}.pdf'.format(sanction_outcome.lodgement_number, datetime.datetime.now().strftime("%Y%m%d%H%M%S"))
document = create_remediation_notice_pdf_bytes(pdf_file_name, sanction_outcome)
document = create_remediation_notice_pdf(pdf_file_name, sanction_outcome)

# Attach files (files from the modal, and the PDF file generated above)
attachments = prepare_attachments(workflow_entry.documents)
Expand Down
Loading

0 comments on commit 3dabd72

Please sign in to comment.