Merge pull request #7732 from neilLasrado/student-left
Added ability to send newsletter to Student batch Guardians and Student Group Guardians
diff --git a/erpnext/schools/api.py b/erpnext/schools/api.py
index 313b5ff..f1d3753 100644
--- a/erpnext/schools/api.py
+++ b/erpnext/schools/api.py
@@ -8,6 +8,7 @@
from frappe import _
from frappe.model.mapper import get_mapped_doc
from frappe.utils import flt, cstr
+from frappe.email.doctype.email_group.email_group import add_subscribers
@frappe.whitelist()
def enroll_student(source_name):
@@ -83,6 +84,16 @@
student_attendance.submit()
@frappe.whitelist()
+def get_student_guardians(student):
+ """Returns List of Guardians of a Student.
+
+ :param student: Student.
+ """
+ guardians = frappe.get_list("Student Guardian", fields=["guardian"] ,
+ filters={"parent": student})
+ return guardians
+
+@frappe.whitelist()
def get_student_batch_students(student_batch):
"""Returns List of student, student_name, idx in Student Batch.
@@ -253,4 +264,23 @@
})
assessment_result.save()
assessment_result.submit()
- return assessment_result
\ No newline at end of file
+ return assessment_result
+
+@frappe.whitelist()
+def update_email_group(doctype, name):
+ if not frappe.db.exists("Email Group", name):
+ email_group = frappe.new_doc("Email Group")
+ email_group.title = name
+ email_group.save()
+ email_list = []
+ students = []
+ if doctype == "Student Batch":
+ students = get_student_batch_students(name)
+ if doctype == "Student Group":
+ students = get_student_group_students(name)
+ for stud in students:
+ for guard in get_student_guardians(stud.student):
+ email = frappe.db.get_value("Guardian", guard.guardian, "email_address")
+ if email:
+ email_list.append(email)
+ add_subscribers(name, email_list)
\ No newline at end of file
diff --git a/erpnext/schools/doctype/student_batch/student_batch.js b/erpnext/schools/doctype/student_batch/student_batch.js
index 931e41b..7fad5d7 100644
--- a/erpnext/schools/doctype/student_batch/student_batch.js
+++ b/erpnext/schools/doctype/student_batch/student_batch.js
@@ -3,7 +3,23 @@
frappe.ui.form.on('Student Batch', {
refresh: function(frm) {
-
+ if (!frm.doc.__islocal) {
+ frm.add_custom_button(__("Update Email Group"), function() {
+ frappe.call({
+ method: "erpnext.schools.api.update_email_group",
+ args: {
+ "doctype": "Student Batch",
+ "name": frm.doc.name
+ }
+ });
+ });
+ frm.add_custom_button(__("Newsletter"), function() {
+ frappe.route_options = {
+ email_group: frm.doc.name
+ }
+ frappe.set_route("List", "Newsletter");
+ });
+ }
},
onload: function(frm){
diff --git a/erpnext/schools/doctype/student_batch/student_batch.py b/erpnext/schools/doctype/student_batch/student_batch.py
index 1a0d799..9c0f3d7 100644
--- a/erpnext/schools/doctype/student_batch/student_batch.py
+++ b/erpnext/schools/doctype/student_batch/student_batch.py
@@ -6,6 +6,7 @@
from frappe.model.document import Document
from erpnext.schools.utils import validate_duplicate_student
import frappe
+from frappe import _
class StudentBatch(Document):
def autoname(self):
@@ -16,3 +17,8 @@
def validate(self):
validate_duplicate_student(self.students)
+ self.validate_name()
+
+ def validate_name(self):
+ if frappe.db.exists("Student Group", self.name):
+ frappe.throw(_("""Student Group exists with same name"""))
diff --git a/erpnext/schools/doctype/student_group/student_group.js b/erpnext/schools/doctype/student_group/student_group.js
index 392793a..1dcbc3a 100644
--- a/erpnext/schools/doctype/student_group/student_group.js
+++ b/erpnext/schools/doctype/student_group/student_group.js
@@ -1,33 +1,48 @@
cur_frm.add_fetch("student", "title", "student_name");
frappe.ui.form.on("Student Group", {
- refresh: function(frm) {
- if (!frm.doc.__islocal) {
- frm.add_custom_button(__("Course Schedule"), function() {
- frappe.route_options = {
- student_group: frm.doc.name
- }
- frappe.set_route("List", "Course Schedule");
- });
+ refresh: function(frm) {
+ if (!frm.doc.__islocal) {
+ frm.add_custom_button(__("Course Schedule"), function() {
+ frappe.route_options = {
+ student_group: frm.doc.name
+ }
+ frappe.set_route("List", "Course Schedule");
+ });
- frm.add_custom_button(__("Assessment Plan"), function() {
- frappe.route_options = {
- student_group: frm.doc.name
- }
- frappe.set_route("List", "Assessment Plan");
- });
- }
- },
+ frm.add_custom_button(__("Assessment Plan"), function() {
+ frappe.route_options = {
+ student_group: frm.doc.name
+ }
+ frappe.set_route("List", "Assessment Plan");
+ });
+ frm.add_custom_button(__("Update Email Group"), function() {
+ frappe.call({
+ method: "erpnext.schools.api.update_email_group",
+ args: {
+ "doctype": "Student Group",
+ "name": frm.doc.name
+ }
+ });
+ });
+ frm.add_custom_button(__("Newsletter"), function() {
+ frappe.route_options = {
+ email_group: frm.doc.name
+ }
+ frappe.set_route("List", "Newsletter");
+ });
+ }
+ },
- onload: function(frm) {
- cur_frm.set_query("academic_term", function() {
- return {
- "filters": {
- "academic_year": (frm.doc.academic_year)
- }
- };
- });
- }
+ onload: function(frm) {
+ frm.set_query("academic_term", function() {
+ return {
+ "filters": {
+ "academic_year": (frm.doc.academic_year)
+ }
+ };
+ });
+ }
});
//If Student Batch is entered, deduce program, academic_year and academic term from it
diff --git a/erpnext/schools/doctype/student_group/student_group.py b/erpnext/schools/doctype/student_group/student_group.py
index 2f27957..996f518 100644
--- a/erpnext/schools/doctype/student_group/student_group.py
+++ b/erpnext/schools/doctype/student_group/student_group.py
@@ -30,6 +30,7 @@
def validate(self):
self.validate_strength()
self.validate_student_name()
+ self.validate_name()
if self.student_batch:
self.validate_student_batch()
validate_duplicate_student(self.students)
@@ -42,6 +43,10 @@
for d in self.students:
d.student_name = frappe.db.get_value("Student", d.student, "title")
+ def validate_name(self):
+ if frappe.db.exists("Student Batch", self.name):
+ frappe.throw(_("""Student Batch exists with same name"""))
+
def validate_student_batch(self):
student_batch_students = []
for d in get_student_batch_students(self.student_batch):