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):