mirror of
https://github.com/frappe/erpnext.git
synced 2026-05-14 02:31:21 +00:00
[Major][Breaking] Server side changes to handle Topic Layer
- Moved `get_course_progress` to CourseEnrollment class. - Added Topic context to progress functions in lms.py - Create user on creation of a student
This commit is contained in:
@@ -5,27 +5,19 @@
|
|||||||
from __future__ import unicode_literals
|
from __future__ import unicode_literals
|
||||||
import frappe
|
import frappe
|
||||||
from frappe.model.document import Document
|
from frappe.model.document import Document
|
||||||
|
from functools import reduce
|
||||||
|
|
||||||
class CourseEnrollment(Document):
|
class CourseEnrollment(Document):
|
||||||
|
def get_progress(self, student):
|
||||||
def get_linked_activity(self):
|
"""
|
||||||
course_activity_list = frappe.get_all("Course Activity", filters={'enrollment':self.name})
|
Returns Progress of given student for a particular course enrollment
|
||||||
course_activity = [frappe.get_doc("Course Activity", activity.name) for activity in course_activity_list]
|
|
||||||
quiz_activity_list = frappe.get_all("Quiz Activity", filters={'enrollment':self.name})
|
|
||||||
quiz_activity = [frappe.get_doc("Quiz Activity", activity.name) for activity in quiz_activity_list]
|
|
||||||
return course_activity, quiz_activity
|
|
||||||
|
|
||||||
def get_all_activity(self):
|
:param self: Course Enrollment Object
|
||||||
courses, quizes = self.get_linked_activity()
|
:param student: Student Object
|
||||||
joined = courses + quizes
|
"""
|
||||||
activity = sorted(joined, key = lambda i: i.modified) # Sorting based on modified timestamp
|
course = frappe.get_doc('Course', self.course)
|
||||||
return activity
|
topics = course.get_topics()
|
||||||
|
progress = []
|
||||||
def check_course_completion(self):
|
for topic in topics:
|
||||||
pass
|
progress.append(student.get_topic_progress(self.name, topic))
|
||||||
|
return reduce(lambda x,y: x+y, progress) # Flatten out the List
|
||||||
def get_last_activity(self):
|
|
||||||
if len(self.get_all_activity()) == 0:
|
|
||||||
return None
|
|
||||||
else:
|
|
||||||
return self.get_all_activity()[-1]
|
|
||||||
@@ -40,6 +40,9 @@ class Student(Document):
|
|||||||
frappe.throw(_("Student {0} exist against student applicant {1}").format(student[0][0], self.student_applicant))
|
frappe.throw(_("Student {0} exist against student applicant {1}").format(student[0][0], self.student_applicant))
|
||||||
|
|
||||||
def after_insert(self):
|
def after_insert(self):
|
||||||
|
self.create_student()
|
||||||
|
|
||||||
|
def create_student(self):
|
||||||
"""Create a website user for student creation if not already exists"""
|
"""Create a website user for student creation if not already exists"""
|
||||||
if self.user == None:
|
if self.user == None:
|
||||||
student_user = frappe.get_doc({
|
student_user = frappe.get_doc({
|
||||||
@@ -56,8 +59,6 @@ class Student(Document):
|
|||||||
self.user = student_user.name
|
self.user = student_user.name
|
||||||
self.save()
|
self.save()
|
||||||
update_password_link = student_user.reset_password()
|
update_password_link = student_user.reset_password()
|
||||||
print(update_password_link)
|
|
||||||
|
|
||||||
|
|
||||||
def update_applicant_status(self):
|
def update_applicant_status(self):
|
||||||
"""Updates Student Applicant status to Admitted"""
|
"""Updates Student Applicant status to Admitted"""
|
||||||
@@ -66,7 +67,7 @@ class Student(Document):
|
|||||||
|
|
||||||
def get_all_course_enrollments(self):
|
def get_all_course_enrollments(self):
|
||||||
"""Returns a list of course enrollments linked with the current student"""
|
"""Returns a list of course enrollments linked with the current student"""
|
||||||
course_enrollments = frappe.get_list("Course Enrollment", filters={"student": self.name}, fields=['course', 'name'])
|
course_enrollments = frappe.get_all("Course Enrollment", filters={"student": self.name}, fields=['course', 'name'])
|
||||||
if not course_enrollments:
|
if not course_enrollments:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -65,7 +65,7 @@ def get_current_student():
|
|||||||
if email in ('Administrator', 'Guest'):
|
if email in ('Administrator', 'Guest'):
|
||||||
return None
|
return None
|
||||||
try:
|
try:
|
||||||
student_id = frappe.db.get_all("Student", {"student_email_id": email}, ["name"])[0].name
|
student_id = frappe.get_all("Student", {"student_email_id": email}, ["name"])[0].name
|
||||||
return student_id
|
return student_id
|
||||||
except IndexError:
|
except IndexError:
|
||||||
return None
|
return None
|
||||||
@@ -78,7 +78,7 @@ def get_program_enrollment(program_name):
|
|||||||
if not student:
|
if not student:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
enrollment = frappe.get_list("Program Enrollment", filters={'student':student, 'program': program_name})
|
enrollment = frappe.get_all("Program Enrollment", filters={'student':student, 'program': program_name})
|
||||||
if enrollment:
|
if enrollment:
|
||||||
return enrollment[0].name
|
return enrollment[0].name
|
||||||
else:
|
else:
|
||||||
@@ -122,14 +122,14 @@ def check_activity_exists(enrollment, content_type, content):
|
|||||||
return bool(activity)
|
return bool(activity)
|
||||||
|
|
||||||
def check_content_completion(content_name, content_type, enrollment_name):
|
def check_content_completion(content_name, content_type, enrollment_name):
|
||||||
activity = frappe.get_list("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
|
activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment_name, 'content_type': content_type, 'content': content_name})
|
||||||
if activity:
|
if activity:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def check_quiz_completion(quiz, enrollment_name):
|
def check_quiz_completion(quiz, enrollment_name):
|
||||||
attempts = frappe.get_list("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
|
attempts = frappe.get_all("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
|
||||||
status = bool(len(attempts) == quiz.max_attempts)
|
status = bool(len(attempts) == quiz.max_attempts)
|
||||||
score = None
|
score = None
|
||||||
result = None
|
result = None
|
||||||
|
|||||||
@@ -70,12 +70,12 @@ def get_courses(program_name):
|
|||||||
return courses
|
return courses
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_next_content(content, content_type, course):
|
def get_next_content(current_content, current_content_type, topic):
|
||||||
if frappe.session.user == "Guest":
|
if frappe.session.user == "Guest":
|
||||||
return None
|
return None
|
||||||
course_doc = frappe.get_doc("Course", course)
|
topic = frappe.get_doc("Topic", topic)
|
||||||
content_list = [{'content_type':item.content_type, 'content':item.content} for item in course_doc.get_all_children()]
|
content_list = [{'content_type':item.doctype, 'content':item.name} for item in topic.get_contents()]
|
||||||
current_index = content_list.index({'content': content, 'content_type': content_type})
|
current_index = content_list.index({'content': current_content, 'content_type': current_content_type})
|
||||||
try:
|
try:
|
||||||
# print(content_list[current_index + 1])
|
# print(content_list[current_index + 1])
|
||||||
return content_list[current_index + 1]
|
return content_list[current_index + 1]
|
||||||
@@ -166,26 +166,22 @@ def add_activity(course, content_type, content):
|
|||||||
activity.save()
|
activity.save()
|
||||||
frappe.db.commit()
|
frappe.db.commit()
|
||||||
|
|
||||||
def get_course_progress(course_enrollment):
|
|
||||||
student_id = utils.get_current_student()
|
|
||||||
student = frappe.get_doc("Student", student_id)
|
|
||||||
course = frappe.get_doc('Course', course_enrollment.course)
|
|
||||||
topics = course.get_topics()
|
|
||||||
progress = []
|
|
||||||
for topic in topics:
|
|
||||||
progress.append(student.get_topic_progress(course_enrollment.name, topic))
|
|
||||||
return progress
|
|
||||||
|
|
||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_course_meta(course_name, program_name):
|
def get_course_meta(course_name, program_name):
|
||||||
|
"""
|
||||||
|
Return the porgress of a course in a program as well as the content to continue from.
|
||||||
|
:param course_name:
|
||||||
|
:param program_name:
|
||||||
|
"""
|
||||||
course_enrollment = utils.get_course_enrollment(course_name)
|
course_enrollment = utils.get_course_enrollment(course_name)
|
||||||
program_enrollment = utils.get_program_enrollment(program_name)
|
program_enrollment = utils.get_program_enrollment(program_name)
|
||||||
|
student = frappe.get_doc("Student", utils.get_current_student())
|
||||||
if not program_enrollment:
|
if not program_enrollment:
|
||||||
return None
|
return None
|
||||||
if not course_enrollment:
|
if not course_enrollment:
|
||||||
utils.enroll_in_course(course_name, program_name)
|
utils.enroll_in_course(course_name, program_name)
|
||||||
progress = get_course_progress(course_enrollment)
|
progress = course_enrollment.get_progress(student)
|
||||||
count = sum([act['is_complete'] for act in progress])
|
count = sum([activity['is_complete'] for activity in progress])
|
||||||
if count == 0:
|
if count == 0:
|
||||||
return {'flag':'Start Course', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']}
|
return {'flag':'Start Course', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']}
|
||||||
elif count == len(progress):
|
elif count == len(progress):
|
||||||
@@ -198,7 +194,7 @@ def get_course_meta(course_name, program_name):
|
|||||||
def get_program_progress(program_name):
|
def get_program_progress(program_name):
|
||||||
import math
|
import math
|
||||||
program = frappe.get_doc("Program", program_name)
|
program = frappe.get_doc("Program", program_name)
|
||||||
program_enrollment = frappe.get_list("Program Enrollment", filters={'student': utils.get_current_student(), 'program': program_name })[0].name
|
program_enrollment = utils.get_program_enrollment(program_name)
|
||||||
program_meta = {}
|
program_meta = {}
|
||||||
if not program_enrollment:
|
if not program_enrollment:
|
||||||
return None
|
return None
|
||||||
@@ -224,15 +220,16 @@ def get_joining_date():
|
|||||||
@frappe.whitelist()
|
@frappe.whitelist()
|
||||||
def get_quiz_progress(program_name):
|
def get_quiz_progress(program_name):
|
||||||
program = frappe.get_doc("Program", program_name)
|
program = frappe.get_doc("Program", program_name)
|
||||||
program_enrollment = frappe.get_list("Program Enrollment", filters={'student': utils.get_current_student(), 'program': program_name })[0].name
|
program_enrollment = utils.get_program_enrollment(program_name)
|
||||||
quiz_meta = frappe._dict()
|
quiz_meta = frappe._dict()
|
||||||
|
student = frappe.get_doc("Student", utils.get_current_student())
|
||||||
if not program_enrollment:
|
if not program_enrollment:
|
||||||
return None
|
return None
|
||||||
else:
|
else:
|
||||||
progress_list = []
|
progress_list = []
|
||||||
for course in program.get_all_children():
|
for course in program.get_all_children():
|
||||||
course_enrollment = utils.get_course_enrollment(course.course)
|
course_enrollment = utils.get_course_enrollment(course.course)
|
||||||
meta = get_course_progress(course_enrollment)
|
meta = course_enrollment.get_progress(student)
|
||||||
for progress_item in meta:
|
for progress_item in meta:
|
||||||
# if progress_item['content_type'] == "Quiz" and progress_item['is_complete'] == True:
|
# if progress_item['content_type'] == "Quiz" and progress_item['is_complete'] == True:
|
||||||
if progress_item['content_type'] == "Quiz":
|
if progress_item['content_type'] == "Quiz":
|
||||||
|
|||||||
Reference in New Issue
Block a user