From d3a410b0f380ed9cc71484ca2b6ca86e123dfd10 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Mon, 28 Nov 2016 15:25:17 +0530 Subject: [PATCH 1/7] Added Student Monthly Attendence Sheet Report --- erpnext/config/schools.py | 6 ++ .../__init__.py | 0 .../student_monthly_attendance_sheet.js | 42 ++++++++++ .../student_monthly_attendance_sheet.json | 17 ++++ .../student_monthly_attendance_sheet.py | 82 +++++++++++++++++++ 5 files changed, 147 insertions(+) create mode 100644 erpnext/schools/report/student_monthly_attendance_sheet/__init__.py create mode 100644 erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js create mode 100644 erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json create mode 100644 erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py diff --git a/erpnext/config/schools.py b/erpnext/config/schools.py index 7a415f013d2..c3384965188 100644 --- a/erpnext/config/schools.py +++ b/erpnext/config/schools.py @@ -74,6 +74,12 @@ def get_data(): { "type": "doctype", "name": "Student Batch Attendance Tool" + }, + { + "type": "report", + "is_query_report": True, + "name": "Student Monthly Attendance Sheet", + "doctype": "Attendance" } ] }, diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/__init__.py b/erpnext/schools/report/student_monthly_attendance_sheet/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js new file mode 100644 index 00000000000..32c05516535 --- /dev/null +++ b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.js @@ -0,0 +1,42 @@ +// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +// License: GNU General Public License v3. See license.txt + + +frappe.query_reports["Student Monthly Attendance Sheet"] = { + "filters": [ + { + "fieldname":"month", + "label": __("Month"), + "fieldtype": "Select", + "options": "Jan\nFeb\nMar\nApr\nMay\nJun\nJul\nAug\nSep\nOct\nNov\nDec", + "default": ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", + "Dec"][frappe.datetime.str_to_obj(frappe.datetime.get_today()).getMonth()], + }, + { + "fieldname":"year", + "label": __("Year"), + "fieldtype": "Select", + "reqd": 1 + }, + { + "fieldname":"student_batch", + "label": __("Student Batch"), + "fieldtype": "Link", + "options": "Student Batch", + "reqd": 1 + } + ], + + "onload": function() { + return frappe.call({ + method: "erpnext.schools.report.student_monthly_attendance_sheet.student_monthly_attendance_sheet.get_attendance_years", + callback: function(r) { + var year_filter = frappe.query_report_filters_by_name.year; + year_filter.df.options = r.message; + year_filter.df.default = r.message.split("\n")[0]; + year_filter.refresh(); + year_filter.set_input(year_filter.df.default); + } + }); + } +} diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json new file mode 100644 index 00000000000..8fa8b796a47 --- /dev/null +++ b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json @@ -0,0 +1,17 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2013-05-13 14:04:03", + "docstatus": 0, + "doctype": "Report", + "idx": 1, + "is_standard": "Yes", + "modified": "2014-06-03 07:18:17.181332", + "modified_by": "Administrator", + "module": "Schools", + "name": "Student Monthly Attendance Sheet", + "owner": "Administrator", + "ref_doctype": "Attendance", + "report_name": "Student Monthly Attendance Sheet", + "report_type": "Script Report" +} \ No newline at end of file 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 new file mode 100644 index 00000000000..8c6006eae64 --- /dev/null +++ b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.py @@ -0,0 +1,82 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils import cstr, cint, getdate +from frappe import msgprint, _ +from calendar import monthrange +from erpnext.schools.api import get_student_batch_students + +def execute(filters=None): + if not filters: filters = {} + + conditions, filters = get_conditions(filters) + columns = get_columns(filters) + att_map = get_attendance_list(conditions, filters) + students = get_student_batch_students(filters.get("student_batch")) + data = [] + for stud in students: + row = [stud.student, stud.student_name] + + total_p = total_a = 0.0 + for day in range(filters["total_days_in_month"]): + status="None" + if att_map.get(stud.student): + status = att_map.get(stud.student).get(day + 1, "None") + status_map = {"Present": "P", "Absent": "A", "None": ""} + row.append(status_map[status]) + + if status == "Present": + total_p += 1 + elif status == "Absent": + total_a += 1 + + row += [total_p, total_a] + data.append(row) + + return columns, data + +def get_columns(filters): + columns = [ _("Student") + ":Link/Student:90", _("Student Name") + "::150"] + + for day in range(filters["total_days_in_month"]): + columns.append(cstr(day+1) +"::20") + + columns += [_("Total Present") + ":Int:95", _("Total Absent") + ":Int:90"] + return columns + +def get_attendance_list(conditions, filters): + attendance_list = frappe.db.sql("""select student, day(date) as day_of_month, + status from `tabStudent Attendance` where docstatus = 1 %s order by student, date""" % + conditions, filters, as_dict=1) + + att_map = {} + for d in attendance_list: + att_map.setdefault(d.student, frappe._dict()).setdefault(d.day_of_month, "") + att_map[d.student][d.day_of_month] = d.status + + return att_map + +def get_conditions(filters): + if not (filters.get("month") and filters.get("year")): + msgprint(_("Please select month and year"), raise_exception=1) + + filters["month"] = ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", + "Dec"].index(filters.month) + 1 + + filters["total_days_in_month"] = monthrange(cint(filters.year), filters.month)[1] + + conditions = " and month(date) = %(month)s and year(date) = %(year)s" + + if filters.get("student_batch"): conditions += " and student_batch = %(student_batch)s" + + return conditions, filters + +@frappe.whitelist() +def get_attendance_years(): + year_list = frappe.db.sql_list("""select distinct YEAR(date) from `tabStudent Attendance` ORDER BY YEAR(date) DESC""") + if not year_list: + year_list = [getdate().year] + + return "\n".join(str(year) for year in year_list) From 14b27c5b42ba5ef19f43d8b6fcd47c9a23d1061a Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Mon, 28 Nov 2016 15:45:38 +0530 Subject: [PATCH 2/7] New Doctype - Student Leave Application --- erpnext/config/schools.py | 23 +- .../student_leave_application/__init__.py | 0 .../student_leave_application.js | 8 + .../student_leave_application.json | 259 ++++++++++++++++++ .../student_leave_application.py | 10 + .../test_student_leave_application.py | 12 + 6 files changed, 305 insertions(+), 7 deletions(-) create mode 100644 erpnext/schools/doctype/student_leave_application/__init__.py create mode 100644 erpnext/schools/doctype/student_leave_application/student_leave_application.js create mode 100644 erpnext/schools/doctype/student_leave_application/student_leave_application.json create mode 100644 erpnext/schools/doctype/student_leave_application/student_leave_application.py create mode 100644 erpnext/schools/doctype/student_leave_application/test_student_leave_application.py diff --git a/erpnext/config/schools.py b/erpnext/config/schools.py index c3384965188..b4942683725 100644 --- a/erpnext/config/schools.py +++ b/erpnext/config/schools.py @@ -56,20 +56,15 @@ def get_data(): ] }, { - "label": _("Schedule"), + "label": _("Attendance"), "items": [ - { - "type": "doctype", - "name": "Course Schedule", - "route": "Calendar/Course Schedule" - }, { "type": "doctype", "name": "Student Attendance" }, { "type": "doctype", - "name": "Course Scheduling Tool" + "name": "Student Leave Application" }, { "type": "doctype", @@ -83,6 +78,20 @@ def get_data(): } ] }, + { + "label": _("Schedule"), + "items": [ + { + "type": "doctype", + "name": "Course Schedule", + "route": "Calendar/Course Schedule" + }, + { + "type": "doctype", + "name": "Course Scheduling Tool" + } + ] + }, { "label": _("Assessment"), "items": [ diff --git a/erpnext/schools/doctype/student_leave_application/__init__.py b/erpnext/schools/doctype/student_leave_application/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.js b/erpnext/schools/doctype/student_leave_application/student_leave_application.js new file mode 100644 index 00000000000..4746148311d --- /dev/null +++ b/erpnext/schools/doctype/student_leave_application/student_leave_application.js @@ -0,0 +1,8 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.ui.form.on('Student Leave Application', { + refresh: function(frm) { + + } +}); diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.json b/erpnext/schools/doctype/student_leave_application/student_leave_application.json new file mode 100644 index 00000000000..5e22132315e --- /dev/null +++ b/erpnext/schools/doctype/student_leave_application/student_leave_application.json @@ -0,0 +1,259 @@ +{ + "allow_copy": 0, + "allow_import": 0, + "allow_rename": 0, + "autoname": "SLA.######", + "beta": 0, + "creation": "2016-11-28 15:38:54.793854", + "custom": 0, + "docstatus": 0, + "doctype": "DocType", + "document_type": "", + "editable_grid": 1, + "engine": "InnoDB", + "fields": [ + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "student", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Student", + "length": 0, + "no_copy": 0, + "options": "Student", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "student_name", + "fieldtype": "Read Only", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Student Name", + "length": 0, + "no_copy": 0, + "options": "student.title", + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "column_break_3", + "fieldtype": "Column Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "date", + "fieldtype": "Date", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 1, + "in_standard_filter": 0, + "label": "Date", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 1, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "section_break_5", + "fieldtype": "Section Break", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "reason", + "fieldtype": "Text", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Reason", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "fieldname": "amended_from", + "fieldtype": "Link", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Amended From", + "length": 0, + "no_copy": 1, + "options": "Student Leave Application", + "permlevel": 0, + "print_hide": 1, + "print_hide_if_no_value": 0, + "read_only": 1, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + } + ], + "hide_heading": 0, + "hide_toolbar": 0, + "idx": 0, + "image_view": 0, + "in_create": 0, + "in_dialog": 0, + "is_submittable": 1, + "issingle": 0, + "istable": 0, + "max_attachments": 0, + "modified": "2016-11-28 15:45:02.533381", + "modified_by": "Administrator", + "module": "Schools", + "name": "Student Leave Application", + "name_case": "", + "owner": "Administrator", + "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 1, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Academics User", + "set_user_permissions": 0, + "share": 1, + "submit": 1, + "write": 1 + } + ], + "quick_entry": 1, + "read_only": 0, + "read_only_onload": 0, + "sort_field": "modified", + "sort_order": "DESC", + "title_field": "student_name", + "track_seen": 0 +} \ No newline at end of file diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.py b/erpnext/schools/doctype/student_leave_application/student_leave_application.py new file mode 100644 index 00000000000..4a36590e691 --- /dev/null +++ b/erpnext/schools/doctype/student_leave_application/student_leave_application.py @@ -0,0 +1,10 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors +# For license information, please see license.txt + +from __future__ import unicode_literals +import frappe +from frappe.model.document import Document + +class StudentLeaveApplication(Document): + pass diff --git a/erpnext/schools/doctype/student_leave_application/test_student_leave_application.py b/erpnext/schools/doctype/student_leave_application/test_student_leave_application.py new file mode 100644 index 00000000000..ddb30acb202 --- /dev/null +++ b/erpnext/schools/doctype/student_leave_application/test_student_leave_application.py @@ -0,0 +1,12 @@ +# -*- coding: utf-8 -*- +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# See license.txt +from __future__ import unicode_literals + +import frappe +import unittest + +# test_records = frappe.get_test_records('Student Leave Application') + +class TestStudentLeaveApplication(unittest.TestCase): + pass From 331361d03b91e3f672ecc8faaa6b868b50403e42 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Mon, 28 Nov 2016 16:57:02 +0530 Subject: [PATCH 3/7] Added Absent Student Report --- erpnext/config/schools.py | 6 ++ .../report/absent_student_report/__init__.py | 0 .../absent_student_report.js | 15 +++++ .../absent_student_report.json | 17 ++++++ .../absent_student_report.py | 60 +++++++++++++++++++ 5 files changed, 98 insertions(+) create mode 100644 erpnext/schools/report/absent_student_report/__init__.py create mode 100644 erpnext/schools/report/absent_student_report/absent_student_report.js create mode 100644 erpnext/schools/report/absent_student_report/absent_student_report.json create mode 100644 erpnext/schools/report/absent_student_report/absent_student_report.py diff --git a/erpnext/config/schools.py b/erpnext/config/schools.py index b4942683725..2299305a5ef 100644 --- a/erpnext/config/schools.py +++ b/erpnext/config/schools.py @@ -70,6 +70,12 @@ def get_data(): "type": "doctype", "name": "Student Batch Attendance Tool" }, + { + "type": "report", + "is_query_report": True, + "name": "Absent Student Report", + "doctype": "Attendance" + }, { "type": "report", "is_query_report": True, diff --git a/erpnext/schools/report/absent_student_report/__init__.py b/erpnext/schools/report/absent_student_report/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.js b/erpnext/schools/report/absent_student_report/absent_student_report.js new file mode 100644 index 00000000000..7515f2203b1 --- /dev/null +++ b/erpnext/schools/report/absent_student_report/absent_student_report.js @@ -0,0 +1,15 @@ +// Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +// License: GNU General Public License v3. See license.txt + + +frappe.query_reports["Absent Student Report"] = { + "filters": [ + { + "fieldname":"date", + "label": __("Date"), + "fieldtype": "Date", + "default": get_today(), + "reqd": 1 + } + ] +} diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.json b/erpnext/schools/report/absent_student_report/absent_student_report.json new file mode 100644 index 00000000000..26989d197b4 --- /dev/null +++ b/erpnext/schools/report/absent_student_report/absent_student_report.json @@ -0,0 +1,17 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2013-05-13 14:04:03", + "docstatus": 0, + "doctype": "Report", + "idx": 1, + "is_standard": "Yes", + "modified": "2014-06-03 07:18:17.181332", + "modified_by": "Administrator", + "module": "Schools", + "name": "Absent Student Report", + "owner": "Administrator", + "ref_doctype": "Attendance", + "report_name": "Absent Student Report", + "report_type": "Script Report" +} \ No newline at end of file diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.py b/erpnext/schools/report/absent_student_report/absent_student_report.py new file mode 100644 index 00000000000..a138ca6ba93 --- /dev/null +++ b/erpnext/schools/report/absent_student_report/absent_student_report.py @@ -0,0 +1,60 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils import cstr, cint, getdate +from frappe import msgprint, _ + +def execute(filters=None): + if not filters: filters = {} + + if not filters.get("date"): + msgprint(_("Please select date"), raise_exception=1) + + columns = get_columns(filters) + + absent_students = get_absent_students(filters.get("date")) + leave_applicants = get_leave_applications(filters.get("date")) + + data = [] + for student in absent_students: + if not student.student in leave_applicants: + row = [student.student, student.student_name, student.student_batch] + stud_details = frappe.db.get_value("Student", student.student, ['student_email_id', 'student_mobile_number'], as_dict=True) + + if stud_details.student_email_id: + row+=[stud_details.student_email_id] + else: + row+= [""] + + if stud_details.student_mobile_number: + row+=[stud_details.student_mobile_number] + else: + row+= [""] + + data.append(row) + + return columns, data + +def get_columns(filters): + columns = [ + _("Student") + ":Link/Student:90", + _("Student Name") + "::150", + _("Student Batch") + "::180", + _("Student Email ID") + "::180", + _("Student Mobile No.") + "::150", + ] + return columns + +def get_absent_students(date): + absent_students = frappe.db.sql("""select student, student_name, student_batch from `tabStudent Attendance` + where docstatus = 1 and date = %s order by student_batch, student_name""", date, as_dict=1) + return absent_students + +def get_leave_applications(date): + leave_applicants = [] + for student in frappe.db.sql("""select student from `tabStudent Leave Application` + where docstatus = 1 and date = %s""", date): + leave_applicants.append(student[0]) + return leave_applicants \ No newline at end of file From 87edfef0bbc31755e01924e3107c673a4574d49d Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Mon, 28 Nov 2016 18:09:50 +0530 Subject: [PATCH 4/7] Added ability to mark student batch in-active --- .../schools/doctype/assessment/assessment.js | 10 ++++ .../schools/doctype/assessment/assessment.py | 4 ++ .../course_schedule/course_schedule.js | 8 +++ .../course_schedule/course_schedule.py | 4 ++ .../course_scheduling_tool.js | 29 +++++++--- .../student_attendance/student_attendance.js | 10 +++- .../student_attendance/student_attendance.py | 4 ++ .../doctype/student_batch/student_batch.json | 31 +++++++++- .../doctype/student_batch/student_batch.py | 22 +++++--- .../student_batch_attendance_tool.js | 10 ++++ .../doctype/student_group/student_group.js | 56 +++++++++++-------- .../doctype/student_group/student_group.py | 4 ++ 12 files changed, 149 insertions(+), 43 deletions(-) diff --git a/erpnext/schools/doctype/assessment/assessment.js b/erpnext/schools/doctype/assessment/assessment.js index efadbd66a26..828261a3038 100644 --- a/erpnext/schools/doctype/assessment/assessment.js +++ b/erpnext/schools/doctype/assessment/assessment.js @@ -7,6 +7,16 @@ cur_frm.add_fetch("supervisor", "instructor_name", "supervisor_name"); cur_frm.add_fetch("student", "title", "student_name"); frappe.ui.form.on("Assessment" ,{ + onload: function(frm){ + cur_frm.set_query("student_batch", function(){ + return{ + "filters": { + "active": 1 + } + }; + }); + }, + student_group : function(frm) { frm.set_value("results" ,""); if (frm.doc.student_group) { diff --git a/erpnext/schools/doctype/assessment/assessment.py b/erpnext/schools/doctype/assessment/assessment.py index cb307cb7f47..95e224c2127 100644 --- a/erpnext/schools/doctype/assessment/assessment.py +++ b/erpnext/schools/doctype/assessment/assessment.py @@ -6,10 +6,14 @@ from __future__ import unicode_literals from frappe.model.document import Document import frappe from frappe import _ +from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class Assessment(Document): def validate(self): self.validate_overlap() + + if self.student_batch: + validate_active_student_batch(self.student_batch) def validate_overlap(self): """Validates overlap for Student Group/Student Batch, Instructor, Room""" diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.js b/erpnext/schools/doctype/course_schedule/course_schedule.js index ab34ae96c11..18acdb30e0e 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.js +++ b/erpnext/schools/doctype/course_schedule/course_schedule.js @@ -9,6 +9,14 @@ frappe.ui.form.on("Course Schedule" ,{ frm.doc.from_time = from_datetime.format("HH:mm:ss"); frm.doc.to_time = to_datetime.format("HH:mm:ss"); } + + cur_frm.set_query("student_batch", function(){ + return{ + "filters": { + "active": 1 + } + }; + }); }, refresh :function(frm) { diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.py b/erpnext/schools/doctype/course_schedule/course_schedule.py index ec30c621409..e312e9fa532 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.py +++ b/erpnext/schools/doctype/course_schedule/course_schedule.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.model.document import Document +from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class CourseSchedule(Document): def validate(self): @@ -16,6 +17,9 @@ class CourseSchedule(Document): self.set_student_batch() self.validate_date() self.validate_overlap() + + if self.student_batch: + validate_active_student_batch(self.student_batch) def set_title(self): """Set document Title""" diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js index b8d4562b8d0..5ee41d04c69 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js +++ b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js @@ -7,12 +7,25 @@ cur_frm.add_fetch("student_group", "course", "course"); cur_frm.add_fetch("student_group", "academic_year", "academic_year"); cur_frm.add_fetch("student_group", "academic_term", "academic_term"); -frappe.ui.form.on("Course Scheduling Tool", "refresh", function(frm) { - frm.disable_save(); - frm.page.set_primary_action(__("Schedule Course"), function() { - frappe.call({ - method: "schedule_course", - doc:frm.doc - }) - }); +frappe.ui.form.on("Course Scheduling Tool", { + + refresh: function(frm) { + frm.disable_save(); + frm.page.set_primary_action(__("Schedule Course"), function() { + frappe.call({ + method: "schedule_course", + doc:frm.doc + }) + }); + }, + + onload: function(frm){ + cur_frm.set_query("student_batch", function(){ + return{ + "filters": { + "active": 1 + } + }; + }); + } }); \ No newline at end of file diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.js b/erpnext/schools/doctype/student_attendance/student_attendance.js index 6e79d52ec23..679e05ad89c 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.js +++ b/erpnext/schools/doctype/student_attendance/student_attendance.js @@ -5,7 +5,13 @@ cur_frm.add_fetch("course_schedule", "schedule_date", "date"); cur_frm.add_fetch("course_schedule", "student_batch", "student_batch"); frappe.ui.form.on('Student Attendance', { - refresh: function(frm) { - + onload: function(frm){ + cur_frm.set_query("student_batch", function(){ + return{ + "filters": { + "active": 1 + } + }; + }); } }); diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.py b/erpnext/schools/doctype/student_attendance/student_attendance.py index 45b3014579b..bb7b74af6de 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.py +++ b/erpnext/schools/doctype/student_attendance/student_attendance.py @@ -6,6 +6,7 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe import _ +from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class StudentAttendance(Document): def validate(self): @@ -13,6 +14,9 @@ class StudentAttendance(Document): self.validate_mandatory() self.validate_duplication() + if self.student_batch: + validate_active_student_batch(self.student_batch) + def validate_date(self): if self.course_schedule: self.date = frappe.db.get_value("Course Schedule", self.course_schedule, "schedule_date") diff --git a/erpnext/schools/doctype/student_batch/student_batch.json b/erpnext/schools/doctype/student_batch/student_batch.json index 51dc541eda6..2e3363b257e 100644 --- a/erpnext/schools/doctype/student_batch/student_batch.json +++ b/erpnext/schools/doctype/student_batch/student_batch.json @@ -70,6 +70,35 @@ "set_only_once": 0, "unique": 0 }, + { + "allow_on_submit": 0, + "bold": 0, + "collapsible": 0, + "columns": 0, + "default": "1", + "fieldname": "active", + "fieldtype": "Check", + "hidden": 0, + "ignore_user_permissions": 0, + "ignore_xss_filter": 0, + "in_filter": 0, + "in_list_view": 0, + "in_standard_filter": 0, + "label": "Active", + "length": 0, + "no_copy": 0, + "permlevel": 0, + "precision": "", + "print_hide": 0, + "print_hide_if_no_value": 0, + "read_only": 0, + "remember_last_selected_value": 0, + "report_hide": 0, + "reqd": 0, + "search_index": 0, + "set_only_once": 0, + "unique": 0 + }, { "allow_on_submit": 0, "bold": 0, @@ -280,7 +309,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-21 19:08:05.775954", + "modified": "2016-11-28 16:59:31.270816", "modified_by": "Administrator", "module": "Schools", "name": "Student Batch", diff --git a/erpnext/schools/doctype/student_batch/student_batch.py b/erpnext/schools/doctype/student_batch/student_batch.py index ec2dc799030..a1bc3c3690a 100644 --- a/erpnext/schools/doctype/student_batch/student_batch.py +++ b/erpnext/schools/doctype/student_batch/student_batch.py @@ -6,14 +6,18 @@ from __future__ import unicode_literals 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): - prog_abb = frappe.db.get_value("Program", self.program, "program_abbreviation") - if not prog_abb: - prog_abb = self.program - self.name = prog_abb + "-"+ self.student_batch_name + "-" + self.academic_year - - def validate(self): - validate_duplicate_student(self.students) - \ No newline at end of file + def autoname(self): + prog_abb = frappe.db.get_value("Program", self.program, "program_abbreviation") + if not prog_abb: + prog_abb = self.program + self.name = prog_abb + "-"+ self.student_batch_name + "-" + self.academic_year + + def validate(self): + validate_duplicate_student(self.students) + +def validate_active_student_batch(student_batch): + if not frappe.db.get_value("Student Batch", student_batch, "active"): + frappe.throw(_("Student Batch is not Active.")) \ No newline at end of file diff --git a/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js b/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js index a6d035a6e6d..189361b8a06 100644 --- a/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js +++ b/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js @@ -8,6 +8,16 @@ frappe.ui.form.on('Student Batch Attendance Tool', { hide_field('attendance'); }, + onload: function(frm){ + cur_frm.set_query("student_batch", function(){ + return{ + "filters": { + "active": 1 + } + }; + }); + }, + student_batch :function(frm) { if(frm.doc.student_batch && frm.doc.date) { frappe.call({ diff --git a/erpnext/schools/doctype/student_group/student_group.js b/erpnext/schools/doctype/student_group/student_group.js index 784f557f6cf..1a3c6828a17 100644 --- a/erpnext/schools/doctype/student_group/student_group.js +++ b/erpnext/schools/doctype/student_group/student_group.js @@ -1,31 +1,41 @@ 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"); +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"); + }); + + frm.add_custom_button(__("Assessment"), function() { + frappe.route_options = { + student_group: frm.doc.name + } + frappe.set_route("List", "Assessment"); + }); + } + }, + + onload: function(frm){ + cur_frm.set_query("academic_term",function(){ + return{ + "filters":{ + "academic_year": (frm.doc.academic_year) + } + }; }); - frm.add_custom_button(__("Assessment"), function() { - frappe.route_options = { - student_group: frm.doc.name - } - frappe.set_route("List", "Assessment"); + cur_frm.set_query("student_batch", function(){ + return{ + "filters": { + "active": 1 + } + }; }); - } -}); - -frappe.ui.form.on("Student Group", "onload", function(frm){ - cur_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 f60477392c2..bfb2da7fadf 100644 --- a/erpnext/schools/doctype/student_group/student_group.py +++ b/erpnext/schools/doctype/student_group/student_group.py @@ -7,6 +7,7 @@ import frappe from frappe.model.document import Document from frappe import _ from erpnext.schools.utils import validate_duplicate_student +from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class StudentGroup(Document): def autoname(self): @@ -30,6 +31,9 @@ class StudentGroup(Document): self.validate_strength() self.validate_student_name() validate_duplicate_student(self.students) + + if self.student_batch: + validate_active_student_batch(self.student_batch) def validate_strength(self): if self.max_strength and len(self.students) > self.max_strength: From 2607898cdecc80fa25ec462849bb3866d41ac9ad Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Thu, 1 Dec 2016 12:53:40 +0530 Subject: [PATCH 5/7] Added Student Batch-Wise Attendance report --- erpnext/config/schools.py | 6 ++ .../student_batch_wise_attendance/__init__.py | 0 .../student_batch_wise_attendance.js | 12 ++++ .../student_batch_wise_attendance.json | 18 ++++++ .../student_batch_wise_attendance.py | 64 +++++++++++++++++++ 5 files changed, 100 insertions(+) create mode 100644 erpnext/schools/report/student_batch_wise_attendance/__init__.py create mode 100644 erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.js create mode 100644 erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json create mode 100644 erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.py diff --git a/erpnext/config/schools.py b/erpnext/config/schools.py index 2299305a5ef..80e327402d4 100644 --- a/erpnext/config/schools.py +++ b/erpnext/config/schools.py @@ -76,6 +76,12 @@ def get_data(): "name": "Absent Student Report", "doctype": "Attendance" }, + { + "type": "report", + "is_query_report": True, + "name": "Student Batch Wise Attendance", + "doctype": "Attendance" + }, { "type": "report", "is_query_report": True, diff --git a/erpnext/schools/report/student_batch_wise_attendance/__init__.py b/erpnext/schools/report/student_batch_wise_attendance/__init__.py new file mode 100644 index 00000000000..e69de29bb2d diff --git a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.js b/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.js new file mode 100644 index 00000000000..51f7346b89a --- /dev/null +++ b/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.js @@ -0,0 +1,12 @@ +// Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors +// For license information, please see license.txt + +frappe.query_reports["Student Batch-Wise Attendance"] = { + "filters": [{ + "fieldname": "date", + "label": __("Date"), + "fieldtype": "Date", + "default": get_today(), + "reqd": 1 + }] +} \ No newline at end of file diff --git a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json b/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json new file mode 100644 index 00000000000..f9c9e55268d --- /dev/null +++ b/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.json @@ -0,0 +1,18 @@ +{ + "add_total_row": 0, + "apply_user_permissions": 1, + "creation": "2016-11-28 22:07:03.859124", + "disabled": 0, + "docstatus": 0, + "doctype": "Report", + "idx": 0, + "is_standard": "Yes", + "modified": "2016-12-01 10:48:23.380837", + "modified_by": "Administrator", + "module": "Schools", + "name": "Student Batch-Wise Attendance", + "owner": "Administrator", + "ref_doctype": "Student Attendance", + "report_name": "Student Batch-Wise Attendance", + "report_type": "Script Report" +} \ No newline at end of file diff --git a/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.py b/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.py new file mode 100644 index 00000000000..eaf090e2ade --- /dev/null +++ b/erpnext/schools/report/student_batch_wise_attendance/student_batch_wise_attendance.py @@ -0,0 +1,64 @@ +# Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors +# License: GNU General Public License v3. See license.txt + +from __future__ import unicode_literals +import frappe +from frappe.utils import cstr, cint, getdate +from frappe import msgprint, _ + +def execute(filters=None): + if not filters: filters = {} + + if not filters.get("date"): + msgprint(_("Please select date"), raise_exception=1) + + columns = get_columns(filters) + + active_student_batch = get_active_student_batch() + + data = [] + for student_batch in active_student_batch: + row = [student_batch.name] + present_students = 0 + absent_students = 0 + student_batch_strength = get_student_batch_strength(student_batch.name) + student_attendance = get_student_attendance(student_batch.name, filters.get("date")) + if student_attendance: + for attendance in student_attendance: + if attendance.status== "Present": + present_students = attendance.count + elif attendance.status== "Absent": + absent_students = attendance.count + + unmarked_students = student_batch_strength - (present_students + absent_students) + row+= [student_batch_strength, present_students, absent_students, unmarked_students] + data.append(row) + + return columns, data + +def get_columns(filters): + columns = [ + _("Student batch") + ":Link/Student Batch:250", + _("Student batch Strength") + "::170", + _("Present") + "::90", + _("Absent") + "::90", + _("Not Marked") + "::90" + ] + return columns + +def get_active_student_batch(): + active_student_batch = frappe.db.sql("""select name from `tabStudent Batch` + where active = 1 order by name""", as_dict=1) + return active_student_batch + +def get_student_batch_strength(student_batch): + student_batch_strength = frappe.db.sql("""select count(*) from `tabStudent Batch Student` + where parent = %s""", student_batch)[0][0] + return student_batch_strength + +def get_student_attendance(student_batch, date): + student_attendance = frappe.db.sql("""select count(*) as count, status from `tabStudent Attendance` where \ + student_batch= %s and date= %s and docstatus=1 and\ + (course_schedule is Null or course_schedule='') group by status""", + (student_batch, date), as_dict=1) + return student_attendance \ No newline at end of file From c6e74680ee0a9b111d81bfce82b94a0d0f2035cf Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Thu, 1 Dec 2016 13:00:14 +0530 Subject: [PATCH 6/7] Added Instructor as a Role --- .../course_schedule/course_schedule.json | 23 +++++- erpnext/schools/doctype/student/student.json | 79 ++++++++++++++++++- .../student_attendance.json | 23 +++++- .../doctype/student_batch/student_batch.json | 23 +++++- .../student_batch_attendance_tool.json | 23 +++++- .../doctype/student_group/student_group.json | 23 +++++- .../student_leave_application.json | 23 +++++- 7 files changed, 210 insertions(+), 7 deletions(-) diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.json b/erpnext/schools/doctype/course_schedule/course_schedule.json index 4a4b2d3a4be..122285e9806 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.json +++ b/erpnext/schools/doctype/course_schedule/course_schedule.json @@ -478,13 +478,34 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-11-16 16:38:00.454295", + "modified": "2016-12-01 12:59:25.086606", "modified_by": "Administrator", "module": "Schools", "name": "Course Schedule", "name_case": "", "owner": "Administrator", "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 1, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 1 + }, { "amend": 0, "apply_user_permissions": 0, diff --git a/erpnext/schools/doctype/student/student.json b/erpnext/schools/doctype/student/student.json index d188db316ef..6984d383db1 100644 --- a/erpnext/schools/doctype/student/student.json +++ b/erpnext/schools/doctype/student/student.json @@ -24,6 +24,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "First Name", "length": 0, "no_copy": 0, @@ -32,6 +33,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 1, "search_index": 0, @@ -50,6 +52,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Middle Name", "length": 0, "no_copy": 0, @@ -58,6 +61,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -76,6 +80,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Last Name", "length": 0, "no_copy": 0, @@ -84,6 +89,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -102,6 +108,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -109,6 +116,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -127,6 +135,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Naming Series", "length": 0, "no_copy": 0, @@ -136,6 +145,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -154,6 +164,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Student Email ID", "length": 0, "no_copy": 0, @@ -162,6 +173,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -180,6 +192,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Student Mobile Number", "length": 0, "no_copy": 0, @@ -189,6 +202,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -208,6 +222,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 1, + "in_standard_filter": 0, "label": "Joining Date", "length": 0, "no_copy": 0, @@ -216,6 +231,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -234,6 +250,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Image", "length": 0, "no_copy": 0, @@ -242,6 +259,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -262,6 +280,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Personal Details", "length": 0, "no_copy": 0, @@ -270,6 +289,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -288,6 +308,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Date of Birth", "length": 0, "no_copy": 0, @@ -296,6 +317,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -314,6 +336,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Blood Group", "length": 0, "no_copy": 0, @@ -323,6 +346,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -341,6 +365,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -348,6 +373,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -366,6 +392,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Gender", "length": 0, "no_copy": 0, @@ -375,6 +402,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -393,6 +421,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Nationality", "length": 0, "no_copy": 0, @@ -402,6 +431,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -420,6 +450,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Student Applicant", "length": 0, "no_copy": 0, @@ -429,6 +460,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 1, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -447,6 +479,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Home Address", "length": 0, "no_copy": 0, @@ -455,6 +488,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -473,6 +507,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Address Line 1", "length": 0, "no_copy": 0, @@ -481,6 +516,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -499,6 +535,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Address Line 2", "length": 0, "no_copy": 0, @@ -507,6 +544,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -525,6 +563,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Pincode", "length": 0, "no_copy": 0, @@ -533,6 +572,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -551,6 +591,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "length": 0, "no_copy": 0, "permlevel": 0, @@ -558,6 +599,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -576,6 +618,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "City", "length": 0, "no_copy": 0, @@ -584,6 +627,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -602,6 +646,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "State", "length": 0, "no_copy": 0, @@ -610,6 +655,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -628,6 +674,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Guardian Details", "length": 0, "no_copy": 0, @@ -636,6 +683,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -654,6 +702,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Guardians", "length": 0, "no_copy": 0, @@ -663,6 +712,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -681,6 +731,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Sibling Details", "length": 0, "no_copy": 0, @@ -690,6 +741,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -708,6 +760,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Siblings", "length": 0, "no_copy": 0, @@ -717,6 +770,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -736,6 +790,7 @@ "ignore_xss_filter": 0, "in_filter": 0, "in_list_view": 0, + "in_standard_filter": 0, "label": "Title", "length": 0, "no_copy": 0, @@ -744,6 +799,7 @@ "print_hide": 0, "print_hide_if_no_value": 0, "read_only": 0, + "remember_last_selected_value": 0, "report_hide": 0, "reqd": 0, "search_index": 0, @@ -763,13 +819,34 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-10-26 12:24:10.533118", + "modified": "2016-12-01 12:55:32.453131", "modified_by": "Administrator", "module": "Schools", "name": "Student", "name_case": "", "owner": "Administrator", "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 + }, { "amend": 0, "apply_user_permissions": 0, diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.json b/erpnext/schools/doctype/student_attendance/student_attendance.json index 70fcdf353c8..3ea47f37348 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.json +++ b/erpnext/schools/doctype/student_attendance/student_attendance.json @@ -252,13 +252,34 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-16 16:58:35.779867", + "modified": "2016-12-01 12:56:21.537215", "modified_by": "Administrator", "module": "Schools", "name": "Student Attendance", "name_case": "", "owner": "Administrator", "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 1, + "write": 1 + }, { "amend": 1, "apply_user_permissions": 0, diff --git a/erpnext/schools/doctype/student_batch/student_batch.json b/erpnext/schools/doctype/student_batch/student_batch.json index 2e3363b257e..bdbf5dba436 100644 --- a/erpnext/schools/doctype/student_batch/student_batch.json +++ b/erpnext/schools/doctype/student_batch/student_batch.json @@ -309,7 +309,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-28 16:59:31.270816", + "modified": "2016-12-01 12:56:51.727827", "modified_by": "Administrator", "module": "Schools", "name": "Student Batch", @@ -336,6 +336,27 @@ "share": 1, "submit": 0, "write": 1 + }, + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 } ], "quick_entry": 1, diff --git a/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.json b/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.json index 3361dcb44cb..defc886b1cc 100644 --- a/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.json +++ b/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.json @@ -163,13 +163,34 @@ "issingle": 1, "istable": 0, "max_attachments": 0, - "modified": "2016-11-16 17:16:43.835693", + "modified": "2016-12-01 12:58:31.822014", "modified_by": "Administrator", "module": "Schools", "name": "Student Batch Attendance Tool", "name_case": "", "owner": "Administrator", "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 1, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 1 + }, { "amend": 0, "apply_user_permissions": 0, diff --git a/erpnext/schools/doctype/student_group/student_group.json b/erpnext/schools/doctype/student_group/student_group.json index adab0c7a02b..9e44f518f69 100644 --- a/erpnext/schools/doctype/student_group/student_group.json +++ b/erpnext/schools/doctype/student_group/student_group.json @@ -311,13 +311,34 @@ "istable": 0, "max_attachments": 0, "menu_index": 0, - "modified": "2016-11-07 05:26:38.673266", + "modified": "2016-12-01 12:57:17.125085", "modified_by": "Administrator", "module": "Schools", "name": "Student Group", "name_case": "", "owner": "Administrator", "permissions": [ + { + "amend": 0, + "apply_user_permissions": 0, + "cancel": 0, + "create": 0, + "delete": 0, + "email": 0, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 0, + "read": 1, + "report": 0, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 0, + "write": 0 + }, { "amend": 0, "apply_user_permissions": 0, diff --git a/erpnext/schools/doctype/student_leave_application/student_leave_application.json b/erpnext/schools/doctype/student_leave_application/student_leave_application.json index 5e22132315e..238b13404fe 100644 --- a/erpnext/schools/doctype/student_leave_application/student_leave_application.json +++ b/erpnext/schools/doctype/student_leave_application/student_leave_application.json @@ -220,13 +220,34 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-11-28 15:45:02.533381", + "modified": "2016-12-01 12:57:55.914656", "modified_by": "Administrator", "module": "Schools", "name": "Student Leave Application", "name_case": "", "owner": "Administrator", "permissions": [ + { + "amend": 1, + "apply_user_permissions": 0, + "cancel": 1, + "create": 1, + "delete": 1, + "email": 1, + "export": 0, + "if_owner": 0, + "import": 0, + "is_custom": 0, + "permlevel": 0, + "print": 1, + "read": 1, + "report": 1, + "role": "Instructor", + "set_user_permissions": 0, + "share": 0, + "submit": 1, + "write": 1 + }, { "amend": 1, "apply_user_permissions": 0, From 19e8bd22214a8d1744026a10da6d0aa6cec4ff76 Mon Sep 17 00:00:00 2001 From: Neil Trini Lasrado Date: Thu, 1 Dec 2016 13:28:21 +0530 Subject: [PATCH 7/7] renamed 'active' in Student Batch to 'enabled' --- .../schools/doctype/assessment/assessment.js | 90 +++---- .../schools/doctype/assessment/assessment.py | 4 - .../course_schedule/course_schedule.js | 247 +++++++++--------- .../course_schedule/course_schedule.py | 4 - .../course_scheduling_tool.js | 30 +-- .../student_attendance/student_attendance.js | 14 +- .../student_attendance/student_attendance.py | 4 - .../doctype/student_batch/student_batch.json | 4 +- .../doctype/student_batch/student_batch.py | 5 - .../student_batch_attendance_tool.js | 228 ++++++++-------- .../doctype/student_group/student_group.js | 64 ++--- .../doctype/student_group/student_group.py | 4 - .../absent_student_report.json | 5 +- .../student_monthly_attendance_sheet.json | 5 +- 14 files changed, 313 insertions(+), 395 deletions(-) diff --git a/erpnext/schools/doctype/assessment/assessment.js b/erpnext/schools/doctype/assessment/assessment.js index 828261a3038..e842f413374 100644 --- a/erpnext/schools/doctype/assessment/assessment.js +++ b/erpnext/schools/doctype/assessment/assessment.js @@ -6,56 +6,46 @@ cur_frm.add_fetch("examiner", "instructor_name", "examiner_name"); cur_frm.add_fetch("supervisor", "instructor_name", "supervisor_name"); cur_frm.add_fetch("student", "title", "student_name"); -frappe.ui.form.on("Assessment" ,{ - onload: function(frm){ - cur_frm.set_query("student_batch", function(){ - return{ - "filters": { - "active": 1 - } - }; - }); - }, - - student_group : function(frm) { - frm.set_value("results" ,""); - if (frm.doc.student_group) { - frappe.call({ - method: "erpnext.schools.api.get_student_group_students", - args: { - "student_group": frm.doc.student_group - }, - callback: function(r) { - if (r.message) { - $.each(r.message, function(i, d) { - var row = frappe.model.add_child(cur_frm.doc, "Assessment Result", "results"); - row.student = d.student; - row.student_name = d.student_name; - }); - } - refresh_field("results"); - } - }); - } - } +frappe.ui.form.on("Assessment", { + student_group: function(frm) { + frm.set_value("results", ""); + if (frm.doc.student_group) { + frappe.call({ + method: "erpnext.schools.api.get_student_group_students", + args: { + "student_group": frm.doc.student_group + }, + callback: function(r) { + if (r.message) { + $.each(r.message, function(i, d) { + var row = frappe.model.add_child(cur_frm.doc, "Assessment Result", "results"); + row.student = d.student; + row.student_name = d.student_name; + }); + } + refresh_field("results"); + } + }); + } + } }); -frappe.ui.form.on("Assessment Result" ,{ - result : function(frm, cdt, cdn) { - if(frm.doc.grading_structure){ - var assessment_result = locals[cdt][cdn]; - frappe.call({ - method:"erpnext.schools.doctype.assessment.assessment.get_grade", - args:{ - grading_structure: frm.doc.grading_structure, - result: assessment_result.result - }, - callback: function(r){ - if(r.message){ - frappe.model.set_value(cdt, cdn, 'grade', r.message); - } - } - }); - } - } +frappe.ui.form.on("Assessment Result", { + result: function(frm, cdt, cdn) { + if (frm.doc.grading_structure) { + var assessment_result = locals[cdt][cdn]; + frappe.call({ + method: "erpnext.schools.doctype.assessment.assessment.get_grade", + args: { + grading_structure: frm.doc.grading_structure, + result: assessment_result.result + }, + callback: function(r) { + if (r.message) { + frappe.model.set_value(cdt, cdn, 'grade', r.message); + } + } + }); + } + } }); \ No newline at end of file diff --git a/erpnext/schools/doctype/assessment/assessment.py b/erpnext/schools/doctype/assessment/assessment.py index 95e224c2127..003b4276e7d 100644 --- a/erpnext/schools/doctype/assessment/assessment.py +++ b/erpnext/schools/doctype/assessment/assessment.py @@ -6,15 +6,11 @@ from __future__ import unicode_literals from frappe.model.document import Document import frappe from frappe import _ -from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class Assessment(Document): def validate(self): self.validate_overlap() - if self.student_batch: - validate_active_student_batch(self.student_batch) - def validate_overlap(self): """Validates overlap for Student Group/Student Batch, Instructor, Room""" diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.js b/erpnext/schools/doctype/course_schedule/course_schedule.js index 18acdb30e0e..04a8cdedf2e 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.js +++ b/erpnext/schools/doctype/course_schedule/course_schedule.js @@ -1,145 +1,134 @@ frappe.provide("schools") -frappe.ui.form.on("Course Schedule" ,{ - onload: function(frm) { - if (frm.doc.from_datetime && frm.doc.to_datetime) { - var from_datetime = moment(frm.doc.from_datetime); - var to_datetime = moment(frm.doc.to_datetime); - frm.doc.schedule_date = from_datetime.format(moment.defaultFormat); - frm.doc.from_time = from_datetime.format("HH:mm:ss"); - frm.doc.to_time = to_datetime.format("HH:mm:ss"); - } - - cur_frm.set_query("student_batch", function(){ - return{ - "filters": { - "active": 1 - } - }; - }); - }, - - refresh :function(frm) { - if(!frm.doc.__islocal && frm.doc.student_group) { - frappe.call({ - method: "erpnext.schools.api.check_attendance_records_exist", - args: { - "course_schedule": frm.doc.name - }, - callback: function(r) { - if(r.message) { - hide_field('attendance'); - frm.events.view_attendance(frm) - } - else { - frappe.call({ - method: "erpnext.schools.api.get_student_group_students", - args: { - "student_group": frm.doc.student_group - }, - callback: function(r) { - if (r.message) { - frm.events.get_students(frm, r.message) - } - } - }); - } - } - }); - } - else { - hide_field('attendance'); - } - }, - - view_attendance: function(frm) { - hide_field('attendance'); - frm.add_custom_button(__("View attendance"), function() { - frappe.route_options = { - course_schedule: frm.doc.name - } - frappe.set_route("List", "Student Attendance"); - }); - }, - - get_students: function(frm, students) { - if(!frm.students_area) { - frm.students_area = $('
') - .appendTo(frm.fields_dict.students_html.wrapper); - } - frm.students_editor = new schools.StudentsEditor(frm, frm.students_area, students) - } +frappe.ui.form.on("Course Schedule", { + onload: function(frm) { + if (frm.doc.from_datetime && frm.doc.to_datetime) { + var from_datetime = moment(frm.doc.from_datetime); + var to_datetime = moment(frm.doc.to_datetime); + frm.doc.schedule_date = from_datetime.format(moment.defaultFormat); + frm.doc.from_time = from_datetime.format("HH:mm:ss"); + frm.doc.to_time = to_datetime.format("HH:mm:ss"); + } + }, + + refresh: function(frm) { + if (!frm.doc.__islocal && frm.doc.student_group) { + frappe.call({ + method: "erpnext.schools.api.check_attendance_records_exist", + args: { + "course_schedule": frm.doc.name + }, + callback: function(r) { + if (r.message) { + hide_field('attendance'); + frm.events.view_attendance(frm) + } else { + frappe.call({ + method: "erpnext.schools.api.get_student_group_students", + args: { + "student_group": frm.doc.student_group + }, + callback: function(r) { + if (r.message) { + frm.events.get_students(frm, r.message) + } + } + }); + } + } + }); + } else { + hide_field('attendance'); + } + }, + + view_attendance: function(frm) { + hide_field('attendance'); + frm.add_custom_button(__("View attendance"), function() { + frappe.route_options = { + course_schedule: frm.doc.name + } + frappe.set_route("List", "Student Attendance"); + }); + }, + + get_students: function(frm, students) { + if (!frm.students_area) { + frm.students_area = $('
') + .appendTo(frm.fields_dict.students_html.wrapper); + } + frm.students_editor = new schools.StudentsEditor(frm, frm.students_area, students) + } }); schools.StudentsEditor = Class.extend({ - init: function(frm, wrapper, students) { - this.wrapper = wrapper; - this.frm = frm; - this.make(frm, students); - }, - make: function(frm, students) { - var me = this; - - $(this.wrapper).empty(); - var student_toolbar = $('

\ + init: function(frm, wrapper, students) { + this.wrapper = wrapper; + this.frm = frm; + this.make(frm, students); + }, + make: function(frm, students) { + var me = this; + + $(this.wrapper).empty(); + var student_toolbar = $('

\ \ \

').appendTo($(this.wrapper)); - student_toolbar.find(".btn-add") - .html(__('Check all')) - .on("click", function() { - $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { - if(!$(check).is(":checked")) { - check.checked = true; - } - }); - }); + student_toolbar.find(".btn-add") + .html(__('Check all')) + .on("click", function() { + $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { + if (!$(check).is(":checked")) { + check.checked = true; + } + }); + }); - student_toolbar.find(".btn-remove") - .html(__('Uncheck all')) - .on("click", function() { - $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { - if($(check).is(":checked")) { - check.checked = false; - } - }); - }); - - student_toolbar.find(".btn-mark-att") - .html(__('Mark Attendence')) - .on("click", function() { - var students_present = []; - var students_absent = []; - $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { - if($(check).is(":checked")) { - students_present.push(students[i]); - } - else { - students_absent.push(students[i]); - } - }); - frappe.call({ - method: "erpnext.schools.api.mark_attendance", - args: { - "students_present": students_present, - "students_absent": students_absent, - "course_schedule": frm.doc.name - }, - callback: function(r) { - frm.events.view_attendance(frm) - } - }); - }); + student_toolbar.find(".btn-remove") + .html(__('Uncheck all')) + .on("click", function() { + $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { + if ($(check).is(":checked")) { + check.checked = false; + } + }); + }); - - $.each(students, function(i, m) { - $(repl('
\ + student_toolbar.find(".btn-mark-att") + .html(__('Mark Attendence')) + .on("click", function() { + var students_present = []; + var students_absent = []; + $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { + if ($(check).is(":checked")) { + students_present.push(students[i]); + } else { + students_absent.push(students[i]); + } + }); + frappe.call({ + method: "erpnext.schools.api.mark_attendance", + args: { + "students_present": students_present, + "students_absent": students_absent, + "course_schedule": frm.doc.name + }, + callback: function(r) { + frm.events.view_attendance(frm) + } + }); + }); + + + $.each(students, function(i, m) { + $(repl('
\
\ \ -
', {student: m.student_name})).appendTo(me.wrapper); - }); - } +
', { student: m.student_name })).appendTo(me.wrapper); + }); + } }) \ No newline at end of file diff --git a/erpnext/schools/doctype/course_schedule/course_schedule.py b/erpnext/schools/doctype/course_schedule/course_schedule.py index e312e9fa532..ec30c621409 100644 --- a/erpnext/schools/doctype/course_schedule/course_schedule.py +++ b/erpnext/schools/doctype/course_schedule/course_schedule.py @@ -6,7 +6,6 @@ from __future__ import unicode_literals import frappe from frappe import _ from frappe.model.document import Document -from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class CourseSchedule(Document): def validate(self): @@ -17,9 +16,6 @@ class CourseSchedule(Document): self.set_student_batch() self.validate_date() self.validate_overlap() - - if self.student_batch: - validate_active_student_batch(self.student_batch) def set_title(self): """Set document Title""" diff --git a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js index 5ee41d04c69..ea62b8f544b 100644 --- a/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js +++ b/erpnext/schools/doctype/course_scheduling_tool/course_scheduling_tool.js @@ -8,24 +8,14 @@ cur_frm.add_fetch("student_group", "academic_year", "academic_year"); cur_frm.add_fetch("student_group", "academic_term", "academic_term"); frappe.ui.form.on("Course Scheduling Tool", { - - refresh: function(frm) { - frm.disable_save(); - frm.page.set_primary_action(__("Schedule Course"), function() { - frappe.call({ - method: "schedule_course", - doc:frm.doc - }) - }); - }, - - onload: function(frm){ - cur_frm.set_query("student_batch", function(){ - return{ - "filters": { - "active": 1 - } - }; - }); - } + + refresh: function(frm) { + frm.disable_save(); + frm.page.set_primary_action(__("Schedule Course"), function() { + frappe.call({ + method: "schedule_course", + doc: frm.doc + }) + }); + } }); \ No newline at end of file diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.js b/erpnext/schools/doctype/student_attendance/student_attendance.js index 679e05ad89c..ec2a0cbf8d9 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.js +++ b/erpnext/schools/doctype/student_attendance/student_attendance.js @@ -2,16 +2,4 @@ // For license information, please see license.txt cur_frm.add_fetch("course_schedule", "schedule_date", "date"); -cur_frm.add_fetch("course_schedule", "student_batch", "student_batch"); - -frappe.ui.form.on('Student Attendance', { - onload: function(frm){ - cur_frm.set_query("student_batch", function(){ - return{ - "filters": { - "active": 1 - } - }; - }); - } -}); +cur_frm.add_fetch("course_schedule", "student_batch", "student_batch") \ No newline at end of file diff --git a/erpnext/schools/doctype/student_attendance/student_attendance.py b/erpnext/schools/doctype/student_attendance/student_attendance.py index bb7b74af6de..45b3014579b 100644 --- a/erpnext/schools/doctype/student_attendance/student_attendance.py +++ b/erpnext/schools/doctype/student_attendance/student_attendance.py @@ -6,7 +6,6 @@ from __future__ import unicode_literals import frappe from frappe.model.document import Document from frappe import _ -from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class StudentAttendance(Document): def validate(self): @@ -14,9 +13,6 @@ class StudentAttendance(Document): self.validate_mandatory() self.validate_duplication() - if self.student_batch: - validate_active_student_batch(self.student_batch) - def validate_date(self): if self.course_schedule: self.date = frappe.db.get_value("Course Schedule", self.course_schedule, "schedule_date") diff --git a/erpnext/schools/doctype/student_batch/student_batch.json b/erpnext/schools/doctype/student_batch/student_batch.json index bdbf5dba436..f571d9d5a6b 100644 --- a/erpnext/schools/doctype/student_batch/student_batch.json +++ b/erpnext/schools/doctype/student_batch/student_batch.json @@ -76,7 +76,7 @@ "collapsible": 0, "columns": 0, "default": "1", - "fieldname": "active", + "fieldname": "enabled", "fieldtype": "Check", "hidden": 0, "ignore_user_permissions": 0, @@ -309,7 +309,7 @@ "issingle": 0, "istable": 0, "max_attachments": 0, - "modified": "2016-12-01 12:56:51.727827", + "modified": "2016-12-01 13:18:12.024001", "modified_by": "Administrator", "module": "Schools", "name": "Student Batch", diff --git a/erpnext/schools/doctype/student_batch/student_batch.py b/erpnext/schools/doctype/student_batch/student_batch.py index a1bc3c3690a..1a0d799482c 100644 --- a/erpnext/schools/doctype/student_batch/student_batch.py +++ b/erpnext/schools/doctype/student_batch/student_batch.py @@ -6,7 +6,6 @@ from __future__ import unicode_literals 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): @@ -17,7 +16,3 @@ class StudentBatch(Document): def validate(self): validate_duplicate_student(self.students) - -def validate_active_student_batch(student_batch): - if not frappe.db.get_value("Student Batch", student_batch, "active"): - frappe.throw(_("Student Batch is not Active.")) \ No newline at end of file diff --git a/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js b/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js index 189361b8a06..6dc9181460d 100644 --- a/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js +++ b/erpnext/schools/doctype/student_batch_attendance_tool/student_batch_attendance_tool.js @@ -3,136 +3,124 @@ frappe.provide("schools") frappe.ui.form.on('Student Batch Attendance Tool', { - refresh: function(frm) { - frm.disable_save(); - hide_field('attendance'); - }, - - onload: function(frm){ - cur_frm.set_query("student_batch", function(){ - return{ - "filters": { - "active": 1 - } - }; - }); - }, - - student_batch :function(frm) { - if(frm.doc.student_batch && frm.doc.date) { - frappe.call({ - method: "erpnext.schools.api.check_attendance_records_exist", - args: { - "student_batch": frm.doc.student_batch, - "date": frm.doc.date - }, - callback: function(r) { - if(r.message) { - frappe.msgprint("Attendance already marked."); - hide_field('attendance'); - } - else { - frappe.call({ - method: "erpnext.schools.api.get_student_batch_students", - args: { - "student_batch": frm.doc.student_batch - }, - callback: function(r) { - if (r.message) { - unhide_field('attendance'); - frm.events.get_students(frm, r.message) - } - } - }); - } - } - }); - } - }, - - date: function(frm) { - frm.trigger("student_batch"); - }, - - get_students: function(frm, students) { - if(!frm.students_area) { - frm.students_area = $('
') - .appendTo(frm.fields_dict.students_html.wrapper); - } - frm.students_editor = new schools.StudentsEditor(frm, frm.students_area, students) - } + refresh: function(frm) { + frm.disable_save(); + hide_field('attendance'); + }, + + student_batch: function(frm) { + if (frm.doc.student_batch && frm.doc.date) { + frappe.call({ + method: "erpnext.schools.api.check_attendance_records_exist", + args: { + "student_batch": frm.doc.student_batch, + "date": frm.doc.date + }, + callback: function(r) { + if (r.message) { + frappe.msgprint("Attendance already marked."); + hide_field('attendance'); + } else { + frappe.call({ + method: "erpnext.schools.api.get_student_batch_students", + args: { + "student_batch": frm.doc.student_batch + }, + callback: function(r) { + if (r.message) { + unhide_field('attendance'); + frm.events.get_students(frm, r.message) + } + } + }); + } + } + }); + } + }, + + date: function(frm) { + frm.trigger("student_batch"); + }, + + get_students: function(frm, students) { + if (!frm.students_area) { + frm.students_area = $('
') + .appendTo(frm.fields_dict.students_html.wrapper); + } + frm.students_editor = new schools.StudentsEditor(frm, frm.students_area, students) + } }); schools.StudentsEditor = Class.extend({ - init: function(frm, wrapper, students) { - this.wrapper = wrapper; - this.frm = frm; - this.make(frm, students); - }, - make: function(frm, students) { - var me = this; - - $(this.wrapper).empty(); - var student_toolbar = $('

\ + init: function(frm, wrapper, students) { + this.wrapper = wrapper; + this.frm = frm; + this.make(frm, students); + }, + make: function(frm, students) { + var me = this; + + $(this.wrapper).empty(); + var student_toolbar = $('

\ \ \

').appendTo($(this.wrapper)); - student_toolbar.find(".btn-add") - .html(__('Check all')) - .on("click", function() { - $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { - if(!$(check).is(":checked")) { - check.checked = true; - } - }); - }); + student_toolbar.find(".btn-add") + .html(__('Check all')) + .on("click", function() { + $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { + if (!$(check).is(":checked")) { + check.checked = true; + } + }); + }); - student_toolbar.find(".btn-remove") - .html(__('Uncheck all')) - .on("click", function() { - $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { - if($(check).is(":checked")) { - check.checked = false; - } - }); - }); - - student_toolbar.find(".btn-mark-att") - .html(__('Mark Attendence')) - .on("click", function() { - var students_present = []; - var students_absent = []; - $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { - if($(check).is(":checked")) { - students_present.push(students[i]); - } - else { - students_absent.push(students[i]); - } - }); - frappe.call({ - method: "erpnext.schools.api.mark_attendance", - args: { - "students_present": students_present, - "students_absent": students_absent, - "student_batch": frm.doc.student_batch, - "date": frm.doc.date - }, - callback: function(r) { - hide_field('attendance'); - } - }); - }); + student_toolbar.find(".btn-remove") + .html(__('Uncheck all')) + .on("click", function() { + $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { + if ($(check).is(":checked")) { + check.checked = false; + } + }); + }); - - $.each(students, function(i, m) { - $(repl('
\ + student_toolbar.find(".btn-mark-att") + .html(__('Mark Attendence')) + .on("click", function() { + var students_present = []; + var students_absent = []; + $(me.wrapper).find('input[type="checkbox"]').each(function(i, check) { + if ($(check).is(":checked")) { + students_present.push(students[i]); + } else { + students_absent.push(students[i]); + } + }); + frappe.call({ + method: "erpnext.schools.api.mark_attendance", + args: { + "students_present": students_present, + "students_absent": students_absent, + "student_batch": frm.doc.student_batch, + "date": frm.doc.date + }, + callback: function(r) { + hide_field('attendance'); + } + }); + }); + + + $.each(students, function(i, m) { + $(repl('
\
\ \ -
', {student: m.student_name})).appendTo(me.wrapper); - }); - } -}); +
', { student: m.student_name })).appendTo(me.wrapper); + }); + } +}); \ No newline at end of file diff --git a/erpnext/schools/doctype/student_group/student_group.js b/erpnext/schools/doctype/student_group/student_group.js index 1a3c6828a17..6f4084be251 100644 --- a/erpnext/schools/doctype/student_group/student_group.js +++ b/erpnext/schools/doctype/student_group/student_group.js @@ -1,44 +1,36 @@ 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"); - }); - - frm.add_custom_button(__("Assessment"), function() { - frappe.route_options = { - student_group: frm.doc.name - } - frappe.set_route("List", "Assessment"); - }); - } - }, - - onload: function(frm){ - cur_frm.set_query("academic_term",function(){ - return{ - "filters":{ - "academic_year": (frm.doc.academic_year) - } - }; - }); - - cur_frm.set_query("student_batch", function(){ - return{ - "filters": { - "active": 1 - } - }; - }); - } + 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"), function() { + frappe.route_options = { + student_group: frm.doc.name + } + frappe.set_route("List", "Assessment"); + }); + } + }, + + onload: function(frm) { + cur_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 cur_frm.add_fetch("student_batch", "program", "program"); cur_frm.add_fetch("student_batch", "academic_term", "academic_term"); -cur_frm.add_fetch("student_batch", "academic_year", "academic_year"); +cur_frm.add_fetch("student_batch", "academic_year", "academic_year"); \ No newline at end of file diff --git a/erpnext/schools/doctype/student_group/student_group.py b/erpnext/schools/doctype/student_group/student_group.py index bfb2da7fadf..f60477392c2 100644 --- a/erpnext/schools/doctype/student_group/student_group.py +++ b/erpnext/schools/doctype/student_group/student_group.py @@ -7,7 +7,6 @@ import frappe from frappe.model.document import Document from frappe import _ from erpnext.schools.utils import validate_duplicate_student -from erpnext.schools.doctype.student_batch.student_batch import validate_active_student_batch class StudentGroup(Document): def autoname(self): @@ -31,9 +30,6 @@ class StudentGroup(Document): self.validate_strength() self.validate_student_name() validate_duplicate_student(self.students) - - if self.student_batch: - validate_active_student_batch(self.student_batch) def validate_strength(self): if self.max_strength and len(self.students) > self.max_strength: diff --git a/erpnext/schools/report/absent_student_report/absent_student_report.json b/erpnext/schools/report/absent_student_report/absent_student_report.json index 26989d197b4..5f3ca7111ac 100644 --- a/erpnext/schools/report/absent_student_report/absent_student_report.json +++ b/erpnext/schools/report/absent_student_report/absent_student_report.json @@ -2,16 +2,17 @@ "add_total_row": 0, "apply_user_permissions": 1, "creation": "2013-05-13 14:04:03", + "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2014-06-03 07:18:17.181332", + "modified": "2016-12-01 14:28:27.184668", "modified_by": "Administrator", "module": "Schools", "name": "Absent Student Report", "owner": "Administrator", - "ref_doctype": "Attendance", + "ref_doctype": "Student Attendance", "report_name": "Absent Student Report", "report_type": "Script Report" } \ No newline at end of file diff --git a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json index 8fa8b796a47..1d8f4d0a27b 100644 --- a/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json +++ b/erpnext/schools/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json @@ -2,16 +2,17 @@ "add_total_row": 0, "apply_user_permissions": 1, "creation": "2013-05-13 14:04:03", + "disabled": 0, "docstatus": 0, "doctype": "Report", "idx": 1, "is_standard": "Yes", - "modified": "2014-06-03 07:18:17.181332", + "modified": "2016-12-01 14:29:53.547378", "modified_by": "Administrator", "module": "Schools", "name": "Student Monthly Attendance Sheet", "owner": "Administrator", - "ref_doctype": "Attendance", + "ref_doctype": "Student Attendance", "report_name": "Student Monthly Attendance Sheet", "report_type": "Script Report" } \ No newline at end of file