From 8074745fdf58d081ef1cc511abb6b75732b51622 Mon Sep 17 00:00:00 2001 From: carnesa Date: Mon, 22 Jun 2026 21:16:42 +0000 Subject: [PATCH 01/10] Created an email template in base.data.py for accademic advisors. Applied template in emailhandler.py and pulled advisor email from student account as email recipient. --- app/logic/emailHandler.py | 19 ++++++++++++++++--- database/base_data.py | 9 +++++++++ 2 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index 1de8ef492..b785341b2 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -29,6 +29,7 @@ def __init__(self, formHistoryKey): self.studentEmail = self.student.STU_EMAIL self.creatorEmail = self.formHistory.createdBy.email self.supervisorEmail = self.laborStatusForm.supervisor.EMAIL + self.advisorEmail = self.student.ADVISOR self.date = self.laborStatusForm.startDate.strftime("%m/%d/%Y") self.weeklyHours = str(self.laborStatusForm.weeklyHours) self.contractHours = str(self.laborStatusForm.contractHours) @@ -256,7 +257,12 @@ def LaborOverLoadFormSubmittedNotification(self): def LaborOverLoadFormApproved(self): self.checkRecipient("Labor Overload Form Approved For Student", "Labor Overload Form Approved For Supervisor", - "Labor Overload Form Approved For Financial Aid") + "Labor Overload Form Approved For Financial Aid", + "Labor Overload Form Submitted For Academic Advisor") + # Ignore and remove later. + def LaborOverLoadFormApprovedAdvisorEmail(self): + """ This email is sent to the student's academic advisor when the overload form is approved by the labor office and is waiting for their approval. """ + self.checkRecipient(False, False, "Labor Overload Form Approved and sent to Advisor") def LaborOverLoadFormRejected(self): self.checkRecipient("Labor Overload Form Rejected For Student", @@ -321,7 +327,7 @@ def overloadVerification(self, dept, link): # # self.send(message) - def checkRecipient(self, studentEmailPurpose=False, emailPurpose=False, secondaryEmailPurpose=False): + def checkRecipient(self, studentEmailPurpose=False, emailPurpose=False, secondaryEmailPurpose=False, advisorEmailPurpose=False): """ This method will take in two to three inputs of email purposes. An email to the student is always sent. The method then checks whether to send the email to only the primary or both the primary and secondary supervisors. @@ -344,7 +350,9 @@ def checkRecipient(self, studentEmailPurpose=False, emailPurpose=False, secondar self.sendEmail(primaryEmail, "Labor Office") else: self.sendEmail(primaryEmail, "supervisor") - + if advisorEmailPurpose: + advisorEmail = EmailTemplate.get(EmailTemplate.purpose == advisorEmailPurpose) + self.sendEmail(advisorEmail, "Academic Advisor") # Depending on the parameter 'sendTo', this method will send the email either to the Primary, Secondary, or the Student def sendEmail(self, template, sendTo): formTemplate = template.body @@ -378,6 +386,11 @@ def sendEmail(self, template, sendTo): message = Message(template.subject, recipients=[self.adminEmail]) recipient = 'Admin' + # Ignore and remove later. + elif sendTo == "Academic Advisor": + message = Message(template.subject, + recipients=[self.advisorEmail]) # Change this to academic advisor email class once we have that set up. + recipient = 'Academic Advisor' message.html = formTemplate newEmailTracker = EmailTracker.create( diff --git a/database/base_data.py b/database/base_data.py index c081fb752..1980659f7 100644 --- a/database/base_data.py +++ b/database/base_data.py @@ -368,6 +368,15 @@ "audience":"Supervisor" }, { + "purpose":"Labor Overload Form Submitted For Academic Advisor", + "formType":"Labor Overload Form", + "action":"Submitted", + "subject":"Labor Overload Form Submitted", + "body":''' + ''', + "audience":"Academic Advisor" + }, + { "purpose":"Labor Overload Form Approved For Student", "formType":"Labor Overload Form", "action":"Approved", From 878f796a6b04faacd5b0e0eafa3200ee209ac944 Mon Sep 17 00:00:00 2001 From: carnesa Date: Tue, 23 Jun 2026 13:19:20 +0000 Subject: [PATCH 02/10] Removed comment and commented out function that may be removed in the future in emailHandler.py. --- app/logic/emailHandler.py | 1 - 1 file changed, 1 deletion(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index b785341b2..7f14acddd 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -386,7 +386,6 @@ def sendEmail(self, template, sendTo): message = Message(template.subject, recipients=[self.adminEmail]) recipient = 'Admin' - # Ignore and remove later. elif sendTo == "Academic Advisor": message = Message(template.subject, recipients=[self.advisorEmail]) # Change this to academic advisor email class once we have that set up. From 8e140c38c19fcf9625996f7f3f7c97e3959c6fa7 Mon Sep 17 00:00:00 2001 From: carnesa Date: Tue, 23 Jun 2026 13:37:28 +0000 Subject: [PATCH 03/10] Removed comments --- app/logic/emailHandler.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index 7f14acddd..f1cd2b9fe 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -260,9 +260,9 @@ def LaborOverLoadFormApproved(self): "Labor Overload Form Approved For Financial Aid", "Labor Overload Form Submitted For Academic Advisor") # Ignore and remove later. - def LaborOverLoadFormApprovedAdvisorEmail(self): - """ This email is sent to the student's academic advisor when the overload form is approved by the labor office and is waiting for their approval. """ - self.checkRecipient(False, False, "Labor Overload Form Approved and sent to Advisor") + #def LaborOverLoadFormApprovedAdvisorEmail(self): + #""" This email is sent to the student's academic advisor when the overload form is approved by the labor office and is waiting for their approval. """ + #self.checkRecipient(False, False, "Labor Overload Form Approved and sent to Advisor") def LaborOverLoadFormRejected(self): self.checkRecipient("Labor Overload Form Rejected For Student", From 18cb333592e094ed3b661297e5598ecdc0ad6318 Mon Sep 17 00:00:00 2001 From: carnesa Date: Tue, 23 Jun 2026 13:44:36 +0000 Subject: [PATCH 04/10] Commiting to allow for merge. --- app/logic/emailHandler.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index f1cd2b9fe..17018d95d 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -388,7 +388,7 @@ def sendEmail(self, template, sendTo): recipient = 'Admin' elif sendTo == "Academic Advisor": message = Message(template.subject, - recipients=[self.advisorEmail]) # Change this to academic advisor email class once we have that set up. + recipients=[self.advisorEmail]) recipient = 'Academic Advisor' message.html = formTemplate From 6cde8010be7491abf130c0956ade66564461b529 Mon Sep 17 00:00:00 2001 From: carnesa Date: Tue, 23 Jun 2026 14:33:12 +0000 Subject: [PATCH 05/10] Fixed purpose name and subject in base_data.py and its call in emailHandler.py --- app/logic/emailHandler.py | 2 +- database/base_data.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index 17018d95d..5aa3814b6 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -258,7 +258,7 @@ def LaborOverLoadFormApproved(self): self.checkRecipient("Labor Overload Form Approved For Student", "Labor Overload Form Approved For Supervisor", "Labor Overload Form Approved For Financial Aid", - "Labor Overload Form Submitted For Academic Advisor") + "Labor Overload Form Approved For Academic Advisor") # Ignore and remove later. #def LaborOverLoadFormApprovedAdvisorEmail(self): #""" This email is sent to the student's academic advisor when the overload form is approved by the labor office and is waiting for their approval. """ diff --git a/database/base_data.py b/database/base_data.py index 1980659f7..36af1a33a 100644 --- a/database/base_data.py +++ b/database/base_data.py @@ -368,10 +368,10 @@ "audience":"Supervisor" }, { - "purpose":"Labor Overload Form Submitted For Academic Advisor", + "purpose":"Labor Overload Form Approved For Academic Advisor", "formType":"Labor Overload Form", "action":"Submitted", - "subject":"Labor Overload Form Submitted", + "subject":"Labor Overload Form Approved", "body":''' ''', "audience":"Academic Advisor" From 8ff69fa6dc77d012860db0fcd377f6a70f50a778 Mon Sep 17 00:00:00 2001 From: ACBerea Date: Tue, 28 Jul 2026 09:22:56 -0400 Subject: [PATCH 06/10] Changed the placement of the newly implemented email for Academic Advisor in base_data.py and added on academic advisor element for email template use in emailHandler.py --- app/logic/emailHandler.py | 1 + database/base_data.py | 16 ++++++++-------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index 5aa3814b6..02bec7750 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -413,6 +413,7 @@ def replaceText(self, form): form = form.replace("@@WLS@@", self.laborStatusForm.WLS) form = form.replace("@@Term@@", self.term.termName) form = form.replace("@@Admin@@", self.adminName) + form = form.replace("@@Academic Advisor@@", self.advisorEmail) if self.formHistory.rejectReason: form = form.replace("@@RejectReason@@", self.formHistory.rejectReason) diff --git a/database/base_data.py b/database/base_data.py index 36af1a33a..32c7797e0 100644 --- a/database/base_data.py +++ b/database/base_data.py @@ -368,31 +368,31 @@ "audience":"Supervisor" }, { - "purpose":"Labor Overload Form Approved For Academic Advisor", + "purpose":"Labor Overload Form Approved For Student", "formType":"Labor Overload Form", - "action":"Submitted", + "action":"Approved", "subject":"Labor Overload Form Approved", "body":''' ''', - "audience":"Academic Advisor" + "audience":"Student" }, { - "purpose":"Labor Overload Form Approved For Student", + "purpose":"Labor Overload Form Approved For Supervisor", "formType":"Labor Overload Form", "action":"Approved", "subject":"Labor Overload Form Approved", "body":''' ''', - "audience":"Student" + "audience":"Supervisor" }, { - "purpose":"Labor Overload Form Approved For Supervisor", + "purpose":"Labor Overload Form Approved For Academic Advisor", "formType":"Labor Overload Form", "action":"Approved", "subject":"Labor Overload Form Approved", - "body":''' + "body":'''

An overload for @@Student@@, @@StudB@@ has been approved. ''', - "audience":"Supervisor" + "audience":"Academic Advisor" }, { "purpose":"Labor Overload Form Rejected For Student", From 176b42725c4412c030c8efcb058403ca9ab59f24 Mon Sep 17 00:00:00 2001 From: ACBerea Date: Tue, 28 Jul 2026 10:21:11 -0400 Subject: [PATCH 07/10] Removed old commented out code from an earlier implementation. --- app/logic/emailHandler.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index 02bec7750..a8e500bf2 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -259,10 +259,6 @@ def LaborOverLoadFormApproved(self): "Labor Overload Form Approved For Supervisor", "Labor Overload Form Approved For Financial Aid", "Labor Overload Form Approved For Academic Advisor") - # Ignore and remove later. - #def LaborOverLoadFormApprovedAdvisorEmail(self): - #""" This email is sent to the student's academic advisor when the overload form is approved by the labor office and is waiting for their approval. """ - #self.checkRecipient(False, False, "Labor Overload Form Approved and sent to Advisor") def LaborOverLoadFormRejected(self): self.checkRecipient("Labor Overload Form Rejected For Student", From 63cad4ce219c73d4eeb5b2a237578a364f9b80b6 Mon Sep 17 00:00:00 2001 From: ACBerea Date: Thu, 30 Jul 2026 13:40:43 -0400 Subject: [PATCH 08/10] Added missing identifier to advisorEmailPurpose --- app/logic/emailHandler.py | 3 ++- database/base_data.py | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index a8e500bf2..84f26c1f2 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -175,7 +175,8 @@ def laborStatusFormExpired(self): self.checkRecipient( studentEmailPurpose=studentTemplate.purpose, emailPurpose=supervisorTemplate.purpose, - secondaryEmailPurpose=None + secondaryEmailPurpose=None, + advisorEmailPurpose=None ) def laborStatusFormApproved(self): diff --git a/database/base_data.py b/database/base_data.py index 32c7797e0..899b29e39 100644 --- a/database/base_data.py +++ b/database/base_data.py @@ -390,7 +390,8 @@ "formType":"Labor Overload Form", "action":"Approved", "subject":"Labor Overload Form Approved", - "body":'''

An overload for @@Student@@, @@StudB@@ has been approved. + "body":''' +

An overload for @@Student@@, @@StudB@@ has been approved. ''', "audience":"Academic Advisor" }, From cf2e15ad89eae484eaada384be7cb224efe8cfe0 Mon Sep 17 00:00:00 2001 From: ACBerea Date: Tue, 4 Aug 2026 14:47:15 -0400 Subject: [PATCH 09/10] Fixed minor issues in base_data and emailHandler. --- app/models/emailTemplate.py | 4 ++-- database/base_data.py | 2 +- database/demo_data.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/models/emailTemplate.py b/app/models/emailTemplate.py index 9736ec00c..e86665ddd 100755 --- a/app/models/emailTemplate.py +++ b/app/models/emailTemplate.py @@ -15,14 +15,14 @@ class EmailTemplate (baseModel): #Emails in labor status form: #LSF #1:When labor status form is submitted: send to student -#2:When LSF is approved: send to supervisor and student +#2:When LSF is approved: send to supervisor and student and academic advisor #3:When LSF is rejected: send to supervisor and student #4:When LSF is adjusted: send to supervisor and student (?) #Pending #5:When a pending form is modified: send to supervisor and student #LRF #6:When labor release form is submitted: Send to student -#7:When lrf is approved: send to supervisor and student +#7:When lrf is approved: send to supervisor and student and academic advisor #8:When lrf is rejected: send to supervisor and student #Overload #9: When labor overload form submitted (by student): send to supervisor(??? and advisor???) diff --git a/database/base_data.py b/database/base_data.py index 899b29e39..cda720fe5 100644 --- a/database/base_data.py +++ b/database/base_data.py @@ -391,7 +391,7 @@ "action":"Approved", "subject":"Labor Overload Form Approved", "body":''' -

An overload for @@Student@@, @@StudB@@ has been approved. +

An overload for @@Student@@, @@StudB@@ has been approved.

''', "audience":"Academic Advisor" }, diff --git a/database/demo_data.py b/database/demo_data.py index 0557c9361..b93305a1f 100644 --- a/database/demo_data.py +++ b/database/demo_data.py @@ -553,7 +553,7 @@ FormHistory.insert([{ "formHistoryID": 2, "formID_id": "2", - "historyType_id": "Labor Status Form", + "historyType_id": "Labor Overload Form", "createdBy_id": 1, "createdDate": f"{current_year}-04-14", "status_id": "Pending" From 4fb66b531d96a71b7344a1c744bbedfa8f644a8a Mon Sep 17 00:00:00 2001 From: ACBerea Date: Tue, 4 Aug 2026 17:24:45 -0400 Subject: [PATCH 10/10] Added print statement in emailHandler temporaily to assist with ongoing issues. --- app/logic/emailHandler.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/logic/emailHandler.py b/app/logic/emailHandler.py index 84f26c1f2..92d58e0cc 100644 --- a/app/logic/emailHandler.py +++ b/app/logic/emailHandler.py @@ -29,7 +29,8 @@ def __init__(self, formHistoryKey): self.studentEmail = self.student.STU_EMAIL self.creatorEmail = self.formHistory.createdBy.email self.supervisorEmail = self.laborStatusForm.supervisor.EMAIL - self.advisorEmail = self.student.ADVISOR + self.advisorEmail = self.student.ADVISOR + print ("self.advisorEmail: ", self.advisorEmail) self.date = self.laborStatusForm.startDate.strftime("%m/%d/%Y") self.weeklyHours = str(self.laborStatusForm.weeklyHours) self.contractHours = str(self.laborStatusForm.contractHours) @@ -96,7 +97,8 @@ def __init__(self, formHistoryKey): def send(self, message: Message): if app.config['ENV'] == 'production' or app.config['ALWAYS_SEND_MAIL']: - + print("LOOKING AT MESSAGE") + print(message.html) # If we have set an override address if app.config['MAIL_OVERRIDE_ALL']: message.html = "Original message intended for {}.
".format(", ".join(message.recipients)) + message.html