| # 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 |
| 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, 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)) |
| mark_student_attendance(frappe.flags.current_date) |
| # make_assessment_plan() |
| make_fees() |
| |
| def approve_random_student_applicant(): |
| random_student = get_random("Student Applicant", {"application_status": "Applied"}) |
| if random_student: |
| status = ["Approved", "Rejected"] |
| 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.student_name, enrollment.program, |
| enrolled_courses, enrollment.student_batch_name) |
| |
| 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() |
| |
| 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"): |
| cs = frappe.new_doc("Scheduling Tool") |
| cs.student_group = d.name |
| cs.room = get_random("Room") |
| cs.instructor = get_random("Instructor") |
| cs.course_start_date = cstr(start_date) |
| cs.course_end_date = cstr(end_date) |
| day = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] |
| for x in xrange(3): |
| random_day = random.choice(day) |
| cs.day = random_day |
| cs.from_time = timedelta(hours=(random.randrange(7, 17,1))) |
| cs.to_time = cs.from_time + timedelta(hours=1) |
| cs.schedule_course() |
| day.remove(random_day) |
| |
| |
| def weighted_choice(weights): |
| totals = [] |
| running_total = 0 |
| |
| for w in weights: |
| running_total += w |
| totals.append(running_total) |
| |
| rnd = random.random() * running_total |
| for i, total in enumerate(totals): |
| if rnd < total: |
| return i |