feat: batch start and live class reminder
This commit is contained in:
@@ -313,7 +313,7 @@ const tabs = computed(() => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
const redirectToLogin = () => {
|
const redirectToLogin = () => {
|
||||||
window.location.href = `/login?redirect-to=/batches`
|
window.location.href = `/login?redirect-to=/lms/batch/${props.batchName}`
|
||||||
}
|
}
|
||||||
|
|
||||||
const openAnnouncementModal = () => {
|
const openAnnouncementModal = () => {
|
||||||
|
|||||||
@@ -116,6 +116,8 @@ scheduler_events = {
|
|||||||
"daily": [
|
"daily": [
|
||||||
"lms.job.doctype.job_opportunity.job_opportunity.update_job_openings",
|
"lms.job.doctype.job_opportunity.job_opportunity.update_job_openings",
|
||||||
"lms.lms.doctype.lms_payment.lms_payment.send_payment_reminder",
|
"lms.lms.doctype.lms_payment.lms_payment.send_payment_reminder",
|
||||||
|
"lms.lms.doctype.lms_batch.lms_batch.send_batch_start_reminder",
|
||||||
|
"lms.lms.doctype.lms_live_class.lms_live_class.send_live_class_reminder",
|
||||||
],
|
],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ import json
|
|||||||
from frappe import _
|
from frappe import _
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from frappe.utils import cint, format_datetime, get_time
|
from frappe.utils import cint, format_datetime, get_time, add_days, nowdate
|
||||||
from lms.lms.utils import (
|
from lms.lms.utils import (
|
||||||
get_lessons,
|
get_lessons,
|
||||||
get_lesson_index,
|
get_lesson_index,
|
||||||
@@ -405,3 +405,40 @@ def is_milestone_complete(idx, batch):
|
|||||||
return False
|
return False
|
||||||
|
|
||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def send_batch_start_reminder():
|
||||||
|
batches = frappe.get_all(
|
||||||
|
"LMS Batch",
|
||||||
|
{"start_date": add_days(nowdate(), 1), "published": 1},
|
||||||
|
["name", "title", "start_date", "start_time", "medium"],
|
||||||
|
)
|
||||||
|
|
||||||
|
for batch in batches:
|
||||||
|
students = frappe.get_all(
|
||||||
|
"LMS Batch Enrollment", {"batch": batch}, ["member", "member_name"]
|
||||||
|
)
|
||||||
|
for student in students:
|
||||||
|
send_mail(batch, student)
|
||||||
|
|
||||||
|
|
||||||
|
def send_mail(batch, student):
|
||||||
|
subject = _("Batch Start Reminder")
|
||||||
|
template = "batch_start_reminder"
|
||||||
|
|
||||||
|
args = {
|
||||||
|
"student_name": student.member_name,
|
||||||
|
"title": batch.title,
|
||||||
|
"start_date": batch.start_date,
|
||||||
|
"start_time": batch.start_time,
|
||||||
|
"medium": batch.medium,
|
||||||
|
"name": batch.name,
|
||||||
|
}
|
||||||
|
|
||||||
|
frappe.sendmail(
|
||||||
|
recipients=student.member,
|
||||||
|
subject=subject,
|
||||||
|
template=template,
|
||||||
|
args=args,
|
||||||
|
header=[_(f"Batch Start Reminder: {batch.title}"), "orange"],
|
||||||
|
)
|
||||||
|
|||||||
@@ -79,20 +79,13 @@ def send_mail(doc):
|
|||||||
batch = frappe.db.get_value(
|
batch = frappe.db.get_value(
|
||||||
"LMS Batch",
|
"LMS Batch",
|
||||||
doc.batch,
|
doc.batch,
|
||||||
[
|
["name", "title", "start_date", "start_time", "medium"],
|
||||||
"name",
|
|
||||||
"title",
|
|
||||||
"start_date",
|
|
||||||
"start_time",
|
|
||||||
"medium",
|
|
||||||
"confirmation_email_template",
|
|
||||||
],
|
|
||||||
as_dict=1,
|
as_dict=1,
|
||||||
)
|
)
|
||||||
|
|
||||||
subject = _("Enrollment Confirmation for {0}").format(batch.title)
|
subject = _("Enrollment Confirmation for {0}").format(batch.title)
|
||||||
template = "batch_confirmation"
|
template = "batch_confirmation"
|
||||||
custom_template = batch.confirmation_email_template or frappe.db.get_single_value(
|
custom_template = frappe.db.get_single_value(
|
||||||
"LMS Settings", "batch_confirmation_template"
|
"LMS Settings", "batch_confirmation_template"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -2,9 +2,10 @@
|
|||||||
# For license information, please see license.txt
|
# For license information, please see license.txt
|
||||||
|
|
||||||
import frappe
|
import frappe
|
||||||
|
from frappe import _
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
from datetime import timedelta
|
from datetime import timedelta
|
||||||
from frappe.utils import cint, get_datetime
|
from frappe.utils import cint, get_datetime, format_date, add_days, nowdate, format_time
|
||||||
|
|
||||||
|
|
||||||
class LMSLiveClass(Document):
|
class LMSLiveClass(Document):
|
||||||
@@ -56,8 +57,48 @@ class LMSLiveClass(Document):
|
|||||||
{
|
{
|
||||||
"sync_with_google_calendar": 1,
|
"sync_with_google_calendar": 1,
|
||||||
"google_calendar": calendar,
|
"google_calendar": calendar,
|
||||||
"description": f"A Live Class has been scheduled on {frappe.utils.format_date(self.date, 'medium')} at { frappe.utils.format_time(self.time, 'hh:mm a')}. Click on this link to join. {self.join_url}. {self.description}",
|
"description": f"A Live Class has been scheduled on {format_date(self.date, 'medium')} at {format_time(self.time, 'hh:mm a')}. Click on this link to join. {self.join_url}. {self.description}",
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
event.save()
|
event.save()
|
||||||
|
|
||||||
|
|
||||||
|
def send_live_class_reminder():
|
||||||
|
classes = frappe.get_all(
|
||||||
|
"LMS Live Class",
|
||||||
|
{
|
||||||
|
"date": add_days(nowdate(), 1),
|
||||||
|
},
|
||||||
|
["name", "batch_name", "title", "date", "time"],
|
||||||
|
)
|
||||||
|
|
||||||
|
for live_class in classes:
|
||||||
|
students = frappe.get_all(
|
||||||
|
"LMS Batch Enrollment",
|
||||||
|
{"batch": live_class.batch_name},
|
||||||
|
["member", "member_name"],
|
||||||
|
)
|
||||||
|
for student in students:
|
||||||
|
send_mail(live_class, student)
|
||||||
|
|
||||||
|
|
||||||
|
def send_mail(live_class, student):
|
||||||
|
subject = f"Your class on {live_class.title} is tomorrow"
|
||||||
|
template = "live_class_reminder"
|
||||||
|
|
||||||
|
args = {
|
||||||
|
"student_name": student.member_name,
|
||||||
|
"title": live_class.title,
|
||||||
|
"date": live_class.date,
|
||||||
|
"time": live_class.time,
|
||||||
|
"batch_name": live_class.batch_name,
|
||||||
|
}
|
||||||
|
|
||||||
|
frappe.sendmail(
|
||||||
|
recipients=student.member,
|
||||||
|
subject=subject,
|
||||||
|
template=template,
|
||||||
|
args=args,
|
||||||
|
header=[_(f"Class Reminder: {live_class.title}"), "orange"],
|
||||||
|
)
|
||||||
|
|||||||
35
lms/templates/emails/batch_start_reminder.html
Normal file
35
lms/templates/emails/batch_start_reminder.html
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<p>
|
||||||
|
{{ _("Dear ") }} {{ student_name }},
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
{{ _("The batch you have enrolled for is starting tomorrow. Please be prepared and be on time for the session.") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Batch:") }}</b> {{ title }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Start Date:") }}</b> {{ frappe.utils.format_date(start_date, "medium") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Timings:") }}</b> {{ frappe.utils.format_time(start_time, "hh:mm a") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Medium:") }}</b> {{ medium }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
{{ _("Visit the following link to view your ") }}
|
||||||
|
<a href="/lms/batches/{{ name }}">{{ _("Batch Details") }}</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{{ _("If you have any questions or require assistance, feel free to contact us.") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
{{ _("Best Regards") }}
|
||||||
|
</p>
|
||||||
31
lms/templates/emails/live_class_reminder.html
Normal file
31
lms/templates/emails/live_class_reminder.html
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
<p>
|
||||||
|
{{ _("Dear ") }} {{ student_name }},
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
{{ _("You have a live class scheduled tomorrow. Please be prepared and be on time for the session.") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Class:") }}</b> {{ title }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Date:") }}</b> {{ frappe.utils.format_date(date, "medium") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
<b>{{ _("Timings:") }}</b> {{ frappe.utils.format_time(time, "hh:mm a") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
{{ _("Visit the following link to view your ") }}
|
||||||
|
<a href="/lms/live_classes/{{ batch_name }}">{{ _("Batch Details") }}</a>
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
{{ _("If you have any questions or require assistance, feel free to contact us.") }}
|
||||||
|
</p>
|
||||||
|
<br>
|
||||||
|
<p>
|
||||||
|
{{ _("Best Regards") }}
|
||||||
|
</p>
|
||||||
Reference in New Issue
Block a user