LMS: Quiz Eval and Max Attempts Check
Co-authored-by: Chinmay Pai <chinmaydpai@gmail.com>
diff --git a/erpnext/education/doctype/quiz/quiz.py b/erpnext/education/doctype/quiz/quiz.py
index a7e5541..fdff16d 100644
--- a/erpnext/education/doctype/quiz/quiz.py
+++ b/erpnext/education/doctype/quiz/quiz.py
@@ -9,11 +9,22 @@
class Quiz(Document):
+ def validate_quiz_attempts(self, enrollment, quiz_name):
+ print(enrollment, quiz_name)
+ if self.max_attempts > 0:
+ try:
+ if len(frappe.get_all("Quiz Activity", {'enrollment': enrollment.name, 'quiz': quiz_name})) >= self.max_attempts:
+ frappe.throw('Maximum attempts reached!')
+ except:
+ pass
+
+
def get_quiz(self):
pass
- def evaluate(self, response_dict):
+ def evaluate(self, response_dict, enrollment, quiz_name):
+ self.validate_quiz_attempts(enrollment, quiz_name)
self.get_questions()
answers = {q.name:q.get_answer() for q in self.get_questions()}
correct_answers = {question: (answers[question] == response_dict[question]) for question in response_dict.keys()}
diff --git a/erpnext/education/doctype/quiz_result/quiz_result.json b/erpnext/education/doctype/quiz_result/quiz_result.json
index cb5ba1b..c4a2385 100644
--- a/erpnext/education/doctype/quiz_result/quiz_result.json
+++ b/erpnext/education/doctype/quiz_result/quiz_result.json
@@ -86,7 +86,7 @@
"bold": 0,
"collapsible": 0,
"columns": 0,
- "fieldname": "result",
+ "fieldname": "quiz_result",
"fieldtype": "Select",
"hidden": 0,
"ignore_user_permissions": 0,
@@ -123,8 +123,8 @@
"issingle": 0,
"istable": 1,
"max_attachments": 0,
- "modified": "2018-10-22 03:38:29.007162",
- "modified_by": "Administrator",
+ "modified": "2018-10-22 15:43:00.224162",
+ "modified_by": "jess@education.com",
"module": "Education",
"name": "Quiz Result",
"name_case": "",
diff --git a/erpnext/education/doctype/quiz_result/quiz_result.py b/erpnext/education/doctype/quiz_result/quiz_result.py
index 4a6323c..a4fd9f0 100644
--- a/erpnext/education/doctype/quiz_result/quiz_result.py
+++ b/erpnext/education/doctype/quiz_result/quiz_result.py
@@ -6,5 +6,5 @@
import frappe
from frappe.model.document import Document
-class quiz_result(Document):
+class QuizResult(Document):
pass
diff --git a/erpnext/education/utils.py b/erpnext/education/utils.py
index b0bf50e..3962758 100644
--- a/erpnext/education/utils.py
+++ b/erpnext/education/utils.py
@@ -43,6 +43,7 @@
return existing[0] if existing else None
+
def validate_duplicate_student(students):
unique_students= []
for stud in students:
@@ -64,20 +65,19 @@
quiz_response = json.loads(quiz_response)
quiz_name = kwargs.get('quiz')
course_name = kwargs.get('course')
+ enrollment = get_course_enrollment(course_name, frappe.session.user)
try:
quiz = frappe.get_doc("Quiz", quiz_name)
- answers, score = quiz.evaluate(quiz_response)
- add_quiz_activity(course_name, quiz_name, score, answers, quiz_response)
+ answers, score = quiz.evaluate(quiz_response, enrollment, quiz_name)
+ add_quiz_activity(enrollment, quiz_name, score, answers, quiz_response)
return score
except frappe.DoesNotExistError:
frappe.throw("Quiz {0} does not exist".format(quiz_name))
return None
-def add_quiz_activity(course, quiz, score, answers, quiz_response):
- print(course, quiz, result, score)
- enrollment = get_course_enrollment(course, frappe.session.user)
- answer_list = list(answers.values())
+def add_quiz_activity(enrollment, quiz, score, answers, quiz_response):
+ print(quiz, answers, score)
if not enrollment:
frappe.throw("The user is not enrolled for the course {course}".format(course=course))
activity = frappe.get_doc({
@@ -85,13 +85,15 @@
"enrollment": enrollment.name,
"quiz": quiz,
"score": score,
- "date": frappe.getdate()
+ "date": frappe.utils.datetime.datetime.now()
})
- for i in len(quiz_response):
+ for question in quiz_response.keys():
activity.append("result",
{
- "selected_option": quiz_response[i],
- "result": answer_list[i]})
+ "question": question,
+ "selected_option": quiz_response[question],
+ "quiz_result": 'Correct' if answers[question] else 'Wrong'
+ })
activity.save()
frappe.db.commit()