Merge pull request #9669 from rohitwaghchaure/sales_invoice_serial_no_revert

Revert sales invoice serial no issues
diff --git a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
index 4f205c5..2e8b946 100644
--- a/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
+++ b/erpnext/buying/doctype/request_for_quotation/test_request_for_quotation.py
@@ -3,8 +3,10 @@
 # See license.txt
 from __future__ import unicode_literals
 
-import frappe
 import unittest
+
+import frappe
+from erpnext.templates.pages.rfq import check_supplier_has_docname_access
 from frappe.utils import nowdate
 
 class TestRequestforQuotation(unittest.TestCase):
@@ -28,6 +30,31 @@
 		self.assertEquals(sq1.get('items')[0].item_code, "_Test Item")
 		self.assertEquals(sq1.get('items')[0].qty, 5)
 
+	def test_make_supplier_quotation_with_special_characters(self):
+		from erpnext.buying.doctype.request_for_quotation.request_for_quotation import make_supplier_quotation
+
+		frappe.delete_doc_if_exists("Supplier", "_Test Supplier '1", force=1)
+		supplier = frappe.new_doc("Supplier")
+		supplier.supplier_name = "_Test Supplier '1"
+		supplier.supplier_type = "_Test Supplier Type"
+		supplier.insert()
+
+		rfq = make_request_for_quotation(supplier_wt_appos)
+
+		sq = make_supplier_quotation(rfq.name, supplier_wt_appos[0].get("supplier"))
+		sq.submit()
+
+		frappe.form_dict = frappe.local("form_dict")
+		frappe.form_dict.name = rfq.name
+
+		self.assertEqual(
+			check_supplier_has_docname_access(supplier_wt_appos[0].get('supplier')),
+			True
+		)
+
+		# reset form_dict
+		frappe.form_dict.name = None
+
 	def test_make_supplier_quotation_from_portal(self):
 		from erpnext.buying.doctype.request_for_quotation.request_for_quotation import create_supplier_quotation
 		rfq = make_request_for_quotation()
@@ -44,8 +71,11 @@
 		self.assertEquals(supplier_quotation_doc.get('items')[0].amount, 500)
 		
 
-def make_request_for_quotation():
-	supplier_data = get_supplier_data()
+def make_request_for_quotation(supplier_data=None):
+	"""
+	:param supplier_data: List containing supplier data
+	"""
+	supplier_data = supplier_data if supplier_data else get_supplier_data()
 	rfq = frappe.new_doc('Request for Quotation')
 	rfq.transaction_date = nowdate()
 	rfq.status = 'Draft'
@@ -77,3 +107,8 @@
 		"supplier": "_Test Supplier 1",
 		"supplier_name": "_Test Supplier 1"
 	}]
+
+supplier_wt_appos = [{
+	"supplier": "_Test Supplier '1",
+	"supplier_name": "_Test Supplier '1",
+}]
diff --git a/erpnext/schools/api.py b/erpnext/schools/api.py
index db65a69..c613c8c 100644
--- a/erpnext/schools/api.py
+++ b/erpnext/schools/api.py
@@ -114,13 +114,17 @@
 	return guardians
 
 @frappe.whitelist()
-def get_student_group_students(student_group):
+def get_student_group_students(student_group, include_inactive=0):
 	"""Returns List of student, student_name in Student Group.
 
 	:param student_group: Student Group.
 	"""
-	students = frappe.get_list("Student Group Student", fields=["student", "student_name"] , 
-		filters={"parent": student_group, "active": 1}, order_by= "group_roll_number")
+	if include_inactive:
+		students = frappe.get_list("Student Group Student", fields=["student", "student_name"] ,
+			filters={"parent": student_group}, order_by= "group_roll_number")
+	else:
+		students = frappe.get_list("Student Group Student", fields=["student", "student_name"] ,
+			filters={"parent": student_group, "active": 1}, order_by= "group_roll_number")
 	return students
 
 @frappe.whitelist()
diff --git a/erpnext/schools/doctype/assessment_plan/assessment_plan.py b/erpnext/schools/doctype/assessment_plan/assessment_plan.py
index f988886..a09f3ee 100644
--- a/erpnext/schools/doctype/assessment_plan/assessment_plan.py
+++ b/erpnext/schools/doctype/assessment_plan/assessment_plan.py
@@ -11,6 +11,7 @@
 	def validate(self):
 		self.validate_overlap()
 		self.validate_max_score()
+		self.validate_assessment_criteria()
 
 	def validate_overlap(self):
 		"""Validates overlap for Student Group, Instructor, Room"""
@@ -37,3 +38,13 @@
 			max_score += d.maximum_score
 		if self.maximum_assessment_score != max_score:
 			frappe.throw(_("Sum of Scores of Assessment Criteria needs to be {0}.".format(self.maximum_assessment_score)))
+
+	def validate_assessment_criteria(self):
+		assessment_criteria_list = frappe.db.sql_list(''' select apc.assessment_criteria
+			from `tabAssessment Plan` ap , `tabAssessment Plan Criteria` apc
+			where ap.name = apc.parent and ap.course=%s and ap.student_group=%s and ap.assessment_group=%s
+			and ap.name != %s''', (self.course, self.student_group, self.assessment_group, self.name))
+		for d in self.assessment_criteria:
+			if d.assessment_criteria in assessment_criteria_list:
+				frappe.throw(_("You have already assessed for the assessment criteria {}.")
+					.format(frappe.bold(d.assessment_criteria)))
diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
index 1e79a93..d869cec 100644
--- a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
+++ b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py
@@ -15,19 +15,24 @@
 	to_date = get_last_day(filters["month"] + '-' + filters["year"])
 	total_days_in_month = date_diff(to_date, from_date) +1
 	columns = get_columns(total_days_in_month)
-	students = get_student_group_students(filters.get("student_group"))
+	students = get_student_group_students(filters.get("student_group"),1)
 	students_list = get_students_list(students)
 	att_map = get_attendance_list(from_date, to_date, filters.get("student_group"), students_list)
 	data = []
 	for stud in students:
 		row = [stud.student, stud.student_name]
+		student_status = frappe.db.get_value("Student", stud.student, "enabled")
 		date = from_date
 		total_p = total_a = 0.0
 		for day in range(total_days_in_month):
 			status="None"
 			if att_map.get(stud.student):
 				status = att_map.get(stud.student).get(date, "None")
-			status_map = {"Present": "P", "Absent": "A", "None": ""}
+			elif not student_status:
+				status = "Inactive"
+			else:
+				status = "None"
+			status_map = {"Present": "P", "Absent": "A", "None": "", "Inactive":"-"}
 			row.append(status_map[status])
 			if status == "Present":
 				total_p += 1
diff --git a/erpnext/templates/pages/rfq.py b/erpnext/templates/pages/rfq.py
index abc2890..aaf4110 100644
--- a/erpnext/templates/pages/rfq.py
+++ b/erpnext/templates/pages/rfq.py
@@ -29,7 +29,7 @@
 def check_supplier_has_docname_access(supplier):
 	status = True
 	if frappe.form_dict.name not in frappe.db.sql_list("""select parent from `tabRequest for Quotation Supplier`
-		where supplier = '{supplier}'""".format(supplier=supplier)):
+		where supplier = %s""", (supplier,)):
 		status = False
 	return status