Neil Trini Lasrado | 0672459 | 2016-08-22 12:57:09 +0530 | [diff] [blame] | 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors |
| 2 | # License: GNU General Public License v3. See license.txt |
| 3 | |
| 4 | from __future__ import unicode_literals |
| 5 | |
| 6 | import frappe |
| 7 | import random |
| 8 | from frappe.utils import cstr |
| 9 | from frappe.utils.make_random import get_random |
| 10 | from datetime import timedelta |
| 11 | from erpnext.schools.api import get_student_group_students, make_attendance_records, enroll_student, get_fee_schedule, collect_fees |
| 12 | |
| 13 | def work(): |
| 14 | frappe.set_user(frappe.db.get_global('demo_schools_user')) |
| 15 | for d in xrange(20): |
| 16 | approve_random_student_applicant() |
| 17 | enroll_random_student(frappe.flags.current_date) |
| 18 | if frappe.flags.current_date.weekday()== 0: |
| 19 | make_course_schedule(frappe.flags.current_date, frappe.utils.add_days(frappe.flags.current_date, 5)) |
| 20 | mark_student_attendance(frappe.flags.current_date) |
| 21 | make_fees() |
| 22 | |
| 23 | def mark_student_attendance(current_date): |
| 24 | status = ["Present", "Absent"] |
| 25 | for d in frappe.db.get_list("Course Schedule", filters={"schedule_date": current_date}, fields=("name", "student_group")): |
| 26 | students = get_student_group_students(d.student_group) |
| 27 | for stud in students: |
| 28 | make_attendance_records(stud.student, stud.student_name, d.name, status[weighted_choice([9,4])]) |
| 29 | |
| 30 | def make_fees(): |
| 31 | for d in range(1,10): |
| 32 | random_fee = get_random("Fees", {"paid_amount": 0}) |
| 33 | collect_fees(random_fee, frappe.db.get_value("Fees", random_fee, "outstanding_amount")) |
| 34 | |
| 35 | def approve_random_student_applicant(): |
| 36 | random_student = get_random("Student Applicant", {"application_status": "Applied"}) |
| 37 | if random_student: |
| 38 | status = ["Approved", "Rejected"] |
| 39 | frappe.db.set_value("Student Applicant", random_student, "application_status", status[weighted_choice([9,3])]) |
| 40 | |
| 41 | def enroll_random_student(current_date): |
| 42 | random_student = get_random("Student Applicant", {"application_status": "Approved"}) |
| 43 | if random_student: |
| 44 | enrollment = enroll_student(random_student) |
| 45 | enrollment.academic_year = get_random("Academic Year") |
| 46 | enrollment.enrollment_date = current_date |
| 47 | fee_schedule = get_fee_schedule(enrollment.program) |
| 48 | for fee in fee_schedule: |
| 49 | enrollment.append("fees", fee) |
| 50 | enrollment.submit() |
| 51 | frappe.db.commit() |
| 52 | assign_student_group(enrollment.student, enrollment.program) |
| 53 | |
| 54 | def assign_student_group(student, program): |
| 55 | courses = [] |
| 56 | for d in frappe.get_list("Program Course", fields=("course"), filters={"parent": program }): |
| 57 | courses.append(d.course) |
| 58 | |
| 59 | for d in xrange(3): |
| 60 | course = random.choice(courses) |
| 61 | random_sg = get_random("Student Group", {"course": course}) |
| 62 | if random_sg: |
| 63 | student_group = frappe.get_doc("Student Group", random_sg) |
| 64 | student_group.append("students", {"student": student}) |
| 65 | student_group.save() |
| 66 | courses.remove(course) |
| 67 | |
| 68 | def make_course_schedule(start_date, end_date): |
| 69 | for d in frappe.db.get_list("Student Group"): |
| 70 | cs = frappe.new_doc("Scheduling Tool") |
| 71 | cs.student_group = d.name |
| 72 | cs.room = get_random("Room") |
| 73 | cs.instructor = get_random("Instructor") |
| 74 | cs.course_start_date = cstr(start_date) |
| 75 | cs.course_end_date = cstr(end_date) |
| 76 | day = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"] |
| 77 | for x in xrange(3): |
| 78 | random_day = random.choice(day) |
| 79 | cs.day = random_day |
| 80 | cs.from_time = timedelta(hours=(random.randrange(7, 17,1))) |
| 81 | cs.to_time = cs.from_time + timedelta(hours=1) |
| 82 | cs.schedule_course() |
| 83 | day.remove(random_day) |
| 84 | |
| 85 | |
| 86 | def weighted_choice(weights): |
| 87 | totals = [] |
| 88 | running_total = 0 |
| 89 | |
| 90 | for w in weights: |
| 91 | running_total += w |
| 92 | totals.append(running_total) |
| 93 | |
| 94 | rnd = random.random() * running_total |
| 95 | for i, total in enumerate(totals): |
| 96 | if rnd < total: |
| 97 | return i |