Refactored Course Progression Logic

This commit is contained in:
scmmishra 2018-11-20 18:37:01 +05:30 committed by Aditya Hase
parent 1192529698
commit a592f70d4a
4 changed files with 55 additions and 82 deletions

View File

@ -13,9 +13,10 @@ export default {
methods: { methods: {
addActivity() { addActivity() {
if(this.$route.params.type != "Quiz"){ if(this.$route.params.type != "Quiz"){
console.log("Adding Activity")
lms.call("add_activity", lms.call("add_activity",
{ {
enrollment: lms.store.enrolledCourses[this.$route.params.course], course: this.$route.params.course,
content_type: this.$route.params.type, content_type: this.$route.params.type,
content: this.$route.params.content content: this.$route.params.content
} }

View File

@ -36,16 +36,16 @@ export default {
}, },
computed: { computed: {
showStart() { showStart() {
return lms.loggedIn && !this.courseMeta.flag == "Completed"; return lms.loggedIn && !this.courseMeta.flag == "Complete";
}, },
showCompleted() { showCompleted() {
return lms.loggedIn && this.courseMeta.flag == "Completed"; return lms.loggedIn && this.courseMeta.flag == "Complete";
}, },
firstContentRoute() { firstContentRoute() {
return `${this.program_name}/${this.course.name}/${this.courseMeta.content_type}/${this.courseMeta.content}` return `${this.program_name}/${this.course.name}/${this.courseMeta.content_type}/${this.courseMeta.content}`
}, },
buttonType() { buttonType() {
if (this.courseMeta.flag == "Start" ){ if (this.courseMeta.flag == "Start Course" ){
return "primary" return "primary"
} }
else if (this.courseMeta.flag == "Complete" ) { else if (this.courseMeta.flag == "Complete" ) {

View File

@ -16,13 +16,13 @@ export default {
} }
}, },
mounted() { mounted() {
if(this.isLoggedIn && this.$route.name == 'program'){ // if(this.isLoggedIn && this.$route.name == 'program'){
this.getContinueData().then( data => { // this.getContinueData().then( data => {
this.nextContent = data.content, // this.nextContent = data.content,
this.nextContentType = data.content_type, // this.nextContentType = data.content_type,
this.nextCourse = data.course // this.nextCourse = data.course
}) // })
} // }
this.computeButtons() this.computeButtons()
}, },
methods: { methods: {
@ -32,9 +32,9 @@ export default {
if(this.$route.name == 'home'){ if(this.$route.name == 'home'){
this.buttonName = 'Explore Courses' this.buttonName = 'Explore Courses'
} }
else if(this.$route.name == 'program'){ // else if(this.$route.name == 'program'){
this.buttonName = 'Start Course' // this.buttonName = 'Start Course'
} // }
} }
else { else {
this.buttonName = 'Enroll Now' this.buttonName = 'Enroll Now'
@ -44,14 +44,14 @@ export default {
this.buttonName = 'Sign Up' this.buttonName = 'Sign Up'
} }
}, },
getContinueData() { // getContinueData() {
lms.call({ // lms.call({
method: "get_continue_data", // method: "get_continue_data",
args: { // args: {
program_name: this.$route.params.program_name // program_name: this.$route.params.program_name
} // }
}) // })
}, // },
primaryAction() { primaryAction() {
if(this.$route.name == 'home'){ if(this.$route.name == 'home'){
return return

View File

@ -64,38 +64,9 @@ def get_program_details(program_name):
def get_courses(program_name): def get_courses(program_name):
program = frappe.get_doc('Program', program_name) program = frappe.get_doc('Program', program_name)
courses = program.get_course_list() courses = program.get_course_list()
course_data = [{'meta':get_continue_content(item.name), 'course':item} for item in courses] course_data = [{'meta':get_course_meta(utils.get_course_enrollment(item.name)), 'course':item} for item in courses]
return course_data return course_data
def get_continue_content(course_name):
if frappe.session.user == "Guest":
return dict(content=None, content_type=None, flag=None)
enrollment = utils.get_course_enrollment(course_name)
course = frappe.get_doc("Course", enrollment.course)
last_activity = enrollment.get_last_activity()
if last_activity == None:
next_content = course.get_first_content()
return dict(content=next_content.name, content_type=next_content.doctype, flag="Start")
if last_activity.doctype == "Quiz Activity":
next_content = get_next_content(last_activity.quiz, "Quiz", course.name)
else:
next_content = get_next_content(last_activity.content, last_activity.content_type, course.name)
if next_content == None:
next_content = course.get_first_content()
return dict(content=next_content.name, content_type=next_content.doctype, flag="Complete")
else:
next_content['flag'] = "Continue"
return next_content
def get_starting_content(course_name):
course = frappe.get_doc('Course', course_name)
content = course.course_content[0].content
content_type = course.course_content[0].content_type
return dict(content=content, content_type=content_type)
@frappe.whitelist() @frappe.whitelist()
def get_next_content(content, content_type, course): def get_next_content(content, content_type, course):
if frappe.session.user == "Guest": if frappe.session.user == "Guest":
@ -170,17 +141,6 @@ def add_quiz_activity(enrollment, quiz_name, result_data, score, status):
quiz_activity.save() quiz_activity.save()
frappe.db.commit() frappe.db.commit()
@frappe.whitelist()
def get_continue_data(program_name):
program = frappe.get_doc("Program", program_name)
courses = program.get_all_children()
try:
continue_data = get_starting_content(courses[0].course)
continue_data['course'] = courses[0].course
return continue_data
except:
return None
@frappe.whitelist() @frappe.whitelist()
def enroll_in_program(program_name): def enroll_in_program(program_name):
if(not utils.get_current_student()): if(not utils.get_current_student()):
@ -192,13 +152,14 @@ def enroll_in_program(program_name):
# Academty Activity # Academty Activity
@frappe.whitelist() @frappe.whitelist()
def add_activity(enrollment, content_type, content): def add_activity(course, content_type, content):
if(utils.check_activity_exists(enrollment, content_type, content)): enrollment = utils.get_course_enrollment(course)
if(utils.check_activity_exists(enrollment.name, content_type, content)):
pass pass
else: else:
activity = frappe.get_doc({ activity = frappe.get_doc({
"doctype": "Course Activity", "doctype": "Course Activity",
"enrollment": enrollment, "enrollment": enrollment.name,
"content_type": content_type, "content_type": content_type,
"content": content, "content": content,
"activity_date": frappe.utils.datetime.datetime.now() "activity_date": frappe.utils.datetime.datetime.now()
@ -215,8 +176,8 @@ def get_course_progress(course_enrollment):
status = check_content_completion(content.name, content.doctype, course_enrollment.name) status = check_content_completion(content.name, content.doctype, course_enrollment.name)
progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status}) progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status})
elif content.doctype == 'Quiz': elif content.doctype == 'Quiz':
status, score = check_quiz_completion(content, course_enrollment.name) status, score, result = check_quiz_completion(content, course_enrollment.name)
progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status, 'score': score}) progress.append({'content': content.name, 'content_type': content.doctype, 'is_complete': status, 'score': score, 'result': result})
return progress return progress
def check_content_completion(content_name, content_type, enrollment_name): def check_content_completion(content_name, content_type, enrollment_name):
@ -228,18 +189,29 @@ def check_content_completion(content_name, content_type, enrollment_name):
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_list("Quiz Activity", filters={'enrollment': enrollment_name, 'quiz': quiz.name}, fields=["name", "activity_date", "score", "status"])
if attempts and quiz.grading_basis == 'Last Attempt': status = bool(len(attempts) == quiz.max_attempts)
score = attempts[0]['score'] score = None
status = attempts[0]['status'] result = None
return status, score if attempts and quiz.grading_basis == 'Last Highest Score':
attempts = sorted(attempts, key = lambda i: int(i.score), reverse=True)
elif attempts and quiz.grading_basis == 'Last Highest Score': score = attempts[0]['score']
sorted_by_score = sorted(attempts, key = lambda i: int(i.score), reverse=True) result = attempts[0]['status']
score = sorted_by_score[0]['score'] if result == 'Pass':
status = sorted_by_score[0]['status'] status = True
return status, score return status, score, result
return False, None
def get_course_meta():
pass def get_course_meta(course_enrollment):
# course_enrollment = frappe.get_doc("Course Enrollment", course_enrollment_name)
progress = get_course_progress(course_enrollment)
print(progress)
count = sum([act['is_complete'] for act in progress])
print('Count', count)
if count == 0:
return {'flag':'Start Course', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']}
elif count == len(progress):
return {'flag':'Complete', 'content_type': progress[0]['content_type'], 'content': progress[0]['content']}
elif count < len(progress):
next_item = next(item for item in progress if item['is_complete']==False)
return {'flag':'Continue', 'content_type': next_item['content_type'], 'content': next_item['content']}