From e098cf03b27bfa84e3237b4ff2d840e9691e27ef Mon Sep 17 00:00:00 2001 From: Horilla Date: Thu, 23 Nov 2023 00:22:19 +0530 Subject: [PATCH] [UPDT] LEAVE: Sending mail to reporting managers while request creation and related activities --- .../leave_request_template.html | 50 +++++++++++++++ base/threading.py | 62 +++++++++++++++++++ leave/filters.py | 1 + leave/forms.py | 4 +- .../leave/leave_request/group_by.html | 2 +- leave/views.py | 13 ++++ 6 files changed, 129 insertions(+), 3 deletions(-) create mode 100644 base/templates/base/mail_templates/leave_request_template.html create mode 100644 base/threading.py diff --git a/base/templates/base/mail_templates/leave_request_template.html b/base/templates/base/mail_templates/leave_request_template.html new file mode 100644 index 000000000..3eae19ff1 --- /dev/null +++ b/base/templates/base/mail_templates/leave_request_template.html @@ -0,0 +1,50 @@ +{% load i18n %} + + + + + + + {{ subject }} + + +
+

{{ subject }}

+ +

+ {% trans "Employee:" %} {{ leave_request.employee_id }} +

+

+ {% trans "Reject Reason:" %} + {{leave_request.reject_reason }} +

+

+ {% trans "Start Date:" %} {{ leave_request.start_date }} +

+

+ {% trans "End Date:" %} {{ leave_request.end_date }} +

+ +

+ {% trans "Description:" %}

{{ leave_request.description }} +

+ +

+ {% trans "Click" %} + {% trans "here" %} {% trans "to view the leave request." %} +

+ +

+ {% trans "This is an automated message. Please do not reply." %} +

+
+ + diff --git a/base/threading.py b/base/threading.py new file mode 100644 index 000000000..f24b0f17e --- /dev/null +++ b/base/threading.py @@ -0,0 +1,62 @@ +from django.contrib import messages +from django.core.mail import send_mail +from threading import Thread +from django.conf import settings +from django.utils.translation import gettext as _ +from django.template.loader import get_template + + + +class MailSendThread(Thread): + def __init__(self, request, leave_request,type): + Thread.__init__(self) + self.request = request + self.leave_request = leave_request + self.type = type + + def run(self): + try: + protocol = 'https' if self.request.is_secure() else 'http' + send_to = self.leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id + subject = _("**New leave request created**") + url = f"{protocol}://{self.request.get_host()}/leave/request-view?id={self.leave_request.id}" + + if self.type == "request": + body = _(f"A new leave request has been created for {self.leave_request.employee_id}. Click here to go to the leave request view: {url}") + + elif self.type == "approve": + subject = _(f"**Leave Request Approved**") + send_to = self.leave_request.employee_id.email + url = f"{protocol}://{self.request.get_host()}/leave/user-request-view?id={self.leave_request.id}" + body = _(f"Your leave request has been Approved by {self.request.user.employee_get.get_full_name()}. Click here to go to the leave request view: {url}") + + elif self.type == "reject": + subject = _("**Leave Request Rejected**") + send_to = self.leave_request.employee_id.email + url = f"{protocol}://{self.request.get_host()}/leave/user-request-view?id={self.leave_request.id}" + body = _(f"Your leave request has been Rejected by {self.request.user.employee_get.get_full_name()}. Click here to go to the leave request view: {url}") + + elif self.type == "cancel": + subject = _("**New Cancellation Request**") + body = _(f"A leave request needs to be cancelled for {self.leave_request.employee_id}. Click here to go to the leave request view: {url}") + + + template_path = 'base/mail_templates/leave_request_template.html' + html_template = get_template(template_path) + + context = { + 'subject': subject, + 'leave_request': self.leave_request, + 'url': url, + } + email_body = html_template.render(context) + + + res = send_mail( + subject, body, settings.EMAIL_HOST_USER, [send_to], fail_silently=False, html_message=email_body + ) + if res==1: + messages.success(self.request, _(f"Mail has been send to {self.leave_request.employee_id.employee_work_info.reporting_manager_id.employee_user_id}")) + + except Exception as e: + print(f"Could not send the mail to {send_to}. Error: {e}") \ No newline at end of file diff --git a/leave/filters.py b/leave/filters.py index 6e58dd0c7..025e8680e 100644 --- a/leave/filters.py +++ b/leave/filters.py @@ -195,6 +195,7 @@ class LeaveRequestFilter(FilterSet): model = LeaveRequest fields = [ + "id", "leave_type_id", "status", "department_name", diff --git a/leave/forms.py b/leave/forms.py index 869f3a021..f8a7d8091 100644 --- a/leave/forms.py +++ b/leave/forms.py @@ -278,8 +278,8 @@ class LeaveRequestCreationForm(ModelForm): class Meta: model = LeaveRequest fields = [ - "leave_type_id", "employee_id", + "leave_type_id", "start_date", "start_date_breakdown", "end_date", @@ -608,7 +608,7 @@ class UserLeaveRequestCreationForm(ModelForm): cleaned_data["requested_days"] = requested_days if not requested_days <= total_leave_days: - raise forms.ValidationError(_("Employee doesn't have enough ppp leave days..")) + raise forms.ValidationError(_("Employee doesn't have enough leave days..")) return cleaned_data diff --git a/leave/templates/leave/leave_request/group_by.html b/leave/templates/leave/leave_request/group_by.html index eca4c5108..4b02c5dad 100644 --- a/leave/templates/leave/leave_request/group_by.html +++ b/leave/templates/leave/leave_request/group_by.html @@ -73,7 +73,7 @@ {% for leave_request in leave_request_list.list %}
-
diff --git a/leave/views.py b/leave/views.py index ce6cbd5c5..91e242372 100644 --- a/leave/views.py +++ b/leave/views.py @@ -19,6 +19,7 @@ from django.utils.translation import gettext_lazy as _ from horilla.decorators import login_required, hx_request_required from horilla.decorators import permission_required, manager_can_enter from base.methods import closest_numbers, export_data +from base.threading import MailSendThread from base.models import * from base.methods import ( filtersubordinates, @@ -570,6 +571,9 @@ def leave_request_approve(request, id, emp_id=None): icon="people-circle", redirect="/leave/user-request-view", ) + + mail_thread = MailSendThread(request, leave_request, type="approve") + mail_thread.start() else: messages.error( request, @@ -636,6 +640,9 @@ def leave_request_cancel(request, id, emp_id=None): icon="people-circle", redirect="/leave/user-request-view", ) + + mail_thread = MailSendThread(request, leave_request, type="reject") + mail_thread.start() if emp_id is not None: employee_id = emp_id return redirect(f"/employee/employee-view/{employee_id}/") @@ -676,6 +683,9 @@ def user_leave_cancel(request, id): messages.success( request, _("Leave request cancelled successfully..") ) + + mail_thread = MailSendThread(request, leave_request, type="cancel") + mail_thread.start() return HttpResponse("") return render( request, @@ -2446,6 +2456,9 @@ def leave_request_create(request): icon="people-circle", redirect="/leave/request-view", ) + + mail_thread = MailSendThread(request, leave_request, type="request") + mail_thread.start() response = render( request, "leave/user_leave/request_form.html", {"form": form} )