├── .git-blame-ignore-revs ├── .github ├── edu-logo.svg ├── helper │ ├── flake8.conf │ ├── install.sh │ └── site_config.json └── workflows │ ├── builds.yml │ └── ci.yml ├── .gitignore ├── .pre-commit-config.yaml ├── .prettierrc.json ├── MANIFEST.in ├── README.md ├── education ├── __init__.py ├── api │ └── session.py ├── config │ ├── __init__.py │ ├── desktop.py │ └── docs.py ├── education │ ├── __init__.py │ ├── api.py │ ├── billing.py │ ├── doctype │ │ ├── __init__.py │ │ ├── academic_term │ │ │ ├── __init__.py │ │ │ ├── academic_term.js │ │ │ ├── academic_term.json │ │ │ ├── academic_term.py │ │ │ └── test_academic_term.py │ │ ├── academic_year │ │ │ ├── __init__.py │ │ │ ├── academic_year.js │ │ │ ├── academic_year.json │ │ │ ├── academic_year.py │ │ │ └── test_academic_year.py │ │ ├── article │ │ │ ├── __init__.py │ │ │ ├── article.js │ │ │ ├── article.json │ │ │ ├── article.py │ │ │ └── test_article.py │ │ ├── assessment_criteria │ │ │ ├── __init__.py │ │ │ ├── assessment_criteria.js │ │ │ ├── assessment_criteria.json │ │ │ ├── assessment_criteria.py │ │ │ ├── test_assessment_criteria.py │ │ │ └── test_records.json │ │ ├── assessment_criteria_group │ │ │ ├── __init__.py │ │ │ ├── assessment_criteria_group.js │ │ │ ├── assessment_criteria_group.json │ │ │ ├── assessment_criteria_group.py │ │ │ └── test_assessment_criteria_group.py │ │ ├── assessment_group │ │ │ ├── __init__.py │ │ │ ├── assessment_group.js │ │ │ ├── assessment_group.json │ │ │ ├── assessment_group.py │ │ │ ├── assessment_group_dashboard.py │ │ │ ├── assessment_group_tree.js │ │ │ └── test_assessment_group.py │ │ ├── assessment_plan │ │ │ ├── __init__.py │ │ │ ├── assessment_plan.js │ │ │ ├── assessment_plan.json │ │ │ ├── assessment_plan.py │ │ │ ├── assessment_plan_dashboard.py │ │ │ └── test_assessment_plan.py │ │ ├── assessment_plan_criteria │ │ │ ├── __init__.py │ │ │ ├── assessment_plan_criteria.json │ │ │ └── assessment_plan_criteria.py │ │ ├── assessment_result │ │ │ ├── __init__.py │ │ │ ├── assessment_result.js │ │ │ ├── assessment_result.json │ │ │ ├── assessment_result.py │ │ │ ├── assessment_result_dashboard.py │ │ │ └── test_assessment_result.py │ │ ├── assessment_result_detail │ │ │ ├── __init__.py │ │ │ ├── assessment_result_detail.json │ │ │ └── assessment_result_detail.py │ │ ├── assessment_result_tool │ │ │ ├── __init__.py │ │ │ ├── assessment_result_tool.js │ │ │ ├── assessment_result_tool.json │ │ │ ├── assessment_result_tool.py │ │ │ └── test_assessment_result_tool.py │ │ ├── course │ │ │ ├── __init__.py │ │ │ ├── course.js │ │ │ ├── course.json │ │ │ ├── course.py │ │ │ ├── course_dashboard.py │ │ │ ├── test_course.py │ │ │ └── test_records.json │ │ ├── course_activity │ │ │ ├── __init__.py │ │ │ ├── course_activity.js │ │ │ ├── course_activity.json │ │ │ ├── course_activity.py │ │ │ └── test_course_activity.py │ │ ├── course_assessment_criteria │ │ │ ├── __init__.py │ │ │ ├── course_assessment_criteria.json │ │ │ └── course_assessment_criteria.py │ │ ├── course_enrollment │ │ │ ├── __init__.py │ │ │ ├── course_enrollment.js │ │ │ ├── course_enrollment.json │ │ │ ├── course_enrollment.py │ │ │ └── test_course_enrollment.py │ │ ├── course_schedule │ │ │ ├── __init__.py │ │ │ ├── course_schedule.js │ │ │ ├── course_schedule.json │ │ │ ├── course_schedule.py │ │ │ ├── course_schedule_calendar.js │ │ │ ├── course_schedule_dashboard.py │ │ │ └── test_course_schedule.py │ │ ├── course_scheduling_tool │ │ │ ├── __init__.py │ │ │ ├── course_scheduling_tool.js │ │ │ ├── course_scheduling_tool.json │ │ │ ├── course_scheduling_tool.py │ │ │ └── test_course_scheduling_tool.py │ │ ├── course_topic │ │ │ ├── __init__.py │ │ │ ├── course_topic.js │ │ │ ├── course_topic.json │ │ │ ├── course_topic.py │ │ │ └── test_course_topic.py │ │ ├── education_settings │ │ │ ├── __init__.py │ │ │ ├── education_settings.js │ │ │ ├── education_settings.json │ │ │ ├── education_settings.py │ │ │ └── test_education_settings.py │ │ ├── fee_category │ │ │ ├── __init__.py │ │ │ ├── fee_category.js │ │ │ ├── fee_category.json │ │ │ ├── fee_category.py │ │ │ ├── test_fee_category.py │ │ │ └── test_records.json │ │ ├── fee_category_default │ │ │ ├── __init__.py │ │ │ ├── fee_category_default.json │ │ │ └── fee_category_default.py │ │ ├── fee_component │ │ │ ├── __init__.py │ │ │ ├── fee_component.json │ │ │ └── fee_component.py │ │ ├── fee_schedule │ │ │ ├── __init__.py │ │ │ ├── fee_schedule.js │ │ │ ├── fee_schedule.json │ │ │ ├── fee_schedule.py │ │ │ ├── fee_schedule_list.js │ │ │ └── test_fee_schedule.py │ │ ├── fee_schedule_details │ │ │ ├── __init__.py │ │ │ ├── fee_schedule_details.json │ │ │ └── fee_schedule_details.py │ │ ├── fee_schedule_program │ │ │ ├── __init__.py │ │ │ ├── fee_schedule_program.json │ │ │ └── fee_schedule_program.py │ │ ├── fee_schedule_student_group │ │ │ ├── __init__.py │ │ │ ├── fee_schedule_student_group.json │ │ │ └── fee_schedule_student_group.py │ │ ├── fee_structure │ │ │ ├── __init__.py │ │ │ ├── fee_structure.js │ │ │ ├── fee_structure.json │ │ │ ├── fee_structure.py │ │ │ └── test_fee_structure.py │ │ ├── fees │ │ │ ├── __init__.py │ │ │ ├── fees.js │ │ │ ├── fees.json │ │ │ ├── fees.py │ │ │ ├── fees_list.js │ │ │ └── test_fees.py │ │ ├── grading_scale │ │ │ ├── __init__.py │ │ │ ├── grading_scale.js │ │ │ ├── grading_scale.json │ │ │ ├── grading_scale.py │ │ │ ├── grading_scale_dashboard.py │ │ │ ├── test_grading_scale.py │ │ │ └── test_records.json │ │ ├── grading_scale_interval │ │ │ ├── __init__.py │ │ │ ├── grading_scale_interval.json │ │ │ └── grading_scale_interval.py │ │ ├── guardian │ │ │ ├── __init__.py │ │ │ ├── guardian.js │ │ │ ├── guardian.json │ │ │ ├── guardian.py │ │ │ └── test_guardian.py │ │ ├── guardian_interest │ │ │ ├── __init__.py │ │ │ ├── guardian_interest.json │ │ │ └── guardian_interest.py │ │ ├── guardian_student │ │ │ ├── __init__.py │ │ │ ├── guardian_student.json │ │ │ └── guardian_student.py │ │ ├── instructor │ │ │ ├── __init__.py │ │ │ ├── instructor.js │ │ │ ├── instructor.json │ │ │ ├── instructor.py │ │ │ ├── instructor_dashboard.py │ │ │ ├── test_instructor.py │ │ │ └── test_records.json │ │ ├── instructor_log │ │ │ ├── __init__.py │ │ │ ├── instructor_log.json │ │ │ └── instructor_log.py │ │ ├── options │ │ │ ├── __init__.py │ │ │ ├── options.json │ │ │ └── options.py │ │ ├── payment_record │ │ │ ├── __init__.py │ │ │ ├── payment_record.js │ │ │ ├── payment_record.json │ │ │ ├── payment_record.py │ │ │ └── test_payment_record.py │ │ ├── program │ │ │ ├── __init__.py │ │ │ ├── program.js │ │ │ ├── program.json │ │ │ ├── program.py │ │ │ └── test_program.py │ │ ├── program_course │ │ │ ├── __init__.py │ │ │ ├── program_course.json │ │ │ └── program_course.py │ │ ├── program_enrollment │ │ │ ├── __init__.py │ │ │ ├── program_enrollment.js │ │ │ ├── program_enrollment.json │ │ │ ├── program_enrollment.py │ │ │ ├── program_enrollment_dashboard.py │ │ │ └── test_program_enrollment.py │ │ ├── program_enrollment_course │ │ │ ├── __init__.py │ │ │ ├── program_enrollment_course.json │ │ │ └── program_enrollment_course.py │ │ ├── program_enrollment_fee │ │ │ ├── __init__.py │ │ │ ├── program_enrollment_fee.json │ │ │ └── program_enrollment_fee.py │ │ ├── program_enrollment_tool │ │ │ ├── __init__.py │ │ │ ├── program_enrollment_tool.js │ │ │ ├── program_enrollment_tool.json │ │ │ ├── program_enrollment_tool.py │ │ │ └── test_program_enrollment_tool.py │ │ ├── program_enrollment_tool_student │ │ │ ├── __init__.py │ │ │ ├── program_enrollment_tool_student.json │ │ │ └── program_enrollment_tool_student.py │ │ ├── program_fee │ │ │ ├── __init__.py │ │ │ ├── program_fee.json │ │ │ └── program_fee.py │ │ ├── question │ │ │ ├── __init__.py │ │ │ ├── question.js │ │ │ ├── question.json │ │ │ ├── question.py │ │ │ └── test_question.py │ │ ├── quiz │ │ │ ├── __init__.py │ │ │ ├── quiz.js │ │ │ ├── quiz.json │ │ │ ├── quiz.py │ │ │ └── test_quiz.py │ │ ├── quiz_activity │ │ │ ├── __init__.py │ │ │ ├── quiz_activity.js │ │ │ ├── quiz_activity.json │ │ │ ├── quiz_activity.py │ │ │ └── test_quiz_activity.py │ │ ├── quiz_question │ │ │ ├── __init__.py │ │ │ ├── quiz_question.json │ │ │ └── quiz_question.py │ │ ├── quiz_result │ │ │ ├── __init__.py │ │ │ ├── quiz_result.js │ │ │ ├── quiz_result.json │ │ │ ├── quiz_result.py │ │ │ └── test_quiz_result.py │ │ ├── room │ │ │ ├── __init__.py │ │ │ ├── room.js │ │ │ ├── room.json │ │ │ ├── room.py │ │ │ ├── room_dashboard.py │ │ │ ├── test_records.json │ │ │ └── test_room.py │ │ ├── school_house │ │ │ ├── __init__.py │ │ │ ├── school_house.js │ │ │ ├── school_house.json │ │ │ ├── school_house.py │ │ │ └── test_school_house.py │ │ ├── student │ │ │ ├── __init__.py │ │ │ ├── student.js │ │ │ ├── student.json │ │ │ ├── student.py │ │ │ ├── student_dashboard.py │ │ │ ├── student_list.js │ │ │ └── test_student.py │ │ ├── student_admission │ │ │ ├── __init__.py │ │ │ ├── student_admission.js │ │ │ ├── student_admission.json │ │ │ ├── student_admission.py │ │ │ ├── templates │ │ │ │ ├── student_admission.html │ │ │ │ └── student_admission_row.html │ │ │ └── test_student_admission.py │ │ ├── student_admission_program │ │ │ ├── __init__.py │ │ │ ├── student_admission_program.json │ │ │ └── student_admission_program.py │ │ ├── student_applicant │ │ │ ├── __init__.py │ │ │ ├── student_applicant.js │ │ │ ├── student_applicant.json │ │ │ ├── student_applicant.py │ │ │ ├── student_applicant_list.js │ │ │ └── test_student_applicant.py │ │ ├── student_attendance │ │ │ ├── __init__.py │ │ │ ├── student_attendance.js │ │ │ ├── student_attendance.json │ │ │ ├── student_attendance.py │ │ │ ├── student_attendance_dashboard.py │ │ │ └── test_student_attendance.py │ │ ├── student_attendance_tool │ │ │ ├── __init__.py │ │ │ ├── student_attendance_tool.js │ │ │ ├── student_attendance_tool.json │ │ │ ├── student_attendance_tool.py │ │ │ └── test_student_attendance_tool.py │ │ ├── student_batch_name │ │ │ ├── __init__.py │ │ │ ├── student_batch_name.js │ │ │ ├── student_batch_name.json │ │ │ ├── student_batch_name.py │ │ │ ├── test_records.json │ │ │ └── test_student_batch_name.py │ │ ├── student_category │ │ │ ├── __init__.py │ │ │ ├── student_category.js │ │ │ ├── student_category.json │ │ │ ├── student_category.py │ │ │ └── test_student_category.py │ │ ├── student_group │ │ │ ├── __init__.py │ │ │ ├── student_group.js │ │ │ ├── student_group.json │ │ │ ├── student_group.py │ │ │ ├── student_group_dashboard.py │ │ │ └── test_student_group.py │ │ ├── student_group_creation_tool │ │ │ ├── __init__.py │ │ │ ├── student_group_creation_tool.js │ │ │ ├── student_group_creation_tool.json │ │ │ ├── student_group_creation_tool.py │ │ │ └── test_student_group_creation_tool.py │ │ ├── student_group_creation_tool_course │ │ │ ├── __init__.py │ │ │ ├── student_group_creation_tool_course.json │ │ │ └── student_group_creation_tool_course.py │ │ ├── student_group_instructor │ │ │ ├── __init__.py │ │ │ ├── student_group_instructor.json │ │ │ └── student_group_instructor.py │ │ ├── student_group_student │ │ │ ├── __init__.py │ │ │ ├── student_group_student.json │ │ │ └── student_group_student.py │ │ ├── student_guardian │ │ │ ├── __init__.py │ │ │ ├── student_guardian.json │ │ │ └── student_guardian.py │ │ ├── student_language │ │ │ ├── __init__.py │ │ │ ├── student_language.js │ │ │ ├── student_language.json │ │ │ ├── student_language.py │ │ │ └── test_student_language.py │ │ ├── student_leave_application │ │ │ ├── __init__.py │ │ │ ├── student_leave_application.js │ │ │ ├── student_leave_application.json │ │ │ ├── student_leave_application.py │ │ │ ├── student_leave_application_dashboard.py │ │ │ └── test_student_leave_application.py │ │ ├── student_log │ │ │ ├── __init__.py │ │ │ ├── student_log.js │ │ │ ├── student_log.json │ │ │ ├── student_log.py │ │ │ └── test_student_log.py │ │ ├── student_report_generation_tool │ │ │ ├── __init__.py │ │ │ ├── student_report_generation_tool.html │ │ │ ├── student_report_generation_tool.js │ │ │ ├── student_report_generation_tool.json │ │ │ ├── student_report_generation_tool.py │ │ │ └── test_student_report_generation_tool.py │ │ ├── student_sibling │ │ │ ├── __init__.py │ │ │ ├── student_sibling.json │ │ │ └── student_sibling.py │ │ ├── student_siblings │ │ │ ├── __init__.py │ │ │ ├── student_siblings.json │ │ │ └── student_siblings.py │ │ ├── topic │ │ │ ├── __init__.py │ │ │ ├── test_topic.py │ │ │ ├── topic.js │ │ │ ├── topic.json │ │ │ └── topic.py │ │ └── topic_content │ │ │ ├── __init__.py │ │ │ ├── test_topic_content.py │ │ │ ├── topic_content.js │ │ │ ├── topic_content.json │ │ │ └── topic_content.py │ ├── report │ │ ├── __init__.py │ │ ├── absent_student_report │ │ │ ├── __init__.py │ │ │ ├── absent_student_report.js │ │ │ ├── absent_student_report.json │ │ │ └── absent_student_report.py │ │ ├── assessment_plan_status │ │ │ ├── __init__.py │ │ │ ├── assessment_plan_status.js │ │ │ ├── assessment_plan_status.json │ │ │ └── assessment_plan_status.py │ │ ├── course_wise_assessment_report │ │ │ ├── __init__.py │ │ │ ├── course_wise_assessment_report.html │ │ │ ├── course_wise_assessment_report.js │ │ │ ├── course_wise_assessment_report.json │ │ │ └── course_wise_assessment_report.py │ │ ├── final_assessment_grades │ │ │ ├── __init__.py │ │ │ ├── final_assessment_grades.js │ │ │ ├── final_assessment_grades.json │ │ │ └── final_assessment_grades.py │ │ ├── program_wise_fee_collection │ │ │ ├── __init__.py │ │ │ ├── program_wise_fee_collection.js │ │ │ ├── program_wise_fee_collection.json │ │ │ └── program_wise_fee_collection.py │ │ ├── student_and_guardian_contact_details │ │ │ ├── __init__.py │ │ │ ├── student_and_guardian_contact_details.js │ │ │ ├── student_and_guardian_contact_details.json │ │ │ └── student_and_guardian_contact_details.py │ │ ├── student_batch_wise_attendance │ │ │ ├── __init__.py │ │ │ ├── student_batch_wise_attendance.js │ │ │ ├── student_batch_wise_attendance.json │ │ │ └── student_batch_wise_attendance.py │ │ ├── student_fee_collection │ │ │ ├── __init__.py │ │ │ └── student_fee_collection.json │ │ └── student_monthly_attendance_sheet │ │ │ ├── __init__.py │ │ │ ├── student_monthly_attendance_sheet.js │ │ │ ├── student_monthly_attendance_sheet.json │ │ │ └── student_monthly_attendance_sheet.py │ ├── test_utils.py │ ├── utils.py │ ├── web_form │ │ ├── __init__.py │ │ └── student_applicant │ │ │ ├── __init__.py │ │ │ ├── student_applicant.js │ │ │ ├── student_applicant.json │ │ │ └── student_applicant.py │ └── workspace │ │ └── education │ │ └── education.json ├── hooks.py ├── install.py ├── modules.txt ├── patches.txt ├── patches │ ├── v14_0 │ │ ├── create_parent_assessment_group.py │ │ ├── create_student_party_type.py │ │ ├── delete_lms_user_role.py │ │ ├── lms_deprecation_message.py │ │ └── student_name.py │ └── v15_0 │ │ ├── create_custom_permissions.py │ │ ├── create_fee_component_item_group.py │ │ ├── create_parent_assessment_group.py │ │ ├── create_student_customer_group.py │ │ ├── fee_schedule_status_update.py │ │ ├── fees_student_email.py │ │ ├── sales_invoice_student_field.py │ │ ├── sales_order_student_field.py │ │ ├── student_role_desk_access.py │ │ └── student_role_permission_sales_invoice.py ├── public │ ├── .gitkeep │ ├── frontend │ │ ├── assets │ │ │ ├── Inter-Black.05e55dd7.woff2 │ │ │ ├── Inter-Black.9c79713b.woff │ │ │ ├── Inter-Black.bc2198e0.woff2 │ │ │ ├── Inter-BlackItalic.1cb529a7.woff2 │ │ │ ├── Inter-BlackItalic.4ff7db4a.woff2 │ │ │ ├── Inter-BlackItalic.7ecbf9fa.woff │ │ │ ├── Inter-Bold.1dc41a58.woff2 │ │ │ ├── Inter-Bold.2b828bef.woff │ │ │ ├── Inter-Bold.2efd8e3c.woff2 │ │ │ ├── Inter-BoldItalic.8bc8e0ff.woff │ │ │ ├── Inter-BoldItalic.dc0d4194.woff2 │ │ │ ├── Inter-BoldItalic.f528d863.woff2 │ │ │ ├── Inter-DisplayBlack.b1d4e33d.woff2 │ │ │ ├── Inter-DisplayBlackItalic.d561e8dd.woff2 │ │ │ ├── Inter-DisplayBold.d9bf35ac.woff2 │ │ │ ├── Inter-DisplayBoldItalic.fef00c57.woff2 │ │ │ ├── Inter-DisplayExtraBold.b7cc680a.woff2 │ │ │ ├── Inter-DisplayExtraBoldItalic.e5a5984a.woff2 │ │ │ ├── Inter-DisplayExtraLight.32095132.woff2 │ │ │ ├── Inter-DisplayExtraLightItalic.8eeb78f4.woff2 │ │ │ ├── Inter-DisplayItalic.938db435.woff2 │ │ │ ├── Inter-DisplayLight.e40a858d.woff2 │ │ │ ├── Inter-DisplayLightItalic.151e9a11.woff2 │ │ │ ├── Inter-DisplayMedium.12a4a358.woff2 │ │ │ ├── Inter-DisplayMediumItalic.8968b5ab.woff2 │ │ │ ├── Inter-DisplaySemiBold.856fcb49.woff2 │ │ │ ├── Inter-DisplaySemiBoldItalic.5e57e1d2.woff2 │ │ │ ├── Inter-DisplayThin.b64c173b.woff2 │ │ │ ├── Inter-DisplayThinItalic.b70f1c61.woff2 │ │ │ ├── Inter-ExtraBold.585b4ce1.woff │ │ │ ├── Inter-ExtraBold.74e72c6b.woff2 │ │ │ ├── Inter-ExtraBold.8a72efb6.woff2 │ │ │ ├── Inter-ExtraBoldItalic.2abc7ab1.woff2 │ │ │ ├── Inter-ExtraBoldItalic.38e71f7c.woff2 │ │ │ ├── Inter-ExtraBoldItalic.b87f7d97.woff │ │ │ ├── Inter-ExtraLight.1c06ef44.woff │ │ │ ├── Inter-ExtraLight.25a4db7c.woff2 │ │ │ ├── Inter-ExtraLight.4c337585.woff2 │ │ │ ├── Inter-ExtraLightItalic.0e5667b1.woff │ │ │ ├── Inter-ExtraLightItalic.7b39e865.woff2 │ │ │ ├── Inter-ExtraLightItalic.f0df46d0.woff2 │ │ │ ├── Inter-Italic.950174d1.woff2 │ │ │ ├── Inter-Italic.b0b21adf.woff │ │ │ ├── Inter-Italic.dd31ea31.woff2 │ │ │ ├── Inter-Italic.var.d9f448e3.woff2 │ │ │ ├── Inter-Light.211445a8.woff2 │ │ │ ├── Inter-Light.319f53ba.woff │ │ │ ├── Inter-Light.87ed65f8.woff2 │ │ │ ├── Inter-LightItalic.289a60bc.woff │ │ │ ├── Inter-LightItalic.5b94e337.woff2 │ │ │ ├── Inter-LightItalic.9ea2db78.woff2 │ │ │ ├── Inter-Medium.24fb6e39.woff2 │ │ │ ├── Inter-Medium.a4e1e7e6.woff2 │ │ │ ├── Inter-Medium.f500bbb9.woff │ │ │ ├── Inter-MediumItalic.a2db9bea.woff2 │ │ │ ├── Inter-MediumItalic.d06751dd.woff │ │ │ ├── Inter-MediumItalic.d4a7f5d9.woff2 │ │ │ ├── Inter-Regular.b825f1bc.woff │ │ │ ├── Inter-Regular.c342b1b7.woff2 │ │ │ ├── Inter-Regular.edd1deaf.woff2 │ │ │ ├── Inter-SemiBold.3041a990.woff │ │ │ ├── Inter-SemiBold.51419407.woff2 │ │ │ ├── Inter-SemiBold.af44b8a2.woff2 │ │ │ ├── Inter-SemiBoldItalic.5ce565c8.woff │ │ │ ├── Inter-SemiBoldItalic.a4f92da5.woff2 │ │ │ ├── Inter-SemiBoldItalic.daa7095c.woff2 │ │ │ ├── Inter-Thin.2198e9fb.woff │ │ │ ├── Inter-Thin.914c3fab.woff2 │ │ │ ├── Inter-Thin.918c5cbe.woff2 │ │ │ ├── Inter-ThinItalic.382fab25.woff2 │ │ │ ├── Inter-ThinItalic.a3279f0a.woff2 │ │ │ ├── Inter-ThinItalic.f53f21de.woff │ │ │ ├── Inter.var.d30c3bd0.woff2 │ │ │ └── frappe-ui.005832b0.css │ │ ├── favicon.png │ │ └── index.html │ ├── js │ │ ├── assessment_result_tool.html │ │ └── education.bundle.js │ └── node_modules ├── templates │ ├── __init__.py │ ├── generators │ │ └── student_admission.html │ ├── includes │ │ ├── assessment │ │ │ └── assessment_row.html │ │ └── course │ │ │ ├── course_row.html │ │ │ └── macros.html │ └── pages │ │ └── __init__.py ├── translations │ └── ar.csv └── www │ ├── __init__.py │ ├── __pycache__ │ └── __init__.py │ └── student_portal.py ├── frontend ├── .gitignore ├── .prettierrc.json ├── README.md ├── index.html ├── package.json ├── polyfills.js ├── postcss.config.js ├── public │ └── favicon.png ├── src │ ├── App.vue │ ├── assets │ │ └── Inter │ │ │ ├── Inter-Black.woff │ │ │ ├── Inter-Black.woff2 │ │ │ ├── Inter-BlackItalic.woff │ │ │ ├── Inter-BlackItalic.woff2 │ │ │ ├── Inter-Bold.woff │ │ │ ├── Inter-Bold.woff2 │ │ │ ├── Inter-BoldItalic.woff │ │ │ ├── Inter-BoldItalic.woff2 │ │ │ ├── Inter-ExtraBold.woff │ │ │ ├── Inter-ExtraBold.woff2 │ │ │ ├── Inter-ExtraBoldItalic.woff │ │ │ ├── Inter-ExtraBoldItalic.woff2 │ │ │ ├── Inter-ExtraLight.woff │ │ │ ├── Inter-ExtraLight.woff2 │ │ │ ├── Inter-ExtraLightItalic.woff │ │ │ ├── Inter-ExtraLightItalic.woff2 │ │ │ ├── Inter-Italic.woff │ │ │ ├── Inter-Italic.woff2 │ │ │ ├── Inter-Light.woff │ │ │ ├── Inter-Light.woff2 │ │ │ ├── Inter-LightItalic.woff │ │ │ ├── Inter-LightItalic.woff2 │ │ │ ├── Inter-Medium.woff │ │ │ ├── Inter-Medium.woff2 │ │ │ ├── Inter-MediumItalic.woff │ │ │ ├── Inter-MediumItalic.woff2 │ │ │ ├── Inter-Regular.woff │ │ │ ├── Inter-Regular.woff2 │ │ │ ├── Inter-SemiBold.woff │ │ │ ├── Inter-SemiBold.woff2 │ │ │ ├── Inter-SemiBoldItalic.woff │ │ │ ├── Inter-SemiBoldItalic.woff2 │ │ │ ├── Inter-Thin.woff │ │ │ ├── Inter-Thin.woff2 │ │ │ ├── Inter-ThinItalic.woff │ │ │ ├── Inter-ThinItalic.woff2 │ │ │ ├── Inter-italic.var.woff2 │ │ │ ├── Inter-roman.var.woff2 │ │ │ ├── Inter.var.woff2 │ │ │ └── inter.css │ ├── components │ │ ├── AttendanceDetail.vue │ │ ├── Calendar.vue │ │ ├── CalendarEvent.vue │ │ ├── CalendarView.vue │ │ ├── CollapseSidebar.vue │ │ ├── FeesPaymentDialog.vue │ │ ├── Home.vue │ │ ├── MissingData.vue │ │ ├── Navbar.vue │ │ ├── NewLeave.vue │ │ ├── ProfileModal.vue │ │ ├── Sidebar.vue │ │ ├── SidebarLink.vue │ │ ├── UpdateStudentInfo.vue │ │ └── UserDropdown.vue │ ├── index.css │ ├── main.js │ ├── pages │ │ ├── Attendance.vue │ │ ├── Fees.vue │ │ ├── Grades.vue │ │ ├── Home.vue │ │ ├── Leaves.vue │ │ ├── Login.vue │ │ ├── Schedule.vue │ │ └── SchoolDiary.vue │ ├── router.js │ ├── stores │ │ ├── leave.js │ │ ├── session.js │ │ ├── student.js │ │ └── user.js │ └── utils │ │ └── index.js ├── tailwind.config.js ├── vite.config.js ├── yarn-error.log └── yarn.lock ├── license.txt ├── node_modules └── .yarn-integrity ├── package.json ├── requirements.txt ├── setup.py └── yarn.lock /.git-blame-ignore-revs: -------------------------------------------------------------------------------- 1 | # Since version 2.23 (released in August 2019), git-blame has a feature 2 | # to ignore or bypass certain commits. 3 | # 4 | # This file contains a list of commits that are not likely what you 5 | # are looking for in a blame, such as mass reformatting or renaming. 6 | # You can set this file as a default ignore file for blame by running 7 | # the following command. 8 | # 9 | # $ git config blame.ignoreRevsFile .git-blame-ignore-revs 10 | 11 | # bulk formatting 12 | 4318bb260bc46797ddb101ae45fa563d40d55b0d 13 | -------------------------------------------------------------------------------- /.github/edu-logo.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /.github/helper/flake8.conf: -------------------------------------------------------------------------------- 1 | [flake8] 2 | ignore = 3 | B001, 4 | B007, 5 | B009, 6 | B010, 7 | B950, 8 | E101, 9 | E111, 10 | E114, 11 | E116, 12 | E117, 13 | E121, 14 | E122, 15 | E123, 16 | E124, 17 | E125, 18 | E126, 19 | E127, 20 | E128, 21 | E131, 22 | E201, 23 | E202, 24 | E203, 25 | E211, 26 | E221, 27 | E222, 28 | E223, 29 | E224, 30 | E225, 31 | E226, 32 | E228, 33 | E231, 34 | E241, 35 | E242, 36 | E251, 37 | E261, 38 | E262, 39 | E265, 40 | E266, 41 | E271, 42 | E272, 43 | E273, 44 | E274, 45 | E301, 46 | E302, 47 | E303, 48 | E305, 49 | E306, 50 | E402, 51 | E501, 52 | E502, 53 | E701, 54 | E702, 55 | E703, 56 | E741, 57 | F401, 58 | F403, 59 | F405, 60 | W191, 61 | W291, 62 | W292, 63 | W293, 64 | W391, 65 | W503, 66 | W504, 67 | E711, 68 | E129, 69 | F841, 70 | E713, 71 | E712, 72 | 73 | 74 | max-line-length = 200 75 | -------------------------------------------------------------------------------- /.github/helper/site_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "db_host": "127.0.0.1", 3 | "db_port": 3306, 4 | "db_name": "test_frappe", 5 | "db_password": "test_frappe", 6 | "auto_email_id": "test@example.com", 7 | "mail_server": "smtp.example.com", 8 | "mail_login": "test@example.com", 9 | "mail_password": "test", 10 | "admin_password": "admin", 11 | "root_login": "root", 12 | "root_password": "root", 13 | "host_name": "http://test_site:8000", 14 | "install_apps": ["erpnext"], 15 | "throttle_user_limit": 100 16 | } -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.pyc 3 | *.egg-info 4 | *.swp 5 | tags 6 | education/docs/current 7 | dist/ 8 | __pycache__/ 9 | node_modules 10 | education/public/frontend 11 | education/www/education.html 12 | education/www/student-portal.html -------------------------------------------------------------------------------- /.pre-commit-config.yaml: -------------------------------------------------------------------------------- 1 | exclude: 'node_modules|.git' 2 | default_stages: [commit] 3 | fail_fast: false 4 | 5 | 6 | repos: 7 | - repo: https://github.com/pre-commit/pre-commit-hooks 8 | rev: v4.0.1 9 | hooks: 10 | - id: trailing-whitespace 11 | files: "education.*" 12 | exclude: ".*json$|.*txt$|.*csv|.*md|.*svg" 13 | - id: check-yaml 14 | - id: no-commit-to-branch 15 | args: ['--branch', 'develop'] 16 | - id: check-merge-conflict 17 | - id: check-ast 18 | 19 | - repo: https://github.com/adityahase/black 20 | rev: 9cb0a69f4d0030cdf687eddf314468b39ed54119 21 | hooks: 22 | - id: black 23 | additional_dependencies: ['click==8.0.4'] 24 | 25 | - repo: https://github.com/PyCQA/flake8 26 | rev: 5.0.4 27 | hooks: 28 | - id: flake8 29 | additional_dependencies: ["flake8-bugbear"] 30 | args: ["--config", ".github/helper/flake8.conf"] 31 | 32 | - repo: https://github.com/pre-commit/mirrors-prettier 33 | rev: v2.7.1 34 | hooks: 35 | - id: prettier 36 | types_or: [javascript, vue, scss] 37 | 38 | ci: 39 | autoupdate_schedule: weekly 40 | skip: [] 41 | submodules: false 42 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true, 4 | "tabWidth": 2, 5 | "proseWrap": "always" 6 | } -------------------------------------------------------------------------------- /MANIFEST.in: -------------------------------------------------------------------------------- 1 | include MANIFEST.in 2 | include requirements.txt 3 | include *.json 4 | include *.md 5 | include *.py 6 | include *.txt 7 | recursive-include education *.css 8 | recursive-include education *.csv 9 | recursive-include education *.html 10 | recursive-include education *.ico 11 | recursive-include education *.js 12 | recursive-include education *.json 13 | recursive-include education *.md 14 | recursive-include education *.png 15 | recursive-include education *.py 16 | recursive-include education *.svg 17 | recursive-include education *.txt 18 | recursive-exclude education *.pyc -------------------------------------------------------------------------------- /education/__init__.py: -------------------------------------------------------------------------------- 1 | __version__ = "15.5.0" 2 | -------------------------------------------------------------------------------- /education/api/session.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | -------------------------------------------------------------------------------- /education/config/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/config/__init__.py -------------------------------------------------------------------------------- /education/config/desktop.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | 4 | def get_data(): 5 | return [ 6 | { 7 | "module_name": "Education", 8 | "color": "grey", 9 | "icon": "octicon octicon-file-directory", 10 | "type": "module", 11 | "label": _("Education"), 12 | } 13 | ] 14 | -------------------------------------------------------------------------------- /education/config/docs.py: -------------------------------------------------------------------------------- 1 | """ 2 | Configuration for docs 3 | """ 4 | 5 | # source_link = "https://github.com/[org_name]/education" 6 | # headline = "App that does everything" 7 | # sub_heading = "Yes, you got that right the first time, everything" 8 | 9 | 10 | def get_context(context): 11 | context.brand_html = "Education" 12 | -------------------------------------------------------------------------------- /education/education/__init__.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe import _ 3 | 4 | 5 | class StudentNotInGroupError(frappe.ValidationError): 6 | pass 7 | 8 | 9 | def validate_student_belongs_to_group(student, student_group): 10 | groups = frappe.db.get_all( 11 | "Student Group Student", ["parent"], dict(student=student, active=1) 12 | ) 13 | if not student_group in [d.parent for d in groups]: 14 | frappe.throw( 15 | _("Student {0} does not belong to group {1}").format( 16 | frappe.bold(student), frappe.bold(student_group) 17 | ), 18 | StudentNotInGroupError, 19 | ) 20 | -------------------------------------------------------------------------------- /education/education/doctype/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/academic_term/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/academic_term/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/academic_term/academic_term.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Academic Term', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/academic_term/test_academic_term.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | from frappe.tests.utils import FrappeTestCase 5 | 6 | # test_records = frappe.get_test_records('Academic Term') 7 | 8 | 9 | class TestAcademicTerm(FrappeTestCase): 10 | pass 11 | -------------------------------------------------------------------------------- /education/education/doctype/academic_year/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/academic_year/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/academic_year/academic_year.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Academic Year', {}) 2 | -------------------------------------------------------------------------------- /education/education/doctype/academic_year/academic_year.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe import _ 7 | from frappe.model.document import Document 8 | 9 | 10 | class AcademicYear(Document): 11 | def validate(self): 12 | # Check that start of academic year is earlier than end of academic year 13 | if ( 14 | self.year_start_date 15 | and self.year_end_date 16 | and self.year_start_date > self.year_end_date 17 | ): 18 | frappe.throw( 19 | _( 20 | "The Year End Date cannot be earlier than the Year Start Date. Please correct the dates and try again." 21 | ) 22 | ) 23 | -------------------------------------------------------------------------------- /education/education/doctype/academic_year/test_academic_year.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | import frappe 6 | from frappe.tests.utils import FrappeTestCase 7 | 8 | 9 | class TestAcademicYear(FrappeTestCase): 10 | def test_date_validation(self): 11 | year = frappe.get_doc( 12 | { 13 | "doctype": "Academic Year", 14 | "year_start_date": "13-02-2023", 15 | "year_end_date": "27-01-2023", 16 | } 17 | ) 18 | self.assertRaises(frappe.ValidationError, year.insert) 19 | -------------------------------------------------------------------------------- /education/education/doctype/article/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/article/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/article/article.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_import": 1, 4 | "allow_rename": 1, 5 | "autoname": "field:title", 6 | "creation": "2018-10-17 05:45:38.471670", 7 | "doctype": "DocType", 8 | "editable_grid": 1, 9 | "engine": "InnoDB", 10 | "field_order": [ 11 | "title", 12 | "author", 13 | "content", 14 | "publish_date" 15 | ], 16 | "fields": [ 17 | { 18 | "fieldname": "title", 19 | "fieldtype": "Data", 20 | "label": "Title", 21 | "unique": 1 22 | }, 23 | { 24 | "fieldname": "author", 25 | "fieldtype": "Data", 26 | "label": "Author" 27 | }, 28 | { 29 | "fieldname": "content", 30 | "fieldtype": "Text Editor", 31 | "label": "Content" 32 | }, 33 | { 34 | "fieldname": "publish_date", 35 | "fieldtype": "Date", 36 | "label": "Publish Date" 37 | } 38 | ], 39 | "links": [], 40 | "modified": "2023-02-06 12:23:28.330556", 41 | "modified_by": "Administrator", 42 | "module": "Education", 43 | "name": "Article", 44 | "naming_rule": "By fieldname", 45 | "owner": "Administrator", 46 | "permissions": [ 47 | { 48 | "create": 1, 49 | "delete": 1, 50 | "email": 1, 51 | "export": 1, 52 | "print": 1, 53 | "read": 1, 54 | "report": 1, 55 | "role": "Academics User", 56 | "share": 1, 57 | "write": 1 58 | }, 59 | { 60 | "create": 1, 61 | "delete": 1, 62 | "email": 1, 63 | "export": 1, 64 | "print": 1, 65 | "read": 1, 66 | "report": 1, 67 | "role": "Instructor", 68 | "share": 1, 69 | "write": 1 70 | } 71 | ], 72 | "sort_field": "modified", 73 | "sort_order": "DESC", 74 | "states": [], 75 | "track_changes": 1 76 | } -------------------------------------------------------------------------------- /education/education/doctype/article/article.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe.model.document import Document 7 | 8 | 9 | class Article(Document): 10 | def get_article(self): 11 | pass 12 | 13 | 14 | @frappe.whitelist() 15 | def get_topics_without_article(article): 16 | data = [] 17 | for entry in frappe.db.get_all("Topic"): 18 | topic = frappe.get_doc("Topic", entry.name) 19 | topic_contents = [tc.content for tc in topic.topic_content] 20 | if not topic_contents or article not in topic_contents: 21 | data.append(topic.name) 22 | return data 23 | -------------------------------------------------------------------------------- /education/education/doctype/article/test_article.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestArticle(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_criteria/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria/assessment_criteria.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Assessment Criteria', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria/assessment_criteria.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe import _ 7 | from frappe.model.document import Document 8 | 9 | STD_CRITERIA = [ 10 | "total", 11 | "total score", 12 | "total grade", 13 | "maximum score", 14 | "score", 15 | "grade", 16 | ] 17 | 18 | 19 | class AssessmentCriteria(Document): 20 | def validate(self): 21 | if self.assessment_criteria.lower() in STD_CRITERIA: 22 | frappe.throw(_("Can't create standard criteria. Please rename the criteria")) 23 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria/test_assessment_criteria.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Assessment Criteria') 8 | 9 | 10 | class TestAssessmentCriteria(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "assessment_criteria": "_Test Assessment Criteria" 4 | }, 5 | { 6 | "assessment_criteria": "_Test Assessment Criteria 1" 7 | } 8 | ] 9 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria_group/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_criteria_group/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria_group/assessment_criteria_group.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Assessment Criteria Group', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria_group/assessment_criteria_group.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class AssessmentCriteriaGroup(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_criteria_group/test_assessment_criteria_group.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Assessment Criteria Group') 8 | 9 | 10 | class TestAssessmentCriteriaGroup(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_group/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_group/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_group/assessment_group.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Assessment Group', { 5 | onload: function (frm) { 6 | frm.list_route = 'Tree/Assessment Group' 7 | }, 8 | }) 9 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_group/assessment_group.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class AssessmentGroup(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_group/assessment_group_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "fieldname": "assessment_group", 10 | "transactions": [ 11 | {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]} 12 | ], 13 | } 14 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_group/assessment_group_tree.js: -------------------------------------------------------------------------------- 1 | frappe.treeview_settings['Assessment Group'] = {} 2 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_group/test_assessment_group.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Assessment Group') 8 | 9 | 10 | class TestAssessmentGroup(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_plan/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_plan/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_plan/assessment_plan_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "fieldname": "assessment_plan", 10 | "transactions": [{"label": _("Assessment"), "items": ["Assessment Result"]}], 11 | "reports": [{"label": _("Report"), "items": ["Assessment Plan Status"]}], 12 | } 13 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_plan/test_assessment_plan.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Assessment Plan') 8 | 9 | 10 | class TestAssessmentPlan(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_plan_criteria/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_plan_criteria/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_plan_criteria/assessment_plan_criteria.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class AssessmentPlanCriteria(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_result/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_result/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_result/assessment_result_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "reports": [ 10 | { 11 | "label": _("Reports"), 12 | "items": ["Final Assessment Grades", "Course wise Assessment Report"], 13 | } 14 | ] 15 | } 16 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_result/test_assessment_result.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | from education.education.api import get_grade 8 | from education.education.test_utils import create_grading_scale 9 | 10 | # test_records = frappe.get_test_records('Assessment Result') 11 | 12 | 13 | class TestAssessmentResult(FrappeTestCase): 14 | def setUp(self): 15 | create_grading_scale() 16 | 17 | def tearDown(self): 18 | frappe.db.rollback() 19 | 20 | def test_grade(self): 21 | grade = get_grade("_Test Grading Scale", 80) 22 | self.assertEqual("A", grade) 23 | 24 | grade = get_grade("_Test Grading Scale", 70) 25 | self.assertEqual("B", grade) 26 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_result_detail/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_result_detail/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_result_detail/assessment_result_detail.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2016-12-14 17:44:35.583123", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "assessment_criteria", 9 | "maximum_score", 10 | "column_break_2", 11 | "score", 12 | "grade" 13 | ], 14 | "fields": [ 15 | { 16 | "columns": 4, 17 | "fieldname": "assessment_criteria", 18 | "fieldtype": "Link", 19 | "in_list_view": 1, 20 | "label": "Assessment Criteria", 21 | "options": "Assessment Criteria", 22 | "read_only": 1, 23 | "reqd": 1 24 | }, 25 | { 26 | "columns": 2, 27 | "fieldname": "maximum_score", 28 | "fieldtype": "Float", 29 | "in_list_view": 1, 30 | "label": "Maximum Score", 31 | "read_only": 1 32 | }, 33 | { 34 | "fieldname": "column_break_2", 35 | "fieldtype": "Column Break" 36 | }, 37 | { 38 | "columns": 2, 39 | "fieldname": "score", 40 | "fieldtype": "Float", 41 | "in_list_view": 1, 42 | "label": "Score", 43 | "reqd": 1 44 | }, 45 | { 46 | "columns": 2, 47 | "fieldname": "grade", 48 | "fieldtype": "Data", 49 | "in_list_view": 1, 50 | "label": "Grade", 51 | "read_only": 1 52 | } 53 | ], 54 | "istable": 1, 55 | "links": [], 56 | "modified": "2020-07-31 13:27:17.699022", 57 | "modified_by": "Administrator", 58 | "module": "Education", 59 | "name": "Assessment Result Detail", 60 | "owner": "Administrator", 61 | "permissions": [], 62 | "quick_entry": 1, 63 | "restrict_to_domain": "", 64 | "sort_field": "modified", 65 | "sort_order": "DESC" 66 | } -------------------------------------------------------------------------------- /education/education/doctype/assessment_result_detail/assessment_result_detail.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class AssessmentResultDetail(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_result_tool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/assessment_result_tool/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/assessment_result_tool/assessment_result_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class AssessmentResultTool(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/assessment_result_tool/test_assessment_result_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestAssessmentResultTool(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/course/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course/course_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "fieldname": "course", 10 | "transactions": [ 11 | { 12 | "label": _("Program and Course"), 13 | "items": ["Program", "Course Enrollment", "Course Schedule"], 14 | }, 15 | {"label": _("Student"), "items": ["Student Group"]}, 16 | {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]}, 17 | ], 18 | } 19 | -------------------------------------------------------------------------------- /education/education/doctype/course/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "course_name": "TC100", 4 | "course_abbreviation": "TC" 5 | }, 6 | { 7 | "course_name": "TC101", 8 | "course_abbreviation": "TC1" 9 | }, 10 | { 11 | "course_name": "TC102", 12 | "course_abbreviation": "TC2" 13 | } 14 | ] -------------------------------------------------------------------------------- /education/education/doctype/course_activity/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course_activity/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course_activity/course_activity.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Course Activity', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/course_activity/course_activity.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe import _ 7 | from frappe.model.document import Document 8 | 9 | 10 | class CourseActivity(Document): 11 | def validate(self): 12 | self.check_if_enrolled() 13 | 14 | def check_if_enrolled(self): 15 | if frappe.db.exists("Course Enrollment", self.enrollment): 16 | return True 17 | else: 18 | frappe.throw(_("Course Enrollment {0} does not exists").format(self.enrollment)) 19 | -------------------------------------------------------------------------------- /education/education/doctype/course_activity/test_course_activity.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | import frappe 8 | 9 | 10 | class TestCourseActivity(FrappeTestCase): 11 | pass 12 | 13 | 14 | def make_course_activity(enrollment, content_type, content): 15 | activity = frappe.get_all( 16 | "Course Activity", 17 | filters={"enrollment": enrollment, "content_type": content_type, "content": content}, 18 | ) 19 | try: 20 | activity = frappe.get_doc("Course Activity", activity[0]["name"]) 21 | except (IndexError, frappe.DoesNotExistError): 22 | activity = frappe.get_doc( 23 | { 24 | "doctype": "Course Activity", 25 | "enrollment": enrollment, 26 | "content_type": content_type, 27 | "content": content, 28 | "activity_date": frappe.utils.datetime.datetime.now(), 29 | } 30 | ).insert() 31 | return activity 32 | -------------------------------------------------------------------------------- /education/education/doctype/course_assessment_criteria/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course_assessment_criteria/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course_assessment_criteria/course_assessment_criteria.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class CourseAssessmentCriteria(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/course_enrollment/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course_enrollment/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course_enrollment/course_enrollment.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Course Enrollment', { 5 | onload: function (frm) { 6 | frm.set_query('course', function () { 7 | return { 8 | query: 9 | 'education.education.doctype.program_enrollment.program_enrollment.get_program_courses', 10 | filters: { 11 | program: frm.doc.program, 12 | }, 13 | } 14 | }) 15 | }, 16 | }) 17 | -------------------------------------------------------------------------------- /education/education/doctype/course_enrollment/test_course_enrollment.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | import frappe 6 | 7 | from frappe.tests.utils import FrappeTestCase 8 | 9 | 10 | class TestCourseEnrollment(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/course_schedule/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course_schedule/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course_schedule/course_schedule.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Course Schedule', { 2 | refresh: function (frm) { 3 | if (!frm.doc.__islocal) { 4 | frm.add_custom_button(__('Mark Attendance'), function () { 5 | frappe.route_options = { 6 | based_on: 'Course Schedule', 7 | course_schedule: frm.doc.name, 8 | } 9 | frappe.set_route('Form', 'Student Attendance Tool') 10 | }) 11 | } 12 | if (frm.doc.student_group) { 13 | frm.events.get_instructors(frm) 14 | } 15 | }, 16 | 17 | onload: (frm) => { 18 | frm.set_query('instructor', () => { 19 | if (frm.instructors.length) { 20 | return { 21 | filters: { 22 | instructor_name: ['in', frm.instructors], 23 | }, 24 | } 25 | } else return 26 | }) 27 | 28 | frm.set_query('course', function () { 29 | return { 30 | query: 31 | 'education.education.doctype.program_enrollment.program_enrollment.get_program_courses', 32 | filters: { 33 | program: frm.doc.program, 34 | }, 35 | } 36 | }) 37 | }, 38 | 39 | student_group: (frm) => { 40 | frm.events.get_instructors(frm) 41 | }, 42 | 43 | get_instructors: (frm) => { 44 | frm.instructors = [] 45 | frappe.call({ 46 | method: 'education.education.api.get_instructors', 47 | args: { 48 | student_group: frm.doc.student_group, 49 | }, 50 | callback: function (data) { 51 | frm.instructors = data.message 52 | }, 53 | }) 54 | }, 55 | }) 56 | -------------------------------------------------------------------------------- /education/education/doctype/course_schedule/course_schedule_calendar.js: -------------------------------------------------------------------------------- 1 | frappe.views.calendar['Course Schedule'] = { 2 | field_map: { 3 | start: 'from_time', 4 | end: 'to_time', 5 | id: 'name', 6 | title: 'course', 7 | allDay: 'allDay', 8 | }, 9 | gantt: false, 10 | order_by: 'schedule_date', 11 | filters: [ 12 | { 13 | fieldtype: 'Link', 14 | fieldname: 'student_group', 15 | options: 'Student Group', 16 | label: __('Student Group'), 17 | }, 18 | { 19 | fieldtype: 'Link', 20 | fieldname: 'course', 21 | options: 'Course', 22 | label: __('Course'), 23 | }, 24 | { 25 | fieldtype: 'Link', 26 | fieldname: 'instructor', 27 | options: 'Instructor', 28 | label: __('Instructor'), 29 | }, 30 | { 31 | fieldtype: 'Link', 32 | fieldname: 'room', 33 | options: 'Room', 34 | label: __('Room'), 35 | }, 36 | ], 37 | get_events_method: 'education.education.api.get_course_schedule_events', 38 | } 39 | -------------------------------------------------------------------------------- /education/education/doctype/course_schedule/course_schedule_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "fieldname": "course_schedule", 10 | "transactions": [{"label": _("Attendance"), "items": ["Student Attendance"]}], 11 | } 12 | -------------------------------------------------------------------------------- /education/education/doctype/course_scheduling_tool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course_scheduling_tool/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course_scheduling_tool/test_course_scheduling_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestCourseSchedulingTool(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/course_topic/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/course_topic/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/course_topic/course_topic.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Course Topic', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/course_topic/course_topic.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class CourseTopic(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/course_topic/test_course_topic.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestCourseTopic(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/education_settings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/education_settings/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/education_settings/education_settings.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Education Settings', { 5 | onload: function (frm) { 6 | frm.set_query('current_academic_term', (doc) => { 7 | return { 8 | filters: { 9 | academic_year: doc.current_academic_year, 10 | }, 11 | } 12 | }) 13 | }, 14 | }) 15 | -------------------------------------------------------------------------------- /education/education/doctype/education_settings/education_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | import frappe.defaults 7 | from frappe.model.document import Document 8 | 9 | education_keydict = { 10 | # "key in defaults": "key in Global Defaults" 11 | "academic_year": "current_academic_year", 12 | "academic_term": "current_academic_term", 13 | "validate_batch": "validate_batch", 14 | "validate_course": "validate_course", 15 | } 16 | 17 | 18 | class EducationSettings(Document): 19 | def on_update(self): 20 | """update defaults""" 21 | for key in education_keydict: 22 | frappe.db.set_default(key, self.get(education_keydict[key], "")) 23 | 24 | # clear cache 25 | frappe.clear_cache() 26 | 27 | def get_defaults(self): 28 | return frappe.defaults.get_defaults() 29 | 30 | def validate(self): 31 | from frappe.custom.doctype.property_setter.property_setter import make_property_setter 32 | 33 | if self.get("instructor_created_by") == "Naming Series": 34 | make_property_setter( 35 | "Instructor", 36 | "naming_series", 37 | "hidden", 38 | 0, 39 | "Check", 40 | validate_fields_for_doctype=False, 41 | ) 42 | else: 43 | make_property_setter( 44 | "Instructor", 45 | "naming_series", 46 | "hidden", 47 | 1, 48 | "Check", 49 | validate_fields_for_doctype=False, 50 | ) 51 | -------------------------------------------------------------------------------- /education/education/doctype/education_settings/test_education_settings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestEducationSettings(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/fee_category/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_category/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_category/fee_category.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Fee Category', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/fee_category/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "category_name": "Admission Fee" 4 | }, 5 | { 6 | "category_name": "Tuition Fee" 7 | }, 8 | { 9 | "category_name": "Transportation Fee" 10 | } 11 | ] -------------------------------------------------------------------------------- /education/education/doctype/fee_category_default/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_category_default/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_category_default/fee_category_default.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-05-28 11:36:10.928607", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "company", 10 | "income_account", 11 | "selling_cost_center" 12 | ], 13 | "fields": [ 14 | { 15 | "fieldname": "company", 16 | "fieldtype": "Link", 17 | "ignore_user_permissions": 1, 18 | "in_list_view": 1, 19 | "label": "Company", 20 | "options": "Company", 21 | "reqd": 1 22 | }, 23 | { 24 | "fieldname": "selling_cost_center", 25 | "fieldtype": "Link", 26 | "in_list_view": 1, 27 | "label": "Default Cost Center", 28 | "link_filters": "[[\"Cost Center\",\"is_group\",\"=\",0],[\"Cost Center\",\"company\",\"=\",\"eval: doc.company\"]]", 29 | "options": "Cost Center" 30 | }, 31 | { 32 | "fieldname": "income_account", 33 | "fieldtype": "Link", 34 | "in_list_view": 1, 35 | "label": "Default Income Account", 36 | "link_filters": "[[\"Account\",\"company\",\"=\",\"eval: doc.company\"],[\"Account\",\"is_group\",\"=\",0],[\"Account\",\"root_type\",\"=\",\"Income\"]]", 37 | "options": "Account" 38 | } 39 | ], 40 | "index_web_pages_for_search": 1, 41 | "istable": 1, 42 | "links": [], 43 | "modified": "2024-06-28 13:05:14.403852", 44 | "modified_by": "Administrator", 45 | "module": "Education", 46 | "name": "Fee Category Default", 47 | "owner": "Administrator", 48 | "permissions": [], 49 | "sort_field": "creation", 50 | "sort_order": "DESC", 51 | "states": [] 52 | } -------------------------------------------------------------------------------- /education/education/doctype/fee_category_default/fee_category_default.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | 8 | class FeeCategoryDefault(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/fee_component/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_component/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_component/fee_component.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class FeeComponent(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_schedule/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule/fee_schedule_list.js: -------------------------------------------------------------------------------- 1 | frappe.listview_settings['Fee Schedule'] = { 2 | add_fields: ['status', 'due_date', 'grand_total'], 3 | } 4 | -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_details/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_schedule_details/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_details/fee_schedule_details.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "creation": "2024-01-10 13:14:22.550624", 5 | "doctype": "DocType", 6 | "editable_grid": 1, 7 | "engine": "InnoDB", 8 | "field_order": [ 9 | "month", 10 | "due_date", 11 | "amount" 12 | ], 13 | "fields": [ 14 | { 15 | "fieldname": "month", 16 | "fieldtype": "Data", 17 | "in_list_view": 1, 18 | "label": "Month" 19 | }, 20 | { 21 | "fieldname": "due_date", 22 | "fieldtype": "Date", 23 | "in_list_view": 1, 24 | "label": "Due Date" 25 | }, 26 | { 27 | "fieldname": "amount", 28 | "fieldtype": "Float", 29 | "in_list_view": 1, 30 | "label": "Amount" 31 | } 32 | ], 33 | "index_web_pages_for_search": 1, 34 | "istable": 1, 35 | "links": [], 36 | "modified": "2024-01-10 13:24:12.914268", 37 | "modified_by": "Administrator", 38 | "module": "Education", 39 | "name": "Fee Schedule Details", 40 | "owner": "Administrator", 41 | "permissions": [], 42 | "sort_field": "modified", 43 | "sort_order": "DESC", 44 | "states": [] 45 | } -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_details/fee_schedule_details.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | 8 | class FeeScheduleDetails(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_program/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_schedule_program/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_program/fee_schedule_program.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class FeeScheduleProgram(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_student_group/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_schedule_student_group/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fee_schedule_student_group/fee_schedule_student_group.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class FeeScheduleStudentGroup(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/fee_structure/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fee_structure/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fees/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/fees/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/fees/fees_list.js: -------------------------------------------------------------------------------- 1 | frappe.listview_settings['Fees'] = { 2 | add_fields: ['grand_total', 'outstanding_amount', 'due_date'], 3 | get_indicator: function (doc) { 4 | if (flt(doc.outstanding_amount) == 0) { 5 | return [__('Paid'), 'green', 'outstanding_amount,=,0'] 6 | } else if ( 7 | flt(doc.outstanding_amount) > 0 && 8 | doc.due_date >= frappe.datetime.get_today() 9 | ) { 10 | return [__('Unpaid'), 'orange', 'outstanding_amount,>,0|due_date,>,Today'] 11 | } else if ( 12 | flt(doc.outstanding_amount) > 0 && 13 | doc.due_date < frappe.datetime.get_today() 14 | ) { 15 | return [__('Overdue'), 'red', 'outstanding_amount,>,0|due_date,<=,Today'] 16 | } 17 | }, 18 | } 19 | -------------------------------------------------------------------------------- /education/education/doctype/fees/test_fees.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | import frappe 6 | from frappe.utils import nowdate 7 | from frappe.utils.make_random import get_random 8 | from frappe.tests.utils import FrappeTestCase 9 | 10 | from education.education.doctype.program.test_program import ( 11 | make_program_and_linked_courses, 12 | ) 13 | 14 | 15 | class TestFees(FrappeTestCase): 16 | # deprecated 17 | pass 18 | -------------------------------------------------------------------------------- /education/education/doctype/grading_scale/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/grading_scale/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/grading_scale/grading_scale.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Grading Scale', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/grading_scale/grading_scale.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe import _ 7 | from frappe.model.document import Document 8 | from frappe.utils import cint 9 | 10 | 11 | class GradingScale(Document): 12 | def validate(self): 13 | thresholds = [] 14 | for d in self.intervals: 15 | if d.threshold in thresholds: 16 | frappe.throw(_("Treshold {0}% appears more than once").format(d.threshold)) 17 | else: 18 | thresholds.append(cint(d.threshold)) 19 | if 0 not in thresholds: 20 | frappe.throw(_("Please define grade for Threshold 0%")) 21 | -------------------------------------------------------------------------------- /education/education/doctype/grading_scale/grading_scale_dashboard.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | 4 | def get_data(): 5 | return { 6 | "fieldname": "grading_scale", 7 | "non_standard_fieldnames": {"Course": "default_grading_scale"}, 8 | "transactions": [ 9 | {"label": _("Course"), "items": ["Course"]}, 10 | {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]}, 11 | ], 12 | } 13 | -------------------------------------------------------------------------------- /education/education/doctype/grading_scale/test_grading_scale.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Grading Scale') 8 | 9 | 10 | class TestGradingScale(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/grading_scale/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "grading_scale_name": "_Test Grading Scale", 4 | "intervals": [ 5 | { 6 | "grade_code": "A", 7 | "threshold": 75 8 | }, 9 | { 10 | "grade_code": "B", 11 | "threshold": 50 12 | }, 13 | { 14 | "grade_code": "C", 15 | "threshold": 0 16 | } 17 | ] 18 | } 19 | ] -------------------------------------------------------------------------------- /education/education/doctype/grading_scale_interval/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/grading_scale_interval/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/grading_scale_interval/grading_scale_interval.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class GradingScaleInterval(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/guardian/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/guardian/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/guardian/guardian.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Guardian', { 5 | refresh: function (frm) { 6 | if (!frm.doc.user && !frm.is_new()) { 7 | frm.add_custom_button(__('Invite as User'), function () { 8 | return frappe.call({ 9 | method: 10 | 'education.education.doctype.guardian.guardian.invite_guardian', 11 | args: { 12 | guardian: frm.doc.name, 13 | }, 14 | callback: function (r) { 15 | frm.set_value('user', r.message) 16 | }, 17 | }) 18 | }) 19 | } 20 | }, 21 | }) 22 | -------------------------------------------------------------------------------- /education/education/doctype/guardian/test_guardian.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Guardian') 8 | 9 | 10 | class TestGuardian(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/guardian_interest/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/guardian_interest/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/guardian_interest/guardian_interest.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class GuardianInterest(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/guardian_student/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/guardian_student/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/guardian_student/guardian_student.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class GuardianStudent(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/instructor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/instructor/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/instructor/instructor_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "heatmap": True, 10 | "heatmap_message": _("This is based on the course schedules of this Instructor"), 11 | "fieldname": "instructor", 12 | "non_standard_fieldnames": {"Assessment Plan": "supervisor"}, 13 | "transactions": [ 14 | { 15 | "label": _("Course and Assessment"), 16 | "items": ["Course Schedule", "Assessment Plan"], 17 | }, 18 | {"label": _("Students"), "items": ["Student Group"]}, 19 | ], 20 | } 21 | -------------------------------------------------------------------------------- /education/education/doctype/instructor/test_instructor.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Instructor') 8 | 9 | 10 | class TestInstructor(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/instructor/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "naming_series": "_T-Instructor-", 4 | "employee": "_T-Employee-00001", 5 | "instructor_name": "_Test Instructor" 6 | }, 7 | { 8 | "naming_series": "_T-Instructor-", 9 | "employee": "_T-Employee-00002", 10 | "instructor_name": "_Test Instructor 2" 11 | } 12 | ] 13 | -------------------------------------------------------------------------------- /education/education/doctype/instructor_log/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/instructor_log/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/instructor_log/instructor_log.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class InstructorLog(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/options/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/options/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/options/options.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class Options(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/payment_record/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/payment_record/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/payment_record/payment_record.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | // frappe.ui.form.on("Payment Record", { 5 | // refresh(frm) { 6 | 7 | // }, 8 | // }); 9 | -------------------------------------------------------------------------------- /education/education/doctype/payment_record/payment_record.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | # import frappe 5 | from frappe.model.document import Document 6 | 7 | 8 | class PaymentRecord(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/payment_record/test_payment_record.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2024, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | # import frappe 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestPaymentRecord(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/program/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program/program.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015, Frappe Technologies and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Program Course', { 5 | courses_add: function (frm) { 6 | frm.fields_dict['courses'].grid.get_field('course').get_query = function ( 7 | doc 8 | ) { 9 | var courses_list = [] 10 | $.each(doc.courses, function (idx, val) { 11 | if (val.course) courses_list.push(val.course) 12 | }) 13 | return { filters: [['Course', 'name', 'not in', courses_list]] } 14 | } 15 | }, 16 | }) 17 | -------------------------------------------------------------------------------- /education/education/doctype/program/program.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe.model.document import Document 7 | 8 | 9 | class Program(Document): 10 | def get_course_list(self): 11 | program_course_list = self.courses 12 | course_list = [ 13 | frappe.get_doc("Course", program_course.course) 14 | for program_course in program_course_list 15 | ] 16 | return course_list 17 | -------------------------------------------------------------------------------- /education/education/doctype/program_course/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_course/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_course/program_course.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2015-09-07 14:37:01.886859", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "course", 9 | "course_name", 10 | "required" 11 | ], 12 | "fields": [ 13 | { 14 | "fieldname": "course", 15 | "fieldtype": "Link", 16 | "in_global_search": 1, 17 | "in_list_view": 1, 18 | "label": "Course", 19 | "options": "Course", 20 | "reqd": 1 21 | }, 22 | { 23 | "fetch_from": "course.course_name", 24 | "fieldname": "course_name", 25 | "fieldtype": "Data", 26 | "in_list_view": 1, 27 | "label": "Course Name", 28 | "read_only": 1 29 | }, 30 | { 31 | "default": "1", 32 | "fieldname": "required", 33 | "fieldtype": "Check", 34 | "in_list_view": 1, 35 | "label": "Mandatory" 36 | } 37 | ], 38 | "istable": 1, 39 | "links": [], 40 | "modified": "2020-09-15 18:14:22.816795", 41 | "modified_by": "Administrator", 42 | "module": "Education", 43 | "name": "Program Course", 44 | "owner": "Administrator", 45 | "permissions": [], 46 | "restrict_to_domain": "", 47 | "sort_field": "modified", 48 | "sort_order": "DESC", 49 | "track_changes": 1 50 | } -------------------------------------------------------------------------------- /education/education/doctype/program_course/program_course.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class ProgramCourse(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_enrollment/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment/program_enrollment_dashboard.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | 4 | def get_data(): 5 | return { 6 | "fieldname": "program_enrollment", 7 | "reports": [ 8 | {"label": _("Report"), "items": ["Student and Guardian Contact Details"]} 9 | ], 10 | } 11 | -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment/test_program_enrollment.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe and Contributors 2 | # See license.txt 3 | 4 | 5 | import frappe 6 | from frappe.tests.utils import FrappeTestCase 7 | 8 | from education.education.test_utils import ( 9 | create_academic_year, 10 | create_academic_term, 11 | create_program, 12 | create_student, 13 | create_program_enrollment, 14 | create_student_group, 15 | ) 16 | 17 | 18 | class TestProgramEnrollment(FrappeTestCase): 19 | def setUp(self): 20 | create_academic_year() 21 | create_academic_term( 22 | term_name="Term 1", term_start_date="2023-04-01", term_end_date="2023-09-30" 23 | ) 24 | create_program("Class 1") 25 | 26 | def test_create_course_enrollments(self): 27 | student = create_student() 28 | create_program_enrollment(student_name=student.name, submit=1) 29 | 30 | def tearDown(self): 31 | frappe.db.rollback() 32 | -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_course/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_enrollment_course/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_course/program_enrollment_course.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class ProgramEnrollmentCourse(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_fee/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_enrollment_fee/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_fee/program_enrollment_fee.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class ProgramEnrollmentFee(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_tool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_enrollment_tool/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_tool/test_program_enrollment_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestProgramEnrollmentTool(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_tool_student/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_enrollment_tool_student/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_enrollment_tool_student/program_enrollment_tool_student.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class ProgramEnrollmentToolStudent(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/program_fee/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/program_fee/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/program_fee/program_fee.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class ProgramFee(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/question/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/question/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/question/question.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Question', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/question/question.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | import frappe 6 | from frappe import _ 7 | from frappe.model.document import Document 8 | 9 | 10 | class Question(Document): 11 | def validate(self): 12 | self.check_at_least_one_option() 13 | self.check_minimum_one_correct_answer() 14 | self.set_question_type() 15 | 16 | def check_at_least_one_option(self): 17 | if len(self.options) <= 1: 18 | frappe.throw(_("A question must have more than one options")) 19 | else: 20 | pass 21 | 22 | def check_minimum_one_correct_answer(self): 23 | correct_options = [option.is_correct for option in self.options] 24 | if bool(sum(correct_options)): 25 | pass 26 | else: 27 | frappe.throw(_("A qustion must have at least one correct options")) 28 | 29 | def set_question_type(self): 30 | correct_options = [option for option in self.options if option.is_correct] 31 | if len(correct_options) > 1: 32 | self.question_type = "Multiple Correct Answer" 33 | else: 34 | self.question_type = "Single Correct Answer" 35 | 36 | def get_answer(self): 37 | options = self.options 38 | answers = [item.name for item in options if item.is_correct == True] 39 | if len(answers) == 0: 40 | frappe.throw(_("No correct answer is set for {0}").format(self.name)) 41 | return None 42 | elif len(answers) == 1: 43 | return answers[0] 44 | else: 45 | return answers 46 | -------------------------------------------------------------------------------- /education/education/doctype/question/test_question.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestQuestion(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/quiz/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/quiz/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/quiz/test_quiz.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestQuiz(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_activity/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/quiz_activity/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/quiz_activity/quiz_activity.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Quiz Activity', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_activity/quiz_activity.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class QuizActivity(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_activity/test_quiz_activity.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestQuizActivity(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_question/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/quiz_question/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/quiz_question/quiz_question.json: -------------------------------------------------------------------------------- 1 | { 2 | "allow_rename": 1, 3 | "creation": "2018-10-17 06:13:00.098883", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "question_link", 9 | "question" 10 | ], 11 | "fields": [ 12 | { 13 | "fieldname": "question_link", 14 | "fieldtype": "Link", 15 | "in_list_view": 1, 16 | "label": "Question Link", 17 | "options": "Question", 18 | "reqd": 1 19 | }, 20 | { 21 | "fetch_from": "question_link.question", 22 | "fieldname": "question", 23 | "fieldtype": "Text Editor", 24 | "in_list_view": 1, 25 | "label": "Question", 26 | "read_only": 1 27 | } 28 | ], 29 | "istable": 1, 30 | "modified": "2020-09-24 12:24:02.312577", 31 | "modified_by": "Administrator", 32 | "module": "Education", 33 | "name": "Quiz Question", 34 | "owner": "Administrator", 35 | "permissions": [], 36 | "quick_entry": 1, 37 | "sort_field": "modified", 38 | "sort_order": "DESC", 39 | "track_changes": 1 40 | } 41 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_question/quiz_question.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class QuizQuestion(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_result/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/quiz_result/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/quiz_result/quiz_result.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Quiz Result', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_result/quiz_result.json: -------------------------------------------------------------------------------- 1 | { 2 | "creation": "2018-10-15 15:52:25.766374", 3 | "doctype": "DocType", 4 | "editable_grid": 1, 5 | "engine": "InnoDB", 6 | "field_order": [ 7 | "question", 8 | "selected_option", 9 | "quiz_result" 10 | ], 11 | "fields": [ 12 | { 13 | "fieldname": "question", 14 | "fieldtype": "Link", 15 | "in_list_view": 1, 16 | "label": "Question", 17 | "options": "Question", 18 | "read_only": 1, 19 | "reqd": 1, 20 | "set_only_once": 1 21 | }, 22 | { 23 | "fieldname": "selected_option", 24 | "fieldtype": "Data", 25 | "in_list_view": 1, 26 | "label": "Selected Option", 27 | "read_only": 1, 28 | "set_only_once": 1 29 | }, 30 | { 31 | "fieldname": "quiz_result", 32 | "fieldtype": "Select", 33 | "in_list_view": 1, 34 | "label": "Result", 35 | "options": "\nCorrect\nWrong", 36 | "read_only": 1, 37 | "reqd": 1, 38 | "set_only_once": 1 39 | } 40 | ], 41 | "istable": 1, 42 | "modified": "2019-06-03 12:52:32.267392", 43 | "modified_by": "Administrator", 44 | "module": "Education", 45 | "name": "Quiz Result", 46 | "owner": "Administrator", 47 | "permissions": [], 48 | "quick_entry": 1, 49 | "sort_field": "modified", 50 | "sort_order": "DESC", 51 | "track_changes": 1 52 | } -------------------------------------------------------------------------------- /education/education/doctype/quiz_result/quiz_result.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class QuizResult(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/quiz_result/test_quiz_result.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestQuizResult(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/room/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/room/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/room/room.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Room', {}) 2 | -------------------------------------------------------------------------------- /education/education/doctype/room/room.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class Room(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/room/room_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "fieldname": "room", 10 | "transactions": [ 11 | {"label": _("Course"), "items": ["Course Schedule"]}, 12 | {"label": _("Assessment"), "items": ["Assessment Plan"]}, 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /education/education/doctype/room/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "room_name": "_Test Room", 4 | "room_number": "1001", 5 | "seating_capacity": 100 6 | }, 7 | { 8 | "room_name": "_Test Room 1", 9 | "room_number": "1002", 10 | "seating_capacity": 100 11 | }, 12 | { 13 | "room_name": "_Test Room 2", 14 | "room_number": "1003", 15 | "seating_capacity": 100 16 | } 17 | ] -------------------------------------------------------------------------------- /education/education/doctype/room/test_room.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Room') 8 | 9 | 10 | class TestRoom(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/school_house/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/school_house/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/school_house/school_house.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('School House', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/school_house/school_house.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class SchoolHouse(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/school_house/test_school_house.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestSchoolHouse(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student/student.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student', { 5 | refresh: function (frm) { 6 | frm.set_query('user', function (doc) { 7 | return { 8 | filters: { 9 | ignore_user_type: 1, 10 | }, 11 | } 12 | }) 13 | 14 | if (!frm.is_new()) { 15 | frm.add_custom_button(__('Accounting Ledger'), function () { 16 | frappe.set_route('query-report', 'General Ledger', { 17 | party_type: 'Customer', 18 | party: frm.doc.customer, 19 | }) 20 | }) 21 | } 22 | 23 | frappe.db 24 | .get_single_value('Education Settings', 'user_creation_skip') 25 | .then((r) => { 26 | if (cint(r) !== 1) { 27 | frm.set_df_property('student_email_id', 'reqd', 1) 28 | } 29 | }) 30 | }, 31 | }) 32 | 33 | frappe.ui.form.on('Student Guardian', { 34 | guardians_add: function (frm) { 35 | frm.fields_dict['guardians'].grid.get_field('guardian').get_query = 36 | function (doc) { 37 | let guardian_list = [] 38 | if (!doc.__islocal) guardian_list.push(doc.guardian) 39 | $.each(doc.guardians, function (idx, val) { 40 | if (val.guardian) guardian_list.push(val.guardian) 41 | }) 42 | return { filters: [['Guardian', 'name', 'not in', guardian_list]] } 43 | } 44 | }, 45 | }) 46 | -------------------------------------------------------------------------------- /education/education/doctype/student/student_dashboard.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | 4 | def get_data(): 5 | return { 6 | "heatmap": True, 7 | "heatmap_message": _("This is based on the attendance of this Student"), 8 | "fieldname": "student", 9 | "non_standard_fieldnames": {"Bank Account": "party"}, 10 | "transactions": [ 11 | {"label": _("Fee"), "items": ["Sales Invoice", "Bank Account"]}, 12 | ], 13 | } 14 | -------------------------------------------------------------------------------- /education/education/doctype/student/student_list.js: -------------------------------------------------------------------------------- 1 | frappe.listview_settings['Student'] = { 2 | add_fields: ['image'], 3 | } 4 | -------------------------------------------------------------------------------- /education/education/doctype/student/test_student.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | import frappe 6 | 7 | from education.education.doctype.program.test_program import ( 8 | make_program_and_linked_courses, 9 | ) 10 | 11 | test_records = frappe.get_test_records("Student") 12 | from frappe.tests.utils import FrappeTestCase 13 | from education.education.test_utils import create_student 14 | 15 | 16 | class TestStudent(FrappeTestCase): 17 | def setUp(self): 18 | student = create_student() 19 | 20 | def test_create_student_user(self): 21 | self.assertTrue(bool(frappe.db.exists("User", "test@example.com"))) 22 | 23 | def test_create_customer_against_student(self): 24 | student = frappe.get_doc("Student", {"student_email_id": "test@example.com"}) 25 | self.assertTrue(bool(student.customer)) 26 | self.assertEqual(student.customer_group, "Student") 27 | 28 | def tearDown(self): 29 | frappe.db.rollback() 30 | -------------------------------------------------------------------------------- /education/education/doctype/student_admission/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_admission/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_admission/student_admission.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student Admission', { 5 | program: function (frm) { 6 | if (frm.doc.academic_year && frm.doc.program) { 7 | frm.doc.route = 8 | frappe.model.scrub(frm.doc.program) + 9 | '-' + 10 | frappe.model.scrub(frm.doc.academic_year) 11 | frm.refresh_field('route') 12 | } 13 | }, 14 | 15 | academic_year: function (frm) { 16 | frm.trigger('program') 17 | }, 18 | 19 | admission_end_date: function (frm) { 20 | if ( 21 | frm.doc.admission_end_date && 22 | frm.doc.admission_end_date <= frm.doc.admission_start_date 23 | ) { 24 | frm.set_value('admission_end_date', '') 25 | frappe.throw( 26 | __('Admission End Date should be greater than Admission Start Date.') 27 | ) 28 | } 29 | }, 30 | }) 31 | -------------------------------------------------------------------------------- /education/education/doctype/student_admission/templates/student_admission_row.html: -------------------------------------------------------------------------------- 1 |
2 | {% set today = frappe.utils.getdate(frappe.utils.nowdate()) %} 3 | 4 |
5 |
6 | {{ doc.title }} 17 |
18 |
19 | 20 | Academic Year 21 | 22 |
23 | {{ doc.academic_year }} 24 |
25 |
26 |
27 | 28 | Starts on 29 | 30 |
31 | {{ frappe.format_date(doc.admission_start_date) }} 32 |
33 |
34 |
35 | 36 | Ends on 37 | 38 |
39 | {{ frappe.format_date(doc.admission_end_date) }} 40 |
41 |
42 |
43 |
44 |
45 | -------------------------------------------------------------------------------- /education/education/doctype/student_admission/test_student_admission.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Admission') 8 | 9 | 10 | class TestStudentAdmission(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_admission_program/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_admission_program/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_admission_program/student_admission_program.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentAdmissionProgram(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_applicant/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_applicant/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_applicant/student_applicant_list.js: -------------------------------------------------------------------------------- 1 | frappe.listview_settings['Student Applicant'] = { 2 | add_fields: ['application_status', 'paid'], 3 | has_indicator_for_draft: 1, 4 | get_indicator: function (doc) { 5 | if (doc.paid) { 6 | return [__('Paid'), 'green', 'paid,=,Yes'] 7 | } else if (doc.application_status == 'Applied') { 8 | return [__('Applied'), 'orange', 'application_status,=,Applied'] 9 | } else if (doc.application_status == 'Approved') { 10 | return [__('Approved'), 'green', 'application_status,=,Approved'] 11 | } else if (doc.application_status == 'Rejected') { 12 | return [__('Rejected'), 'red', 'application_status,=,Rejected'] 13 | } else if (doc.application_status == 'Admitted') { 14 | return [__('Admitted'), 'blue', 'application_status,=,Admitted'] 15 | } 16 | }, 17 | } 18 | -------------------------------------------------------------------------------- /education/education/doctype/student_applicant/test_student_applicant.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Applicant') 8 | 9 | 10 | class TestStudentApplicant(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_attendance/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_attendance/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_attendance/student_attendance.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | cur_frm.add_fetch('course_schedule', 'schedule_date', 'date') 5 | cur_frm.add_fetch('course_schedule', 'student_group', 'student_group') 6 | -------------------------------------------------------------------------------- /education/education/doctype/student_attendance/student_attendance_dashboard.py: -------------------------------------------------------------------------------- 1 | from frappe import _ 2 | 3 | 4 | def get_data(): 5 | return { 6 | "reports": [ 7 | { 8 | "label": _("Reports"), 9 | "items": ["Student Monthly Attendance Sheet", "Student Batch-Wise Attendance"], 10 | } 11 | ] 12 | } 13 | -------------------------------------------------------------------------------- /education/education/doctype/student_attendance/test_student_attendance.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Attendance') 8 | 9 | 10 | class TestStudentAttendance(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_attendance_tool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_attendance_tool/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_attendance_tool/test_student_attendance_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestStudentAttendanceTool(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_batch_name/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_batch_name/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_batch_name/student_batch_name.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student Batch Name', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/student_batch_name/student_batch_name.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentBatchName(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_batch_name/test_records.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "batch_name": "_Batch 1" 4 | }, 5 | { 6 | "batch_name": "_Batch 2" 7 | } 8 | ] -------------------------------------------------------------------------------- /education/education/doctype/student_batch_name/test_student_batch_name.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Batch Name') 8 | 9 | 10 | class TestStudentBatchName(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_category/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_category/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_category/student_category.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student Category', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/student_category/student_category.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "allow_rename": 1, 4 | "autoname": "field:category", 5 | "creation": "2016-09-05 06:28:33.679415", 6 | "doctype": "DocType", 7 | "editable_grid": 1, 8 | "engine": "InnoDB", 9 | "field_order": [ 10 | "category" 11 | ], 12 | "fields": [ 13 | { 14 | "fieldname": "category", 15 | "fieldtype": "Data", 16 | "in_list_view": 1, 17 | "label": "Category", 18 | "reqd": 1, 19 | "unique": 1 20 | } 21 | ], 22 | "links": [ 23 | { 24 | "group": "Fee", 25 | "link_doctype": "Fee Structure", 26 | "link_fieldname": "student_category" 27 | }, 28 | { 29 | "group": "Fee", 30 | "link_doctype": "Fee Schedule", 31 | "link_fieldname": "student_category" 32 | } 33 | ], 34 | "modified": "2024-01-23 14:53:20.521116", 35 | "modified_by": "Administrator", 36 | "module": "Education", 37 | "name": "Student Category", 38 | "naming_rule": "By fieldname", 39 | "owner": "Administrator", 40 | "permissions": [ 41 | { 42 | "create": 1, 43 | "delete": 1, 44 | "email": 1, 45 | "export": 1, 46 | "print": 1, 47 | "read": 1, 48 | "report": 1, 49 | "role": "Academics User", 50 | "share": 1, 51 | "write": 1 52 | } 53 | ], 54 | "quick_entry": 1, 55 | "sort_field": "modified", 56 | "sort_order": "DESC", 57 | "states": [] 58 | } -------------------------------------------------------------------------------- /education/education/doctype/student_category/student_category.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentCategory(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_category/test_student_category.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Category') 8 | 9 | 10 | class TestStudentCategory(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_group/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_group/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_group/student_group_dashboard.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2020, Frappe Technologies Pvt. Ltd. and Contributors 2 | # License: GNU General Public License v3. See license.txt 3 | 4 | from frappe import _ 5 | 6 | 7 | def get_data(): 8 | return { 9 | "fieldname": "student_group", 10 | "transactions": [ 11 | {"label": _("Assessment"), "items": ["Assessment Plan", "Assessment Result"]}, 12 | {"label": _("Course"), "items": ["Course Schedule"]}, 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /education/education/doctype/student_group/test_student_group.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and Contributors 2 | # See license.txt 3 | 4 | 5 | import frappe 6 | 7 | import education.education 8 | from frappe.tests.utils import FrappeTestCase 9 | from education.education.test_utils import ( 10 | create_academic_year, 11 | create_academic_term, 12 | create_program, 13 | create_student, 14 | create_program_enrollment, 15 | create_student_group, 16 | ) 17 | 18 | 19 | class TestStudentGroup(FrappeTestCase): 20 | def setUp(self): 21 | create_academic_year() 22 | create_academic_term( 23 | term_name="Term 1", term_start_date="2023-04-01", term_end_date="2023-09-30" 24 | ) 25 | create_program("Class 1") 26 | student = create_student() 27 | create_program_enrollment(student_name=student.name, submit=1) 28 | create_student_group() 29 | 30 | def tearDown(self): 31 | frappe.db.rollback() 32 | 33 | def test_student_roll_no(self): 34 | student_group = frappe.get_doc("Student Group", "Test Student Group") 35 | self.assertEqual( 36 | max([d.group_roll_number for d in student_group.students]), 37 | len(student_group.students), 38 | ) 39 | -------------------------------------------------------------------------------- /education/education/doctype/student_group_creation_tool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_group_creation_tool/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_group_creation_tool/student_group_creation_tool.js: -------------------------------------------------------------------------------- 1 | frappe.ui.form.on('Student Group Creation Tool', 'refresh', function (frm) { 2 | frm.disable_save() 3 | frm.page.set_primary_action(__('Create Student Groups'), function () { 4 | frappe.call({ 5 | method: 'create_student_groups', 6 | doc: frm.doc, 7 | }) 8 | }) 9 | frappe.realtime.on('student_group_creation_progress', function (data) { 10 | if (data.progress) { 11 | frappe.hide_msgprint(true) 12 | frappe.show_progress( 13 | __('Creating student groups'), 14 | data.progress[0], 15 | data.progress[1] 16 | ) 17 | } 18 | }) 19 | }) 20 | 21 | frappe.ui.form.on('Student Group Creation Tool', 'get_courses', function (frm) { 22 | frm.set_value('courses', []) 23 | if (frm.doc.academic_year && frm.doc.program) { 24 | frappe.call({ 25 | method: 'get_courses', 26 | doc: frm.doc, 27 | callback: function (r) { 28 | if (r.message) { 29 | frm.set_value('courses', r.message) 30 | } 31 | }, 32 | }) 33 | } 34 | }) 35 | 36 | frappe.ui.form.on('Student Group Creation Tool', 'onload', function (frm) { 37 | cur_frm.set_query('academic_term', function () { 38 | return { 39 | filters: { 40 | academic_year: frm.doc.academic_year, 41 | }, 42 | } 43 | }) 44 | }) 45 | -------------------------------------------------------------------------------- /education/education/doctype/student_group_creation_tool/test_student_group_creation_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestStudentGroupCreationTool(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_group_creation_tool_course/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_group_creation_tool_course/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_group_creation_tool_course/student_group_creation_tool_course.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentGroupCreationToolCourse(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_group_instructor/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_group_instructor/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_group_instructor/student_group_instructor.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2017, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentGroupInstructor(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_group_student/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_group_student/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_group_student/student_group_student.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2015-09-11 15:14:58.501830", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "student", 9 | "student_name", 10 | "column_break_2", 11 | "group_roll_number", 12 | "active" 13 | ], 14 | "fields": [ 15 | { 16 | "fieldname": "student", 17 | "fieldtype": "Link", 18 | "in_list_view": 1, 19 | "label": "Student", 20 | "options": "Student", 21 | "reqd": 1 22 | }, 23 | { 24 | "fetch_from": "student.student_name", 25 | "fieldname": "student_name", 26 | "fieldtype": "Data", 27 | "in_list_view": 1, 28 | "label": "Student Name", 29 | "read_only": 1 30 | }, 31 | { 32 | "fieldname": "column_break_2", 33 | "fieldtype": "Column Break" 34 | }, 35 | { 36 | "fieldname": "group_roll_number", 37 | "fieldtype": "Int", 38 | "in_list_view": 1, 39 | "label": "Group Roll Number" 40 | }, 41 | { 42 | "default": "1", 43 | "fieldname": "active", 44 | "fieldtype": "Check", 45 | "in_list_view": 1, 46 | "label": "Active" 47 | } 48 | ], 49 | "istable": 1, 50 | "links": [], 51 | "modified": "2023-02-07 16:22:46.912057", 52 | "modified_by": "Administrator", 53 | "module": "Education", 54 | "name": "Student Group Student", 55 | "owner": "Administrator", 56 | "permissions": [], 57 | "sort_field": "modified", 58 | "sort_order": "DESC", 59 | "states": [] 60 | } -------------------------------------------------------------------------------- /education/education/doctype/student_group_student/student_group_student.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentGroupStudent(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_guardian/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_guardian/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_guardian/student_guardian.json: -------------------------------------------------------------------------------- 1 | { 2 | "actions": [], 3 | "creation": "2016-09-01 14:28:39.174471", 4 | "doctype": "DocType", 5 | "editable_grid": 1, 6 | "engine": "InnoDB", 7 | "field_order": [ 8 | "guardian", 9 | "guardian_name", 10 | "relation" 11 | ], 12 | "fields": [ 13 | { 14 | "fieldname": "guardian", 15 | "fieldtype": "Link", 16 | "in_list_view": 1, 17 | "label": "Guardian", 18 | "options": "Guardian", 19 | "reqd": 1 20 | }, 21 | { 22 | "fetch_from": "guardian.guardian_name", 23 | "fieldname": "guardian_name", 24 | "fieldtype": "Data", 25 | "in_global_search": 1, 26 | "in_list_view": 1, 27 | "label": "Guardian Name", 28 | "read_only": 1, 29 | "reqd": 1 30 | }, 31 | { 32 | "fieldname": "relation", 33 | "fieldtype": "Select", 34 | "in_list_view": 1, 35 | "label": "Relation", 36 | "options": "\nMother\nFather\nOthers" 37 | } 38 | ], 39 | "istable": 1, 40 | "links": [], 41 | "modified": "2023-02-14 17:05:21.300964", 42 | "modified_by": "Administrator", 43 | "module": "Education", 44 | "name": "Student Guardian", 45 | "owner": "Administrator", 46 | "permissions": [], 47 | "quick_entry": 1, 48 | "sort_field": "modified", 49 | "sort_order": "DESC", 50 | "states": [] 51 | } -------------------------------------------------------------------------------- /education/education/doctype/student_guardian/student_guardian.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentGuardian(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_language/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_language/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_language/student_language.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student Language', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/student_language/student_language.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentLanguage(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_language/test_student_language.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Language') 8 | 9 | 10 | class TestStudentLanguage(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_leave_application/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_leave_application/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_leave_application/student_leave_application.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student Leave Application', { 5 | student: function (frm) { 6 | frappe.call({ 7 | method: 8 | 'education.education.doctype.student_leave_application.student_leave_application.get_student_groups', 9 | args: { 10 | student: frm.doc.student, 11 | }, 12 | callback: function (r) { 13 | if (r.message) { 14 | frm.set_query('student_group', () => { 15 | return { 16 | filters: { 17 | name: ['in', r.message], 18 | }, 19 | } 20 | }) 21 | frm.set_query('course_schedule', () => { 22 | return { 23 | filters: { 24 | student_group: ['in', r.message], 25 | }, 26 | } 27 | }) 28 | } 29 | }, 30 | }) 31 | }, 32 | }) 33 | -------------------------------------------------------------------------------- /education/education/doctype/student_leave_application/student_leave_application_dashboard.py: -------------------------------------------------------------------------------- 1 | def get_data(): 2 | return { 3 | "fieldname": "leave_application", 4 | "transactions": [{"items": ["Student Attendance"]}], 5 | } 6 | -------------------------------------------------------------------------------- /education/education/doctype/student_log/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_log/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_log/student_log.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Student Log', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/student_log/student_log.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentLog(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_log/test_student_log.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | # test_records = frappe.get_test_records('Student Log') 8 | 9 | 10 | class TestStudentLog(FrappeTestCase): 11 | pass 12 | -------------------------------------------------------------------------------- /education/education/doctype/student_report_generation_tool/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_report_generation_tool/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_report_generation_tool/test_student_report_generation_tool.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestStudentReportGenerationTool(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_sibling/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_sibling/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_sibling/student_sibling.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentSibling(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/student_siblings/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/student_siblings/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/student_siblings/student_siblings.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class StudentSiblings(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/topic/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/topic/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/topic_content/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/doctype/topic_content/__init__.py -------------------------------------------------------------------------------- /education/education/doctype/topic_content/test_topic_content.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and Contributors 2 | # See license.txt 3 | 4 | 5 | from frappe.tests.utils import FrappeTestCase 6 | 7 | 8 | class TestTopicContent(FrappeTestCase): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/doctype/topic_content/topic_content.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.ui.form.on('Topic Content', { 5 | refresh: function (frm) {}, 6 | }) 7 | -------------------------------------------------------------------------------- /education/education/doctype/topic_content/topic_content.json: -------------------------------------------------------------------------------- 1 | { 2 | "creation": "2018-12-12 11:42:57.987434", 3 | "doctype": "DocType", 4 | "editable_grid": 1, 5 | "engine": "InnoDB", 6 | "field_order": [ 7 | "content_type", 8 | "column_break_2", 9 | "content" 10 | ], 11 | "fields": [ 12 | { 13 | "fieldname": "content_type", 14 | "fieldtype": "Select", 15 | "in_list_view": 1, 16 | "label": "Content Type", 17 | "options": "\nArticle\nVideo\nQuiz", 18 | "reqd": 1 19 | }, 20 | { 21 | "fieldname": "column_break_2", 22 | "fieldtype": "Column Break" 23 | }, 24 | { 25 | "fieldname": "content", 26 | "fieldtype": "Dynamic Link", 27 | "in_list_view": 1, 28 | "label": "Content", 29 | "options": "content_type", 30 | "reqd": 1 31 | } 32 | ], 33 | "istable": 1, 34 | "modified": "2019-05-14 11:12:49.153771", 35 | "modified_by": "Administrator", 36 | "module": "Education", 37 | "name": "Topic Content", 38 | "owner": "Administrator", 39 | "permissions": [], 40 | "quick_entry": 1, 41 | "sort_field": "modified", 42 | "sort_order": "DESC", 43 | "track_changes": 1 44 | } -------------------------------------------------------------------------------- /education/education/doctype/topic_content/topic_content.py: -------------------------------------------------------------------------------- 1 | # Copyright (c) 2018, Frappe Technologies Pvt. Ltd. and contributors 2 | # For license information, please see license.txt 3 | 4 | 5 | from frappe.model.document import Document 6 | 7 | 8 | class TopicContent(Document): 9 | pass 10 | -------------------------------------------------------------------------------- /education/education/report/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/__init__.py -------------------------------------------------------------------------------- /education/education/report/absent_student_report/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/absent_student_report/__init__.py -------------------------------------------------------------------------------- /education/education/report/absent_student_report/absent_student_report.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2015, Frappe Technologies Pvt. Ltd. and Contributors 2 | // License: GNU General Public License v3. See license.txt 3 | 4 | frappe.query_reports['Absent Student Report'] = { 5 | filters: [ 6 | { 7 | fieldname: 'date', 8 | label: __('Date'), 9 | fieldtype: 'Date', 10 | default: frappe.datetime.get_today(), 11 | reqd: 1, 12 | }, 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /education/education/report/absent_student_report/absent_student_report.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2013-05-13 14:04:03", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 3, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:16:40.251116", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Absent Student Report", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "ref_doctype": "Student Attendance", 17 | "report_name": "Absent Student Report", 18 | "report_type": "Script Report", 19 | "roles": [ 20 | { 21 | "role": "Academics User" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /education/education/report/assessment_plan_status/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/assessment_plan_status/__init__.py -------------------------------------------------------------------------------- /education/education/report/assessment_plan_status/assessment_plan_status.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | /* eslint-disable */ 4 | 5 | frappe.query_reports['Assessment Plan Status'] = { 6 | filters: [ 7 | { 8 | fieldname: 'assessment_group', 9 | label: __('Assessment Group'), 10 | fieldtype: 'Link', 11 | options: 'Assessment Group', 12 | get_query: function () { 13 | return { 14 | filters: { 15 | is_group: 0, 16 | }, 17 | } 18 | }, 19 | }, 20 | { 21 | fieldname: 'schedule_date', 22 | label: __('Scheduled Upto'), 23 | fieldtype: 'Date', 24 | options: '', 25 | }, 26 | ], 27 | } 28 | -------------------------------------------------------------------------------- /education/education/report/assessment_plan_status/assessment_plan_status.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2017-11-09 15:07:30.404428", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 0, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:16:02.027410", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Assessment Plan Status", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "ref_doctype": "Assessment Plan", 17 | "report_name": "Assessment Plan Status", 18 | "report_type": "Script Report", 19 | "roles": [ 20 | { 21 | "role": "Academics User" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /education/education/report/course_wise_assessment_report/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/course_wise_assessment_report/__init__.py -------------------------------------------------------------------------------- /education/education/report/course_wise_assessment_report/course_wise_assessment_report.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.query_reports['Course wise Assessment Report'] = { 5 | filters: [ 6 | { 7 | fieldname: 'academic_year', 8 | label: __('Academic Year'), 9 | fieldtype: 'Link', 10 | options: 'Academic Year', 11 | reqd: 1, 12 | }, 13 | { 14 | fieldname: 'academic_term', 15 | label: __('Academic Term'), 16 | fieldtype: 'Link', 17 | options: 'Academic Term', 18 | }, 19 | { 20 | fieldname: 'course', 21 | label: __('Course'), 22 | fieldtype: 'Link', 23 | options: 'Course', 24 | reqd: 1, 25 | }, 26 | { 27 | fieldname: 'student_group', 28 | label: __('Student Group'), 29 | fieldtype: 'Link', 30 | options: 'Student Group', 31 | }, 32 | { 33 | fieldname: 'assessment_group', 34 | label: __('Assessment Group'), 35 | fieldtype: 'Link', 36 | options: 'Assessment Group', 37 | reqd: 1, 38 | }, 39 | ], 40 | } 41 | -------------------------------------------------------------------------------- /education/education/report/course_wise_assessment_report/course_wise_assessment_report.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2017-05-05 14:46:13.776133", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 0, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:15:15.477530", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Course wise Assessment Report", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "query": "", 17 | "ref_doctype": "Assessment Result", 18 | "report_name": "Course Wise Assessment Report", 19 | "report_type": "Script Report", 20 | "roles": [ 21 | { 22 | "role": "Instructor" 23 | }, 24 | { 25 | "role": "Education Manager" 26 | } 27 | ] 28 | } -------------------------------------------------------------------------------- /education/education/report/final_assessment_grades/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/final_assessment_grades/__init__.py -------------------------------------------------------------------------------- /education/education/report/final_assessment_grades/final_assessment_grades.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | /* eslint-disable */ 4 | 5 | frappe.query_reports['Final Assessment Grades'] = { 6 | filters: [ 7 | { 8 | fieldname: 'academic_year', 9 | label: __('Academic Year'), 10 | fieldtype: 'Link', 11 | options: 'Academic Year', 12 | reqd: 1, 13 | }, 14 | { 15 | fieldname: 'student_group', 16 | label: __('Student Group'), 17 | fieldtype: 'Link', 18 | options: 'Student Group', 19 | reqd: 1, 20 | get_query: function () { 21 | return { 22 | filters: { 23 | group_based_on: 'Batch', 24 | academic_year: 25 | frappe.query_report.get_filter_value('academic_year'), 26 | }, 27 | } 28 | }, 29 | }, 30 | { 31 | fieldname: 'assessment_group', 32 | label: __('Assessment Group'), 33 | fieldtype: 'Link', 34 | options: 'Assessment Group', 35 | reqd: 1, 36 | }, 37 | ], 38 | } 39 | -------------------------------------------------------------------------------- /education/education/report/final_assessment_grades/final_assessment_grades.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2018-01-22 17:04:43.412054", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 0, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:13:35.373756", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Final Assessment Grades", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "ref_doctype": "Assessment Result", 17 | "report_name": "Final Assessment Grades", 18 | "report_type": "Script Report", 19 | "roles": [ 20 | { 21 | "role": "Instructor" 22 | }, 23 | { 24 | "role": "Education Manager" 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /education/education/report/program_wise_fee_collection/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/program_wise_fee_collection/__init__.py -------------------------------------------------------------------------------- /education/education/report/program_wise_fee_collection/program_wise_fee_collection.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | /* eslint-disable */ 4 | 5 | frappe.query_reports['Program wise Fee Collection'] = { 6 | filters: [ 7 | { 8 | fieldname: 'from_date', 9 | label: __('From Date'), 10 | fieldtype: 'Date', 11 | default: frappe.datetime.add_months(frappe.datetime.get_today(), -1), 12 | reqd: 1, 13 | }, 14 | { 15 | fieldname: 'to_date', 16 | label: __('To Date'), 17 | fieldtype: 'Date', 18 | default: frappe.datetime.get_today(), 19 | reqd: 1, 20 | }, 21 | ], 22 | } 23 | -------------------------------------------------------------------------------- /education/education/report/program_wise_fee_collection/program_wise_fee_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 1, 3 | "creation": "2020-07-27 16:05:33.263539", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 0, 9 | "is_standard": "Yes", 10 | "json": "{}", 11 | "modified": "2020-08-05 14:14:12.410515", 12 | "modified_by": "Administrator", 13 | "module": "Education", 14 | "name": "Program wise Fee Collection", 15 | "owner": "Administrator", 16 | "prepared_report": 0, 17 | "query": "SELECT \n FeesCollected.program AS \"Program:Link/Program:200\",\n FeesCollected.paid_amount AS \"Fees Collected:Currency:150\",\n FeesCollected.outstanding_amount AS \"Outstanding Amount:Currency:150\",\n FeesCollected.grand_total \"Grand Total:Currency:150\"\nFROM (\n SELECT \n sum(grand_total) - sum(outstanding_amount) AS paid_amount, program,\n sum(outstanding_amount) AS outstanding_amount,\n sum(grand_total) AS grand_total\n FROM `tabFees`\n WHERE docstatus = 1\n GROUP BY program\n) AS FeesCollected\nORDER BY FeesCollected.paid_amount DESC", 18 | "ref_doctype": "Fees", 19 | "report_name": "Program wise Fee Collection", 20 | "report_type": "Script Report", 21 | "roles": [ 22 | { 23 | "role": "Academics User" 24 | }, 25 | { 26 | "role": "Accounts User" 27 | }, 28 | { 29 | "role": "Accounts Manager" 30 | } 31 | ] 32 | } -------------------------------------------------------------------------------- /education/education/report/student_and_guardian_contact_details/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/student_and_guardian_contact_details/__init__.py -------------------------------------------------------------------------------- /education/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.query_reports['Student and Guardian Contact Details'] = { 5 | filters: [ 6 | { 7 | fieldname: 'academic_year', 8 | label: __('Academic Year'), 9 | fieldtype: 'Link', 10 | options: 'Academic Year', 11 | reqd: 1, 12 | }, 13 | { 14 | fieldname: 'program', 15 | label: __('Program'), 16 | fieldtype: 'Link', 17 | options: 'Program', 18 | reqd: 1, 19 | }, 20 | { 21 | fieldname: 'student_batch_name', 22 | label: __('Batch Name'), 23 | fieldtype: 'Link', 24 | options: 'Student Batch Name', 25 | reqd: 1, 26 | }, 27 | ], 28 | } 29 | -------------------------------------------------------------------------------- /education/education/report/student_and_guardian_contact_details/student_and_guardian_contact_details.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2017-03-27 17:47:16.831433", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 0, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:16:50.639488", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Student and Guardian Contact Details", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "ref_doctype": "Program Enrollment", 17 | "report_name": "Student and Guardian Contact Details", 18 | "report_type": "Script Report", 19 | "roles": [ 20 | { 21 | "role": "Instructor" 22 | }, 23 | { 24 | "role": "Academics User" 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /education/education/report/student_batch_wise_attendance/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/student_batch_wise_attendance/__init__.py -------------------------------------------------------------------------------- /education/education/report/student_batch_wise_attendance/student_batch_wise_attendance.js: -------------------------------------------------------------------------------- 1 | // Copyright (c) 2016, Frappe Technologies Pvt. Ltd. and contributors 2 | // For license information, please see license.txt 3 | 4 | frappe.query_reports['Student Batch-Wise Attendance'] = { 5 | filters: [ 6 | { 7 | fieldname: 'date', 8 | label: __('Date'), 9 | fieldtype: 'Date', 10 | default: frappe.datetime.get_today(), 11 | reqd: 1, 12 | }, 13 | ], 14 | } 15 | -------------------------------------------------------------------------------- /education/education/report/student_batch_wise_attendance/student_batch_wise_attendance.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2016-11-28 22:07:03.859124", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 2, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:16:59.823709", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Student Batch-Wise Attendance", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "ref_doctype": "Student Attendance", 17 | "report_name": "Student Batch-Wise Attendance", 18 | "report_type": "Script Report", 19 | "roles": [ 20 | { 21 | "role": "Academics User" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /education/education/report/student_fee_collection/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/student_fee_collection/__init__.py -------------------------------------------------------------------------------- /education/education/report/student_fee_collection/student_fee_collection.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 1, 3 | "columns": [], 4 | "creation": "2016-06-22 02:58:41.024538", 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "filters": [], 9 | "idx": 4, 10 | "is_standard": "Yes", 11 | "letterhead": null, 12 | "modified": "2024-05-27 10:14:40.352247", 13 | "modified_by": "Administrator", 14 | "module": "Education", 15 | "name": "Student Fee Collection", 16 | "owner": "Administrator", 17 | "prepared_report": 0, 18 | "query": "SELECT\n student as \"Student:Link/Student:200\",\n student.student_name as \"Student Name:Data:150\",\n sum(grand_total) - sum(outstanding_amount) as \"Paid Amount:Currency:150\",\n sum(outstanding_amount) as \"Outstanding Amount:Currency:150\",\n sum(grand_total) as \"Grand Total:Currency:150\"\nFROM\n `tabSales Invoice`\nJOIN\n `tabStudent` as student\nON\n student.name = `tabSales Invoice`.student\nWHERE\n `tabSales Invoice`.docstatus=1\nAND\n `tabSales Invoice`.student IS NOT NULL\nGROUP BY\n `tabSales Invoice`.student", 19 | "ref_doctype": "Fees", 20 | "report_name": "Student Fee Collection", 21 | "report_type": "Query Report", 22 | "roles": [ 23 | { 24 | "role": "Academics User" 25 | } 26 | ] 27 | } -------------------------------------------------------------------------------- /education/education/report/student_monthly_attendance_sheet/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/report/student_monthly_attendance_sheet/__init__.py -------------------------------------------------------------------------------- /education/education/report/student_monthly_attendance_sheet/student_monthly_attendance_sheet.json: -------------------------------------------------------------------------------- 1 | { 2 | "add_total_row": 0, 3 | "creation": "2013-05-13 14:04:03", 4 | "disable_prepared_report": 0, 5 | "disabled": 0, 6 | "docstatus": 0, 7 | "doctype": "Report", 8 | "idx": 3, 9 | "is_standard": "Yes", 10 | "modified": "2020-06-24 17:16:13.307053", 11 | "modified_by": "Administrator", 12 | "module": "Education", 13 | "name": "Student Monthly Attendance Sheet", 14 | "owner": "Administrator", 15 | "prepared_report": 0, 16 | "ref_doctype": "Student Attendance", 17 | "report_name": "Student Monthly Attendance Sheet", 18 | "report_type": "Script Report", 19 | "roles": [ 20 | { 21 | "role": "Academics User" 22 | } 23 | ] 24 | } -------------------------------------------------------------------------------- /education/education/web_form/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/web_form/__init__.py -------------------------------------------------------------------------------- /education/education/web_form/student_applicant/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/education/web_form/student_applicant/__init__.py -------------------------------------------------------------------------------- /education/education/web_form/student_applicant/student_applicant.js: -------------------------------------------------------------------------------- 1 | frappe.ready(function () { 2 | // bind events here 3 | }) 4 | -------------------------------------------------------------------------------- /education/education/web_form/student_applicant/student_applicant.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def get_context(context): 5 | # do your magic here 6 | pass 7 | -------------------------------------------------------------------------------- /education/modules.txt: -------------------------------------------------------------------------------- 1 | Education -------------------------------------------------------------------------------- /education/patches.txt: -------------------------------------------------------------------------------- 1 | [pre_model_sync] 2 | education.patches.v14_0.create_student_party_type 3 | 4 | [post_model_sync] 5 | education.patches.v14_0.create_parent_assessment_group #01-01-2022 6 | education.patches.v14_0.lms_deprecation_message #22-12-2022 7 | education.patches.v14_0.student_name 8 | education.patches.v14_0.delete_lms_user_role 9 | education.patches.v15_0.fees_student_email 10 | education.patches.v15_0.student_role_desk_access 11 | education.patches.v15_0.sales_invoice_student_field 12 | education.patches.v15_0.create_parent_assessment_group 13 | education.patches.v15_0.student_role_permission_sales_invoice 14 | education.patches.v15_0.sales_order_student_field 15 | education.patches.v15_0.fee_schedule_status_update #28-03-2024 16 | education.patches.v15_0.create_fee_component_item_group 17 | education.patches.v15_0.create_student_customer_group 18 | education.patches.v15_0.create_custom_permissions -------------------------------------------------------------------------------- /education/patches/v14_0/create_parent_assessment_group.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | from education.install import create_parent_assessment_group 4 | 5 | 6 | def execute(): 7 | create_parent_assessment_group() 8 | 9 | if frappe.db.exists("Assessment Group", "undefined"): 10 | frappe.delete_doc("Assessment Group", "undefined") 11 | -------------------------------------------------------------------------------- /education/patches/v14_0/create_student_party_type.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | if not frappe.db.exists("Party Type", "Student"): 6 | doc = frappe.get_doc( 7 | {"doctype": "Party Type", "party_type": "Student", "account_type": "Receivable"} 8 | ) 9 | doc.insert() 10 | -------------------------------------------------------------------------------- /education/patches/v14_0/delete_lms_user_role.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | if frappe.db.exists("Role", "LMS User"): 6 | frappe.db.delete("Role", "LMS User") 7 | -------------------------------------------------------------------------------- /education/patches/v14_0/lms_deprecation_message.py: -------------------------------------------------------------------------------- 1 | import click 2 | import frappe 3 | 4 | 5 | def execute(): 6 | 7 | click.secho( 8 | "LMS Module has been removed from the Education App. " 9 | "There is a new app for it called the Frappe LMS App. " 10 | "You can install the app from GitHub or Frappe Cloud Marketplace.\n" 11 | "https://github.com/frappe/lms\n" 12 | "https://frappecloud.com/marketplace/apps/lms", 13 | fg="yellow", 14 | ) 15 | -------------------------------------------------------------------------------- /education/patches/v14_0/student_name.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | students = frappe.get_all( 6 | "Student", fields=["name", "first_name", "middle_name", "last_name"] 7 | ) 8 | for student in students: 9 | student_name = " ".join( 10 | filter(None, [student.first_name, student.middle_name, student.last_name]) 11 | ) 12 | frappe.db.set_value("Student", student.name, "student_name", student_name) 13 | -------------------------------------------------------------------------------- /education/patches/v15_0/create_custom_permissions.py: -------------------------------------------------------------------------------- 1 | from education.install import create_permissions, get_permissions 2 | 3 | 4 | def execute(): 5 | create_permissions(get_permissions()) 6 | -------------------------------------------------------------------------------- /education/patches/v15_0/create_fee_component_item_group.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | if not frappe.db.exists("Item Group", "Fee Component"): 6 | frappe.get_doc( 7 | { 8 | "doctype": "Item Group", 9 | "item_group_name": "Fee Component", 10 | "parent_item_group": "All Item Groups", 11 | "is_group": 0, 12 | } 13 | ).insert() 14 | -------------------------------------------------------------------------------- /education/patches/v15_0/create_parent_assessment_group.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from education.install import create_parent_assessment_group 3 | 4 | 5 | def execute(): 6 | create_parent_assessment_group() 7 | -------------------------------------------------------------------------------- /education/patches/v15_0/create_student_customer_group.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | if not frappe.db.exists("Customer Group", "Student"): 6 | customer_group = frappe.get_doc( 7 | { 8 | "doctype": "Customer Group", 9 | "customer_group_name": "Student", 10 | "parent_customer_group": "All Customer Groups", 11 | } 12 | ).insert() 13 | -------------------------------------------------------------------------------- /education/patches/v15_0/fee_schedule_status_update.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | status_map = { 6 | "Successful": "Invoice Created", 7 | "In Process": "In Process", 8 | "Failed": "Fee Creation Failed", 9 | } 10 | fee_schedules = frappe.get_all( 11 | "Fee Schedule", filters={"docstatus": 1}, fields=["name", "fee_creation_status"] 12 | ) 13 | for fee_schedule in fee_schedules: 14 | frappe.db.set_value( 15 | "Fee Schedule", 16 | fee_schedule.name, 17 | "status", 18 | status_map.get(fee_schedule.fee_creation_status, "Invoice Pending"), 19 | update_modified=False, 20 | ) 21 | -------------------------------------------------------------------------------- /education/patches/v15_0/fees_student_email.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | student_emails = frappe.db.get_all("Fees", fields=["name", "student_email"]) 6 | for email in student_emails: 7 | frappe.db.set_value("Fees", email.name, "contact_email", email.student_email) 8 | -------------------------------------------------------------------------------- /education/patches/v15_0/sales_invoice_student_field.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.custom.doctype.custom_field.custom_field import create_custom_fields 3 | from education.install import get_custom_fields 4 | 5 | 6 | def execute(): 7 | create_custom_fields(get_custom_fields()) 8 | -------------------------------------------------------------------------------- /education/patches/v15_0/sales_order_student_field.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.custom.doctype.custom_field.custom_field import create_custom_fields 3 | from education.install import get_custom_fields 4 | 5 | 6 | def execute(): 7 | sales_order_fields = get_custom_fields()["Sales Order"] 8 | sales_order_custom_fields = {"Sales Order": sales_order_fields} 9 | create_custom_fields(sales_order_custom_fields) 10 | -------------------------------------------------------------------------------- /education/patches/v15_0/student_role_desk_access.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def execute(): 5 | if frappe.db.exists("Role", "Student"): 6 | frappe.db.set_value("Role", "Student", "desk_access", 0) 7 | frappe.db.commit() 8 | -------------------------------------------------------------------------------- /education/patches/v15_0/student_role_permission_sales_invoice.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | from frappe.permissions import add_permission, update_permission_property 3 | 4 | 5 | def execute(): 6 | 7 | add_permission("Sales Invoice", "Student", 0) 8 | 9 | doctype = "Sales Invoice" 10 | role = "Student" 11 | permlevel = 0 12 | ptype = ["read", "write", "print"] 13 | 14 | for p in ptype: 15 | # update permissions 16 | update_permission_property(doctype, role, permlevel, p, 1) 17 | 18 | frappe.db.commit() 19 | -------------------------------------------------------------------------------- /education/public/.gitkeep: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/.gitkeep -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Black.05e55dd7.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Black.05e55dd7.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Black.9c79713b.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Black.9c79713b.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Black.bc2198e0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Black.bc2198e0.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-BlackItalic.1cb529a7.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-BlackItalic.1cb529a7.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-BlackItalic.4ff7db4a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-BlackItalic.4ff7db4a.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-BlackItalic.7ecbf9fa.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-BlackItalic.7ecbf9fa.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Bold.1dc41a58.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Bold.1dc41a58.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Bold.2b828bef.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Bold.2b828bef.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Bold.2efd8e3c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Bold.2efd8e3c.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-BoldItalic.8bc8e0ff.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-BoldItalic.8bc8e0ff.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-BoldItalic.dc0d4194.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-BoldItalic.dc0d4194.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-BoldItalic.f528d863.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-BoldItalic.f528d863.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayBlack.b1d4e33d.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayBlack.b1d4e33d.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayBlackItalic.d561e8dd.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayBlackItalic.d561e8dd.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayBold.d9bf35ac.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayBold.d9bf35ac.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayBoldItalic.fef00c57.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayBoldItalic.fef00c57.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayExtraBold.b7cc680a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayExtraBold.b7cc680a.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayExtraBoldItalic.e5a5984a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayExtraBoldItalic.e5a5984a.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayExtraLight.32095132.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayExtraLight.32095132.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayExtraLightItalic.8eeb78f4.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayExtraLightItalic.8eeb78f4.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayItalic.938db435.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayItalic.938db435.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayLight.e40a858d.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayLight.e40a858d.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayLightItalic.151e9a11.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayLightItalic.151e9a11.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayMedium.12a4a358.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayMedium.12a4a358.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayMediumItalic.8968b5ab.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayMediumItalic.8968b5ab.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplaySemiBold.856fcb49.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplaySemiBold.856fcb49.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplaySemiBoldItalic.5e57e1d2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplaySemiBoldItalic.5e57e1d2.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayThin.b64c173b.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayThin.b64c173b.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-DisplayThinItalic.b70f1c61.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-DisplayThinItalic.b70f1c61.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraBold.585b4ce1.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraBold.585b4ce1.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraBold.74e72c6b.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraBold.74e72c6b.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraBold.8a72efb6.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraBold.8a72efb6.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraBoldItalic.2abc7ab1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraBoldItalic.2abc7ab1.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraBoldItalic.38e71f7c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraBoldItalic.38e71f7c.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraBoldItalic.b87f7d97.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraBoldItalic.b87f7d97.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraLight.1c06ef44.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraLight.1c06ef44.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraLight.25a4db7c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraLight.25a4db7c.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraLight.4c337585.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraLight.4c337585.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraLightItalic.0e5667b1.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraLightItalic.0e5667b1.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraLightItalic.7b39e865.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraLightItalic.7b39e865.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ExtraLightItalic.f0df46d0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ExtraLightItalic.f0df46d0.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Italic.950174d1.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Italic.950174d1.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Italic.b0b21adf.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Italic.b0b21adf.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Italic.dd31ea31.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Italic.dd31ea31.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Italic.var.d9f448e3.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Italic.var.d9f448e3.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Light.211445a8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Light.211445a8.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Light.319f53ba.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Light.319f53ba.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Light.87ed65f8.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Light.87ed65f8.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-LightItalic.289a60bc.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-LightItalic.289a60bc.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-LightItalic.5b94e337.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-LightItalic.5b94e337.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-LightItalic.9ea2db78.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-LightItalic.9ea2db78.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Medium.24fb6e39.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Medium.24fb6e39.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Medium.a4e1e7e6.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Medium.a4e1e7e6.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Medium.f500bbb9.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Medium.f500bbb9.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-MediumItalic.a2db9bea.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-MediumItalic.a2db9bea.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-MediumItalic.d06751dd.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-MediumItalic.d06751dd.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-MediumItalic.d4a7f5d9.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-MediumItalic.d4a7f5d9.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Regular.b825f1bc.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Regular.b825f1bc.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Regular.c342b1b7.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Regular.c342b1b7.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Regular.edd1deaf.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Regular.edd1deaf.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-SemiBold.3041a990.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-SemiBold.3041a990.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-SemiBold.51419407.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-SemiBold.51419407.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-SemiBold.af44b8a2.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-SemiBold.af44b8a2.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-SemiBoldItalic.5ce565c8.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-SemiBoldItalic.5ce565c8.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-SemiBoldItalic.a4f92da5.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-SemiBoldItalic.a4f92da5.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-SemiBoldItalic.daa7095c.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-SemiBoldItalic.daa7095c.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Thin.2198e9fb.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Thin.2198e9fb.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Thin.914c3fab.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Thin.914c3fab.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-Thin.918c5cbe.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-Thin.918c5cbe.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ThinItalic.382fab25.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ThinItalic.382fab25.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ThinItalic.a3279f0a.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ThinItalic.a3279f0a.woff2 -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter-ThinItalic.f53f21de.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter-ThinItalic.f53f21de.woff -------------------------------------------------------------------------------- /education/public/frontend/assets/Inter.var.d30c3bd0.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/assets/Inter.var.d30c3bd0.woff2 -------------------------------------------------------------------------------- /education/public/frontend/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/public/frontend/favicon.png -------------------------------------------------------------------------------- /education/public/frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Frappe Education 8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 |
16 |
17 | 18 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /education/public/js/education.bundle.js: -------------------------------------------------------------------------------- 1 | import './assessment_result_tool.html' 2 | -------------------------------------------------------------------------------- /education/public/node_modules: -------------------------------------------------------------------------------- 1 | /Users/ritviksardana/version-15/apps/education/node_modules -------------------------------------------------------------------------------- /education/templates/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/templates/__init__.py -------------------------------------------------------------------------------- /education/templates/generators/student_admission.html: -------------------------------------------------------------------------------- 1 | 2 | {% extends "templates/web.html" %} 3 | 4 | {% block breadcrumbs %} 5 | {% include "templates/includes/breadcrumbs.html" %} 6 | {% endblock %} 7 | 8 | {% block header %} 9 | 10 |

{{ title }}

11 | {% endblock %} 12 | 13 | {% block page_content %} 14 | 15 | {%- if introduction -%} 16 |
{{ introduction }}
17 | {% endif %} 18 | 19 | {%- if doc.enable_admission_application -%} 20 |

21 | 23 | {{ _("Apply Now") }} 24 |

25 | {% endif %} 26 | 27 | {% endblock %} 28 | -------------------------------------------------------------------------------- /education/templates/includes/assessment/assessment_row.html: -------------------------------------------------------------------------------- 1 |
2 |
3 |
4 | {{ doc.course }} 5 |
6 |
7 | {{ doc.room }} 8 |
9 |
10 | {{doc.schedule_date }} 11 |
12 |
13 | {{ doc.from_time }} 14 |
15 |
16 | {{ doc.to_time }} 17 |
18 |
19 |
20 | -------------------------------------------------------------------------------- /education/templates/includes/course/course_row.html: -------------------------------------------------------------------------------- 1 |
2 | 3 |
4 |
5 | {{ doc.course }} 6 |
7 |
8 | {{ doc.name }} 9 |
10 |
11 | {{doc.academic_term }} 12 |
13 |
14 | {{ doc.academic_year }} 15 |
16 |
17 |
18 |
19 | -------------------------------------------------------------------------------- /education/templates/includes/course/macros.html: -------------------------------------------------------------------------------- 1 | {% macro back_link(doc) %}&back-to=/courses?course={{ doc.name }}&back-to-title={{ doc.course_name }}{% endmacro %} 2 | -------------------------------------------------------------------------------- /education/templates/pages/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/templates/pages/__init__.py -------------------------------------------------------------------------------- /education/www/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/www/__init__.py -------------------------------------------------------------------------------- /education/www/__pycache__/__init__.py: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/education/www/__pycache__/__init__.py -------------------------------------------------------------------------------- /education/www/student_portal.py: -------------------------------------------------------------------------------- 1 | import frappe 2 | 3 | 4 | def get_context(context): 5 | abbr = frappe.db.get_single_value( 6 | "Education Settings", "school_college_name_abbreviation" 7 | ) 8 | logo = frappe.db.get_single_value("Education Settings", "school_college_logo") 9 | context.abbr = abbr or "Frappe Education" 10 | context.logo = logo or "/favicon.png" 11 | -------------------------------------------------------------------------------- /frontend/.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | .DS_Store 3 | dist 4 | dist-ssr 5 | *.local 6 | node_modules -------------------------------------------------------------------------------- /frontend/.prettierrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } 5 | -------------------------------------------------------------------------------- /frontend/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | Frappe Education 8 | 9 | 10 |
11 |
12 |
13 | 14 | 25 | 26 | 27 | 28 | -------------------------------------------------------------------------------- /frontend/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "frappe-ui-frontend", 3 | "private": true, 4 | "version": "0.0.0", 5 | "scripts": { 6 | "dev": "vite", 7 | "build": "vite build --base=/assets/education/frontend/ && yarn copy-html-entry", 8 | "preview": "vite preview", 9 | "copy-html-entry": "cp ../education/public/frontend/index.html ../education/www/student-portal.html" 10 | }, 11 | "dependencies": { 12 | "dayjs": "^1.11.10", 13 | "feather-icons": "^4.28.0", 14 | "frappe-ui": "^0.1.17", 15 | "lucide-vue-next": "^0.259.0", 16 | "pinia": "^2.1.7", 17 | "qalendar": "^3.6.1", 18 | "vue": "^3.2.25", 19 | "tailwindcss": "^3.3.3", 20 | "vue-router": "^4.0.12", 21 | "vite": "^2.7.2", 22 | "@vitejs/plugin-vue": "^2.0.0", 23 | "autoprefixer": "^10.4.2", 24 | "postcss": "^8.4.5" 25 | }, 26 | "devDependencies": { 27 | "@vitejs/plugin-vue": "^2.0.0", 28 | "autoprefixer": "^10.4.2", 29 | "postcss": "^8.4.5", 30 | "vite": "^2.7.2" 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /frontend/polyfills.js: -------------------------------------------------------------------------------- 1 | // polyfill of groupBy method 2 | if (!('groupBy' in Object)) { 3 | Object.prototype.groupBy = function (obj, fn) { 4 | if (typeof fn !== 'function') throw new Error(`${fn} should be a function`) 5 | Object.keys(obj).reduce((acc, key) => { 6 | const group = fn(obj[key]) 7 | if (!acc[group]) { 8 | acc[group] = [] 9 | } 10 | acc[group].push(obj[key]) 11 | return acc 12 | }, {}) 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /frontend/postcss.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | plugins: { 3 | tailwindcss: {}, 4 | autoprefixer: {}, 5 | }, 6 | } 7 | -------------------------------------------------------------------------------- /frontend/public/favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/public/favicon.png -------------------------------------------------------------------------------- /frontend/src/App.vue: -------------------------------------------------------------------------------- 1 | 15 | 16 | 22 | -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Black.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Black.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BlackItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-BlackItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BlackItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-BlackItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Bold.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Bold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-BoldItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-BoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-BoldItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraBold.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraBoldItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraLight.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraLightItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ExtraLightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ExtraLightItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Italic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Italic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Italic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Italic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Light.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Light.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-LightItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-LightItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-LightItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-LightItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Medium.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Medium.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-MediumItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-MediumItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-MediumItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-MediumItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Regular.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Regular.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-SemiBold.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBoldItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-SemiBoldItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-SemiBoldItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-SemiBoldItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Thin.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-Thin.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ThinItalic.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ThinItalic.woff -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-ThinItalic.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-ThinItalic.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-italic.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-italic.var.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter-roman.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter-roman.var.woff2 -------------------------------------------------------------------------------- /frontend/src/assets/Inter/Inter.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/frappe/education/64f03fd8b3f659640db2ce1cf353bd6a66d1df2f/frontend/src/assets/Inter/Inter.var.woff2 -------------------------------------------------------------------------------- /frontend/src/components/CalendarView.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 38 | 39 | 48 | -------------------------------------------------------------------------------- /frontend/src/components/CollapseSidebar.vue: -------------------------------------------------------------------------------- 1 | 28 | -------------------------------------------------------------------------------- /frontend/src/components/Home.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | -------------------------------------------------------------------------------- /frontend/src/components/MissingData.vue: -------------------------------------------------------------------------------- 1 | 6 | 14 | -------------------------------------------------------------------------------- /frontend/src/components/Navbar.vue: -------------------------------------------------------------------------------- 1 | 21 | 31 | -------------------------------------------------------------------------------- /frontend/src/index.css: -------------------------------------------------------------------------------- 1 | @import './assets/Inter/inter.css'; 2 | @import 'frappe-ui/src/style.css'; 3 | -------------------------------------------------------------------------------- /frontend/src/main.js: -------------------------------------------------------------------------------- 1 | import './index.css' 2 | 3 | import { createApp } from 'vue' 4 | import router from './router' 5 | import App from './App.vue' 6 | import { createPinia } from 'pinia' 7 | // import '../polyfills' 8 | 9 | import { 10 | Button, 11 | Card, 12 | Input, 13 | setConfig, 14 | frappeRequest, 15 | resourcesPlugin, 16 | } from 'frappe-ui' 17 | 18 | // create a pinia instance 19 | let pinia = createPinia() 20 | 21 | let app = createApp(App) 22 | 23 | setConfig('resourceFetcher', frappeRequest) 24 | 25 | app.use(pinia) 26 | app.use(router) 27 | app.use(resourcesPlugin) 28 | 29 | app.component('Button', Button) 30 | app.component('Card', Card) 31 | app.component('Input', Input) 32 | 33 | router.isReady().then(() => { 34 | app.mount('#app') 35 | }) 36 | -------------------------------------------------------------------------------- /frontend/src/pages/Home.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 10 | -------------------------------------------------------------------------------- /frontend/src/pages/Leaves.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | -------------------------------------------------------------------------------- /frontend/src/pages/Login.vue: -------------------------------------------------------------------------------- 1 | 24 | 25 | 36 | -------------------------------------------------------------------------------- /frontend/src/pages/Schedule.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 46 | 47 | 48 | -------------------------------------------------------------------------------- /frontend/src/pages/SchoolDiary.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /frontend/src/router.js: -------------------------------------------------------------------------------- 1 | import { createRouter, createWebHistory } from 'vue-router' 2 | import { usersStore } from '@/stores/user' 3 | import { sessionStore } from '@/stores/session' 4 | import { studentStore } from '@/stores/student' 5 | 6 | const routes = [ 7 | { path: '/', redirect: '/schedule' }, 8 | { 9 | path: '/schedule', 10 | name: 'Schedule', 11 | component: () => import('@/pages/Schedule.vue'), 12 | }, 13 | { 14 | path: '/grades', 15 | name: 'Grades', 16 | component: () => import('@/pages/Grades.vue'), 17 | }, 18 | { 19 | path: '/fees', 20 | name: 'Fees', 21 | component: () => import('@/pages/Fees.vue'), 22 | }, 23 | { 24 | path: '/attendance', 25 | name: 'Attendance', 26 | component: () => import('@/pages/Attendance.vue'), 27 | }, 28 | { 29 | path: '/:catchAll(.*)', 30 | redirect: '/schedule', 31 | }, 32 | ] 33 | 34 | let router = createRouter({ 35 | history: createWebHistory('/student-portal'), 36 | routes, 37 | }) 38 | 39 | router.beforeEach(async (to, from) => { 40 | const { isLoggedIn, user: sessionUser } = sessionStore() 41 | const { user } = usersStore() 42 | const { student } = studentStore() 43 | 44 | if (!isLoggedIn) { 45 | window.location.href = '/login' 46 | return await next(false) 47 | } 48 | 49 | if (user.data.length === 0) { 50 | await user.reload() 51 | } 52 | await student.reload() 53 | }) 54 | 55 | export default router 56 | -------------------------------------------------------------------------------- /frontend/src/stores/leave.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { ref, computed } from 'vue' 3 | 4 | export const leaveStore = defineStore('education-leave', () => { 5 | const isAttendancePage = ref(false) 6 | 7 | const setIsAttendancePage = (value) => { 8 | isAttendancePage.value = value 9 | } 10 | 11 | return { 12 | isAttendancePage, 13 | setIsAttendancePage, 14 | } 15 | }) 16 | -------------------------------------------------------------------------------- /frontend/src/stores/session.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { createResource } from 'frappe-ui' 3 | import { usersStore } from '@/stores/user' 4 | import router from '@/router' 5 | import { ref, computed } from 'vue' 6 | import { studentStore } from '@/stores/student' 7 | 8 | export const sessionStore = defineStore('education-session', () => { 9 | const { user: currentUser } = usersStore() 10 | const { student } = studentStore() 11 | 12 | function sessionUser() { 13 | let cookies = new URLSearchParams(document.cookie.split('; ').join('&')) 14 | let _sessionUser = cookies.get('user_id') 15 | if (_sessionUser === 'Guest') { 16 | _sessionUser = null 17 | } 18 | return _sessionUser 19 | } 20 | 21 | let user = ref(sessionUser()) 22 | const isLoggedIn = computed(() => !!user.value) 23 | const login = createResource({ 24 | url: 'login', 25 | onError() { 26 | throw new Error('Invalid email or password') 27 | }, 28 | onSuccess() { 29 | currentUser.reload() 30 | sessionUser.reload() 31 | student.reload() 32 | user.value = sessionUser() 33 | login.reset() 34 | router.replace({ path: '/' }) 35 | }, 36 | }) 37 | 38 | const logout = createResource({ 39 | url: 'logout', 40 | onSuccess() { 41 | user.value = null 42 | window.location.href = '/login' 43 | }, 44 | }) 45 | 46 | return { 47 | user, 48 | isLoggedIn, 49 | login, 50 | logout, 51 | } 52 | }) 53 | -------------------------------------------------------------------------------- /frontend/src/stores/student.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { ref } from 'vue' 3 | import { createResource } from 'frappe-ui' 4 | 5 | export const studentStore = defineStore('education-student', () => { 6 | const studentInfo = ref({}) 7 | const currentProgram = ref({}) 8 | const studentGroups = ref([]) 9 | 10 | const student = createResource({ 11 | url: 'education.education.api.get_student_info', 12 | onSuccess(info) { 13 | if (!info) { 14 | window.location.href = '/app' 15 | } 16 | currentProgram.value = info.current_program 17 | // remove current_program from info 18 | delete info.current_program 19 | studentGroups.value = info.student_groups 20 | delete info.student_groups 21 | studentInfo.value = info 22 | }, 23 | onError(err) { 24 | console.error(err) 25 | }, 26 | }) 27 | 28 | // const s = createDocumentResource({ 29 | // doctype:"Student", 30 | // whitelist: { 31 | // 'get_student_info': get_student_info 32 | // } 33 | // }) 34 | 35 | function getStudentInfo() { 36 | return studentInfo 37 | } 38 | function getCurrentProgram() { 39 | return currentProgram 40 | } 41 | 42 | function getStudentGroups() { 43 | return studentGroups 44 | } 45 | 46 | return { 47 | student, 48 | studentInfo, 49 | currentProgram, 50 | studentGroups, 51 | getStudentInfo, 52 | getCurrentProgram, 53 | getStudentGroups, 54 | } 55 | }) 56 | -------------------------------------------------------------------------------- /frontend/src/stores/user.js: -------------------------------------------------------------------------------- 1 | import { defineStore } from 'pinia' 2 | import { createResource } from 'frappe-ui' 3 | import router from '@/router' 4 | 5 | export const usersStore = defineStore('education-users', () => { 6 | const user = createResource({ 7 | url: 'education.education.api.get_user_info', 8 | cache: 'User', 9 | initialData: [], 10 | onError(error) { 11 | console.log(error) 12 | console.log(error.exc_type) 13 | if (error && error.exc_type === 'AuthenticationError') { 14 | router.push('/login') 15 | } 16 | }, 17 | }) 18 | 19 | return { 20 | user, 21 | } 22 | }) 23 | -------------------------------------------------------------------------------- /frontend/tailwind.config.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | presets: [require('frappe-ui/src/utils/tailwind.config')], 3 | content: [ 4 | './index.html', 5 | './src/**/*.{vue,js,ts,jsx,tsx}', 6 | './node_modules/frappe-ui/src/components/**/*.{vue,js,ts,jsx,tsx}', 7 | ], 8 | theme: { 9 | extend: {}, 10 | }, 11 | plugins: [], 12 | } 13 | -------------------------------------------------------------------------------- /frontend/vite.config.js: -------------------------------------------------------------------------------- 1 | import { defineConfig } from 'vite' 2 | import vue from '@vitejs/plugin-vue' 3 | import path from 'path' 4 | import frappeui from 'frappe-ui/vite' 5 | 6 | // https://vitejs.dev/config/ 7 | export default defineConfig({ 8 | plugins: [frappeui(), vue()], 9 | resolve: { 10 | alias: { 11 | '@': path.resolve(__dirname, 'src'), 12 | }, 13 | }, 14 | build: { 15 | outDir: `../${path.basename(path.resolve('..'))}/public/frontend`, 16 | emptyOutDir: true, 17 | target: 'es2015', 18 | rollupOptions: { 19 | output: { 20 | manualChunks: { 21 | 'frappe-ui': ['frappe-ui'], 22 | }, 23 | }, 24 | }, 25 | }, 26 | optimizeDeps: { 27 | include: ['feather-icons', 'showdown', 'engine.io-client'], 28 | }, 29 | }) 30 | -------------------------------------------------------------------------------- /license.txt: -------------------------------------------------------------------------------- 1 | License: GNU GPL V3 -------------------------------------------------------------------------------- /node_modules/.yarn-integrity: -------------------------------------------------------------------------------- 1 | { 2 | "systemParams": "darwin-arm64-108", 3 | "modulesFolders": [ 4 | "node_modules" 5 | ], 6 | "flags": [], 7 | "linkedModules": [], 8 | "topLevelPatterns": [], 9 | "lockfileEntries": {}, 10 | "files": [], 11 | "artifacts": {} 12 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "private": true, 3 | "scripts": { 4 | "postinstall": "cd frontend && yarn install --check-files", 5 | "dev": "cd frontend && yarn dev", 6 | "build": "cd frontend && yarn build" 7 | } 8 | } -------------------------------------------------------------------------------- /requirements.txt: -------------------------------------------------------------------------------- 1 | # frappe -- https://github.com/frappe/frappe is installed via 'bench init' -------------------------------------------------------------------------------- /setup.py: -------------------------------------------------------------------------------- 1 | from setuptools import setup, find_packages 2 | 3 | with open("requirements.txt") as f: 4 | install_requires = f.read().strip().split("\n") 5 | 6 | # get version from __version__ variable in education/__init__.py 7 | from education import __version__ as version 8 | 9 | setup( 10 | name="education", 11 | version=version, 12 | description="Education", 13 | author="Frappe Technologies Pvt. Ltd.", 14 | author_email="hello@frappe.io", 15 | packages=find_packages(), 16 | zip_safe=False, 17 | include_package_data=True, 18 | install_requires=install_requires, 19 | ) 20 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | --------------------------------------------------------------------------------