blob: 339830dbe6b1506970e372d86d53746273dcc91c [file] [log] [blame]
scmmishra1778b592018-10-30 18:25:49 +05301from __future__ import unicode_literals
2import frappe
scmmishra1778b592018-10-30 18:25:49 +05303
scmmishra9c642ac2018-11-01 17:17:49 +05304# Functions to get homepage details
scmmishrabcafe842018-11-03 14:48:42 +05305@frappe.whitelist(allow_guest=True)
scmmishra1778b592018-10-30 18:25:49 +05306def get_portal_details():
7 settings = frappe.get_doc("Education Settings")
8 title = settings.portal_title
9 description = settings.description
10 return dict(title=title, description=description)
11
scmmishrabcafe842018-11-03 14:48:42 +053012@frappe.whitelist(allow_guest=True)
scmmishra1778b592018-10-30 18:25:49 +053013def get_featured_programs():
scmmishrabcafe842018-11-03 14:48:42 +053014 featured_program_names = frappe.get_all("Program", filters={"is_published": True, "is_featured": True})
scmmishra1778b592018-10-30 18:25:49 +053015 featured_list = [program["name"] for program in featured_program_names]
16 if featured_list:
17 return featured_list
18 else:
19 return None
20
scmmishra9c642ac2018-11-01 17:17:49 +053021# Functions to get program & course details
scmmishrabcafe842018-11-03 14:48:42 +053022@frappe.whitelist(allow_guest=True)
scmmishra1778b592018-10-30 18:25:49 +053023def get_program_details(program_name):
24 try:
25 program = frappe.get_doc('Program', program_name)
26 return program
27 except:
28 return None
scmmishra9c642ac2018-11-01 17:17:49 +053029
scmmishrabcafe842018-11-03 14:48:42 +053030@frappe.whitelist(allow_guest=True)
scmmishra9c642ac2018-11-01 17:17:49 +053031def get_courses(program_name):
32 program = frappe.get_doc('Program', program_name)
33 courses = program.get_course_list()
34 return courses
35
36@frappe.whitelist()
37def get_starting_content(course_name):
38 course = frappe.get_doc('Course', course_name)
39 content = course.course_content[0].content
40 content_type = course.course_content[0].content_type
41 return dict(content=content, content_type=content_type)
42
43
44# Functions to get content details
45@frappe.whitelist()
46def get_content(content_name, content_type):
47 try:
48 content = frappe.get_doc(content_type, content_name)
49 return content
50 except:
51 frappe.throw("{0} with name {1} does not exist".format(content_type, content_name))
52 return None
53
54@frappe.whitelist()
55def get_next_content(content, content_type, course):
56 course_doc = frappe.get_doc("Course", course)
57 content_list = [{'content_type':item.content_type, 'content':item.content} for item in course_doc.get_all_children()]
58 current_index = content_list.index({'content': content, 'content_type': content_type})
59 try:
60 return content_list[current_index + 1]
61 except IndexError:
scmmishra37418442018-11-01 19:50:47 +053062 return None
63
64def get_quiz_with_answers(quiz_name):
65 try:
66 quiz = frappe.get_doc("Quiz", quiz_name).get_questions()
67 quiz_output = [{'name':question.name, 'question':question.question, 'options':[{'name': option.name, 'option':option.option, 'is_correct':option.is_correct} for option in question.options]} for question in quiz]
68 return quiz_output
69 except:
70 frappe.throw("Quiz {0} does not exist".format(quiz_name))
71 return None
72
73@frappe.whitelist()
74def get_quiz_without_answers(quiz_name):
75 try:
76 quiz = frappe.get_doc("Quiz", quiz_name).get_questions()
77 quiz_output = [{'name':question.name, 'question':question.question, 'options':[{'name': option.name, 'option':option.option} for option in question.options]} for question in quiz]
78 return quiz_output
79 except:
80 frappe.throw("Quiz {0} does not exist".format(quiz_name))
scmmishraf7029f02018-11-02 13:15:49 +053081 return None
82
83@frappe.whitelist()
scmmishraef9a75e2018-11-02 16:35:46 +053084def evaluate_quiz(quiz_response, quiz_name):
85 """LMS Function: Evaluates a simple multiple choice quiz.
scmmishraf7029f02018-11-02 13:15:49 +053086
87
88 :param quiz_response: contains user selected choices for a quiz in the form of a string formatted as a dictionary. The function uses `json.loads()` to convert it to a python dictionary.
scmmishraf7029f02018-11-02 13:15:49 +053089 """
90 import json
scmmishraf7029f02018-11-02 13:15:49 +053091 quiz_response = json.loads(quiz_response)
scmmishraef9a75e2018-11-02 16:35:46 +053092 quiz = frappe.get_doc("Quiz", quiz_name)
93 answers, score = quiz.evaluate(quiz_response, quiz_name)
94 return(score)
scmmishraf7029f02018-11-02 13:15:49 +053095 # quiz_name = kwargs.get('quiz')
96 # course_name = kwargs.get('course')
97 # enrollment = get_course_enrollment(course_name, frappe.session.user)
98 # try:
99 # quiz = frappe.get_doc("Quiz", quiz_name)
100 # answers, score = quiz.evaluate(quiz_response, enrollment, quiz_name)
101 # add_quiz_activity(enrollment, quiz_name, score, answers, quiz_response)
102 # return score
103 # except frappe.DoesNotExistError:
104 # frappe.throw("Quiz {0} does not exist".format(quiz_name))
scmmishrabcafe842018-11-03 14:48:42 +0530105 # return None
106
107@frappe.whitelist()
scmmishra73a31ec2018-11-03 19:31:53 +0530108def get_completed_courses(email=frappe.session.user):
scmmishra76222f72018-11-05 11:02:14 +0530109 print("Get completed course ", email)
scmmishra73a31ec2018-11-03 19:31:53 +0530110 try:
scmmishra73a31ec2018-11-03 19:31:53 +0530111 student = frappe.get_doc("Student", get_student_id(email))
112 return student.get_completed_courses()
113 except:
114 return None
scmmishra8b8db542018-11-03 18:03:24 +0530115
116@frappe.whitelist()
117def get_continue_data(program_name):
118 program = frappe.get_doc("Program", program_name)
119 courses = program.get_all_children()
120 continue_data = get_starting_content(courses[0].course)
121 continue_data['course'] = courses[0].course
122 return continue_data
123
124def create_student(student_name=frappe.session.user):
125 student = frappe.get_doc({
126 "doctype": "Student",
127 "first_name": student_name,
128 "student_email_id": student_name,
129 })
130 student.save()
131 frappe.db.commit()
132 return student_name
133
134@frappe.whitelist()
scmmishra73a31ec2018-11-03 19:31:53 +0530135def enroll_all_courses_in_program(program_enrollment, student):
136 course_list = [course.name for course in get_courses(program_enrollment.program)]
137 for course_name in course_list:
138 student.enroll_in_course(course_name=course_name, program_enrollment=program_enrollment.name)
139
140@frappe.whitelist()
141def enroll_in_program(program_name, student_email_id):
scmmishra8b8db542018-11-03 18:03:24 +0530142 if(not get_student_id(student_email_id)):
143 create_student(student_email_id)
144 student = frappe.get_doc("Student", get_student_id(student_email_id))
scmmishra73a31ec2018-11-03 19:31:53 +0530145 program_enrollment = student.enroll_in_program(program_name)
146 enroll_all_courses_in_program(program_enrollment, student)
scmmishra8b8db542018-11-03 18:03:24 +0530147
scmmishra73a31ec2018-11-03 19:31:53 +0530148@frappe.whitelist()
scmmishra8b8db542018-11-03 18:03:24 +0530149def get_student_id(email=None):
150 """Returns student user name, example EDU-STU-2018-00001 (Based on the naming series).
151
152 :param user: a user email address
153 """
154 try:
155 return frappe.get_all('Student', filters={'student_email_id': email}, fields=['name'])[0].name
156 except IndexError:
scmmishra73a31ec2018-11-03 19:31:53 +0530157 return None
158
159@frappe.whitelist()
160def get_program_enrollments(email=frappe.session.user):
161 try:
162 student = frappe.get_doc("Student", get_student_id(email))
163 return student.get_program_enrollments()
164 except:
165 return None
166
167@frappe.whitelist()
168def get_course_enrollments(email=frappe.session.user):
169 try:
170 student = frappe.get_doc("Student", get_student_id(email))
171 return student.get_course_enrollments()
172 except:
scmmishra1a04f772018-11-03 20:43:59 +0530173 return None
174
175@frappe.whitelist()
176def add_activity(enrollment, content_type, content):
scmmishra76222f72018-11-05 11:02:14 +0530177 if(check_activity_exists(enrollment, content_type, content)):
178 pass
179 else:
180 activity = frappe.get_doc({
181 "doctype": "Course Activity",
182 "enrollment": enrollment,
183 "content_type": content_type,
184 "content": content,
185 "activity_date": frappe.utils.datetime.datetime.now()
186 })
187 activity.save()
188 frappe.db.commit()
189
190def check_activity_exists(enrollment, content_type, content):
191 activity = frappe.get_all("Course Activity", filters={'enrollment': enrollment, 'content_type': content_type, 'content': content})
192 if activity:
193 return True
194 else:
195 return False
196
197@frappe.whitelist()
198def add_quiz_activity(enrollment, quiz, score, answers):
199 pass