From f60bd60012af2d251d8239e2adc34b8ea24f875c Mon Sep 17 00:00:00 2001 From: Manas Solanki Date: Thu, 1 Jun 2017 18:30:35 +0530 Subject: [PATCH] Fix the demo for the schools (#8879) * Fix the demo for the schools * Fix for the demo https://github.com/frappe/erpnext/issues/6347 --- erpnext/demo/data/assessment_criteria.json | 18 ++++ erpnext/demo/data/grading_scale.json | 17 ++++ erpnext/demo/data/item_schools.json | 5 ++ erpnext/demo/data/program.json | 96 +++++----------------- erpnext/demo/data/student_batch_name.json | 10 +++ erpnext/demo/demo.py | 3 +- erpnext/demo/setup/education.py | 52 ++++++++++-- erpnext/demo/user/schools.py | 76 ++++++++++------- erpnext/schools/api.py | 8 ++ 9 files changed, 172 insertions(+), 113 deletions(-) create mode 100644 erpnext/demo/data/assessment_criteria.json create mode 100644 erpnext/demo/data/grading_scale.json create mode 100644 erpnext/demo/data/student_batch_name.json diff --git a/erpnext/demo/data/assessment_criteria.json b/erpnext/demo/data/assessment_criteria.json new file mode 100644 index 00000000000..82956822a2a --- /dev/null +++ b/erpnext/demo/data/assessment_criteria.json @@ -0,0 +1,18 @@ +[ + { + "doctype": "Assessment Criteria", + "assessment_criteria": "Aptitude" + }, + { + "doctype": "Assessment Criteria", + "assessment_criteria": "Application" + }, + { + "doctype": "Assessment Criteria", + "assessment_criteria": "Understanding" + }, + { + "doctype": "Assessment Criteria", + "assessment_criteria": "Knowledge" + } +] \ No newline at end of file diff --git a/erpnext/demo/data/grading_scale.json b/erpnext/demo/data/grading_scale.json new file mode 100644 index 00000000000..07609197c45 --- /dev/null +++ b/erpnext/demo/data/grading_scale.json @@ -0,0 +1,17 @@ +[ + { + "doctype": "Grading Scale", + "grading_scale_name": "Standard Grading", + "description": "Standard Grading Scale", + "intervals": [ + {"threshold": 100.0, "grade_code": "A", "grade_description": "Excellent"}, + {"threshold": 89.9, "grade_code": "B+", "grade_description": "Close to Excellence"}, + {"threshold": 80.0, "grade_code": "B", "grade_description": "Good"}, + {"threshold": 69.9, "grade_code": "C+", "grade_description": "Almost Good"}, + {"threshold": 60.0, "grade_code": "C", "grade_description": "Average"}, + {"threshold": 50.0, "grade_code": "D+", "grade_description": "Have to Work"}, + {"threshold": 40.0, "grade_code": "D", "grade_description": "Not met Baseline Expectations"}, + {"threshold": 0.0, "grade_code": "F", "grade_description": "Have to work a lot"} + ] + } +] \ No newline at end of file diff --git a/erpnext/demo/data/item_schools.json b/erpnext/demo/data/item_schools.json index 5eb60820f5a..077fcaacdaf 100644 --- a/erpnext/demo/data/item_schools.json +++ b/erpnext/demo/data/item_schools.json @@ -57,6 +57,7 @@ }, { "is_stock_item": 0, + "default_warehouse": "Stores", "description": "Computer", "item_code": "Computer", "item_name": "Computer", @@ -64,6 +65,7 @@ }, { "is_stock_item": 0, + "default_warehouse": "Stores", "description": "Mobile", "item_code": "Mobile", "item_name": "Mobile", @@ -71,6 +73,7 @@ }, { "is_stock_item": 0, + "default_warehouse": "Stores", "description": "ERP", "item_code": "ERP", "item_name": "ERP", @@ -78,12 +81,14 @@ }, { "is_stock_item": 0, + "default_warehouse": "Stores", "description": "Autocad", "item_code": "Autocad", "item_name": "Autocad", "item_group": "All Item Groups" }, { + "default_warehouse": "Stores", "default_warehouse": "Stores", "item_code": "Service", "item_group": "Services", diff --git a/erpnext/demo/data/program.json b/erpnext/demo/data/program.json index 8638311a380..9c2ec77a4b9 100644 --- a/erpnext/demo/data/program.json +++ b/erpnext/demo/data/program.json @@ -1,102 +1,46 @@ [ { "doctype": "Program", + "name": "MCA", "program_name": "Masters of Computer Applications", "program_code": "MCA", "department": "Information Technology", "courses": [ - { - "course": "Microprocessor", - "academic_term": "Semester 1" - }, - { - "course": "Probability and Statistics", - "academic_term": "Semester 1" - }, - { - "course": "Programing in Java", - "academic_term": "Semester 2" - } + { "course": "MCA4010" }, + { "course": "MCA4020" }, + { "course": "MCA4030" } ] }, { "doctype": "Program", + "name": "BCA", "program_name": "Bachelor of Computer Applications", "program_code": "BCA", "department": "Information Technology", "courses": [ - { - "course": "Communication Skiils", - "academic_term": "Semester 3" - }, - { - "course": "Object Oriented Programing - C++", - "academic_term": "Semester 3" - }, - { - "course": "Basic Mathematics", - "academic_term": "Semester 2" - }, - { - "course": "Data Structures and Algorithm", - "academic_term": "Semester 2" - }, - { - "course": "Digital Logic", - "academic_term": "Semester 2" - }, - { - "course": "Fundamentals of IT & Programing", - "academic_term": "Semester 1" - }, - { - "course": "Operating System", - "academic_term": "Semester 1" - }, - { - "course": "Programing in C", - "academic_term": "Semester 1" - } + { "course": "BCA2030" }, + { "course": "BCA1030" }, + { "course": "BCA2020" }, + { "course": "BCA1040" }, + { "course": "BCA1010" }, + { "course": "BCA2010" }, + { "course": "BCA1020" } ] }, { "doctype": "Program", + "name": "BBA", "program_name": "Bachelor of Business Administration", "program_code": "BBA", "department": "Management Studies", "courses": [ - { - "course": "Organizational Behavior", - "academic_term": "Semester 1" - }, - { - "course": "Management Development and Skills", - "academic_term": "Semester 1" - }, - { - "course": "Legal and Regulatory Framework", - "academic_term": "Semester 1" - }, - { - "course": "Human Resource Management", - "academic_term": "Semester 2" - }, - { - "course": "Entrepreneurship Management", - "academic_term": "Semester 2" - }, - { - "course": "Communication Skills", - "academic_term": "Semester 2" - }, - { - "course": "Business Environment", - "academic_term": "Semester 3" - }, - { - "course": "Advertising and Sales", - "academic_term": "Semester 3" - } + { "course": "BBA 101" }, + { "course": "BBA 102" }, + { "course": "BBA 103" }, + { "course": "BBA 301" }, + { "course": "BBA 302" }, + { "course": "BBA 304" }, + { "course": "BBA 505" } ] } ] \ No newline at end of file diff --git a/erpnext/demo/data/student_batch_name.json b/erpnext/demo/data/student_batch_name.json new file mode 100644 index 00000000000..ef3f18dcf21 --- /dev/null +++ b/erpnext/demo/data/student_batch_name.json @@ -0,0 +1,10 @@ +[ + { + "doctype": "Student Batch Name", + "batch_name": "Section-A" + }, + { + "doctype": "Student Batch Name", + "batch_name": "Section-B" + } +] \ No newline at end of file diff --git a/erpnext/demo/demo.py b/erpnext/demo/demo.py index aeaa1f0b7ca..a270e05f864 100644 --- a/erpnext/demo/demo.py +++ b/erpnext/demo/demo.py @@ -35,6 +35,7 @@ def make(domain='Manufacturing'): frappe.destroy() frappe.init(site) frappe.connect() + simulate(domain) def simulate(domain='Manufacturing'): @@ -73,7 +74,7 @@ def simulate(domain='Manufacturing'): stock.work() accounts.work() projects.run_projects(current_date) - #run_messages() + # run_messages() if domain=='Manufacturing': sales.work() diff --git a/erpnext/demo/setup/education.py b/erpnext/demo/setup/education.py index b1640573629..a124ee7b643 100644 --- a/erpnext/demo/setup/education.py +++ b/erpnext/demo/setup/education.py @@ -15,6 +15,7 @@ def setup_data(): make_student_group() make_fees_category() make_fees_structure() + make_assessment_groups() frappe.db.commit() frappe.clear_cache() @@ -24,6 +25,9 @@ def make_masters(): import_json("Instructor") import_json("Course") import_json("Program") + import_json("Student Batch Name") + import_json("Assessment Criteria") + import_json("Grading Scale") frappe.db.commit() def setup_item(): @@ -81,13 +85,24 @@ def make_student_applicants(): count+=1 def make_student_group(): - for d in frappe.db.get_list("Academic Term"): - sg_tool = frappe.new_doc("Student Group Creation Tool") - sg_tool.academic_year = "2016-17" - sg_tool.academic_term = d.name - sg_tool.courses = sg_tool.get_courses() - sg_tool.create_student_groups() - frappe.db.commit() + for term in frappe.db.get_list("Academic Term"): + for program in frappe.db.get_list("Program"): + sg_tool = frappe.new_doc("Student Group Creation Tool") + sg_tool.academic_year = "2017-18" + sg_tool.academic_term = term.name + sg_tool.program = program.name + for d in sg_tool.get_courses(): + d = frappe._dict(d) + student_group = frappe.new_doc("Student Group") + student_group.student_group_name = d.student_group_name + student_group.group_based_on = d.group_based_on + student_group.program = program.name + student_group.course = d.course + student_group.batch = d.batch + student_group.academic_term = term.name + student_group.academic_year = "2017-18" + student_group.save() + frappe.db.commit() def make_fees_category(): fee_type = ["Tuition Fee", "Hostel Fee", "Logistics Fee", @@ -111,7 +126,7 @@ def make_fees_category(): def make_fees_structure(): for d in frappe.db.get_list("Program"): program = frappe.get_doc("Program", d.name) - for academic_term in ["Semester 1", "Semester 2", "Semester 3"]: + for academic_term in ["2017-18 (Semester 1)", "2017-18 (Semester 2)", "2017-18 (Semester 3)"]: fee_structure = frappe.new_doc("Fee Structure") fee_structure.program = d.name fee_structure.academic_term = random.choice(frappe.db.get_list("Academic Term")).name @@ -123,6 +138,27 @@ def make_fees_structure(): program.save() frappe.db.commit() +def make_assessment_groups(): + for year in frappe.db.get_list("Academic Year"): + ag = frappe.new_doc('Assessment Group') + ag.assessment_group_name = year.name + ag.parent_assessment_group = "All Assessment Groups" + ag.is_group = 1 + ag.insert() + for term in frappe.db.get_list("Academic Term", filters = {"academic_year": year.name}): + ag1 = frappe.new_doc('Assessment Group') + ag1.assessment_group_name = term.name + ag1.parent_assessment_group = ag.name + ag1.is_group = 1 + ag1.insert() + for assessment_group in ['Term I', 'Term II']: + ag2 = frappe.new_doc('Assessment Group') + ag2.assessment_group_name = ag1.name + " " + assessment_group + ag2.parent_assessment_group = ag1.name + ag2.insert() + frappe.db.commit() + + def get_json_path(doctype): return frappe.get_app_path('erpnext', 'demo', 'data', frappe.scrub(doctype) + '.json') diff --git a/erpnext/demo/user/schools.py b/erpnext/demo/user/schools.py index 6388f9ac7ed..422c31a9d83 100644 --- a/erpnext/demo/user/schools.py +++ b/erpnext/demo/user/schools.py @@ -8,30 +8,22 @@ import random from frappe.utils import cstr from frappe.utils.make_random import get_random from datetime import timedelta -from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, get_fee_schedule, collect_fees +from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, \ + get_fee_schedule, collect_fees, get_course +from erpnext.schools.doctype.program_enrollment.program_enrollment import get_program_courses +from erpnext.schools.doctype.student_group.student_group import get_students def work(): frappe.set_user(frappe.db.get_global('demo_schools_user')) for d in xrange(20): approve_random_student_applicant() enroll_random_student(frappe.flags.current_date) - if frappe.flags.current_date.weekday()== 0: - make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5)) + # if frappe.flags.current_date.weekday()== 0: + # make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5)) mark_student_attendance(frappe.flags.current_date) + # make_assessment_plan() make_fees() -def mark_student_attendance(current_date): - status = ["Present", "Absent"] - for d in frappe.db.get_list("Course Schedule", filters={"schedule_date": current_date}, fields=("name", "student_group")): - students = get_student_group_students(d.student_group) - for stud in students: - make_attendance_records(stud.student, stud.student_name, d.name, status[weighted_choice([9,4])]) - -def make_fees(): - for d in range(1,10): - random_fee = get_random("Fees", {"paid_amount": 0}) - collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount")) - def approve_random_student_applicant(): random_student = get_random("Student Applicant", {"application_status": "Applied"}) if random_student: @@ -39,31 +31,59 @@ def approve_random_student_applicant(): frappe.db.set_value("Student Applicant", random_student, "application_status", status[weighted_choice([9,3])]) def enroll_random_student(current_date): + batch = ["Section-A", "Section-B"] random_student = get_random("Student Applicant", {"application_status": "Approved"}) if random_student: enrollment = enroll_student(random_student) enrollment.academic_year = get_random("Academic Year") enrollment.enrollment_date = current_date + enrollment.student_batch_name = batch[weighted_choice([9,3])] fee_schedule = get_fee_schedule(enrollment.program) for fee in fee_schedule: enrollment.append("fees", fee) + enrolled_courses = get_course(enrollment.program) + for course in enrolled_courses: + enrollment.append("courses", course) enrollment.submit() frappe.db.commit() - assign_student_group(enrollment.student, enrollment.program) + assign_student_group(enrollment.student, enrollment.student_name, enrollment.program, + enrolled_courses, enrollment.student_batch_name) -def assign_student_group(student, program): - courses = [] - for d in frappe.get_list("Program Course", fields=("course"), filters={"parent": program }): - courses.append(d.course) +def assign_student_group(student, student_name, program, courses, batch): + course_list = [d["course"] for d in courses] + for d in frappe.get_list("Student Group", fields=("name"), filters={"program": program, "course":("in", course_list)}): + student_group = frappe.get_doc("Student Group", d.name) + student_group.append("students", {"student": student, "student_name": student_name, + "group_roll_number":len(student_group.students)+1, "active":1}) + student_group.save() + student_batch = frappe.get_list("Student Group", fields=("name"), filters={"program": program, "group_based_on":"Batch", "batch":batch})[0] + student_batch_doc = frappe.get_doc("Student Group", student_batch.name) + student_batch_doc.append("students", {"student": student, "student_name": student_name, + "group_roll_number":len(student_batch_doc.students)+1, "active":1}) + student_batch_doc.save() + frappe.db.commit() - for d in xrange(3): - course = random.choice(courses) - random_sg = get_random("Student Group", {"course": course}) - if random_sg: - student_group = frappe.get_doc("Student Group", random_sg) - student_group.append("students", {"student": student}) - student_group.save() - courses.remove(course) +def mark_student_attendance(current_date): + status = ["Present", "Absent"] + for d in frappe.db.get_list("Student Group", filters={"group_based_on": "Batch"}): + students = get_student_group_students(d.name) + for stud in students: + make_attendance_records(stud.student, stud.student_name, status[weighted_choice([9,4])], None, d.name, current_date) + +def make_fees(): + for d in range(1,10): + random_fee = get_random("Fees", {"paid_amount": 0}) + collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount")) + +def make_assessment_plan(date): + for d in range(1,4): + random_group = get_random("Student Group", {"group_based_on": "Course"}, True) + doc = frappe.new_doc("Assessment Plan") + doc.student_group = random_group.name + doc.course = random_group.course + doc.assessment_group = get_random("Assessment Group", {"is_group": 0, "parent": "2017-18 (Semester 2)"}) + doc.grading_scale = get_random("Grading Scale") + doc.maximum_assessment_score = 100 def make_course_schedule(start_date, end_date): for d in frappe.db.get_list("Student Group"): diff --git a/erpnext/schools/api.py b/erpnext/schools/api.py index 43d24383f90..db65a696025 100644 --- a/erpnext/schools/api.py +++ b/erpnext/schools/api.py @@ -10,6 +10,14 @@ 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 +def get_course(program): + '''Return list of courses for a particular program + :param program: Program + ''' + courses = frappe.db.sql('''select course, course_name from `tabProgram Course` where parent=%s''', + (program), as_dict=1) + return courses + @frappe.whitelist() def enroll_student(source_name): """Creates a Student Record and returns a Program Enrollment.