summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--yaksh/models.py12
-rw-r--r--yaksh/settings.py14
-rw-r--r--yaksh/templates/yaksh/question.html18
-rw-r--r--yaksh/urls.py2
-rw-r--r--yaksh/views.py44
5 files changed, 65 insertions, 25 deletions
diff --git a/yaksh/models.py b/yaksh/models.py
index d15fdf2..fa4121d 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -250,6 +250,7 @@ class Question(models.Model):
return json.dumps(question_data)
+<<<<<<< HEAD
def dump_into_json(self, question_ids, user):
questions = Question.objects.filter(id__in = question_ids, user_id = user.id)
questions_dict = []
@@ -270,15 +271,18 @@ class Question(models.Model):
question['user'] = user
Question.objects.get_or_create(**question)
- def get_test_cases(self):
+ def get_test_cases(self, **kwargs):
test_case_ctype = ContentType.objects.get(app_label="yaksh", model=self.test_case_type)
- test_cases = test_case_ctype.get_all_objects_for_this_type(question=self)
+ test_cases = test_case_ctype.get_all_objects_for_this_type(question=self, **kwargs)
return test_cases
- def get_test_case(self, test_case_id):
+ # def get_test_case(self, test_case_id):
+ # test_case_ctype = ContentType.objects.get(app_label="yaksh", model=self.test_case_type)
+ # test_case = test_case_ctype.get_object_for_this_type(question=self, id=test_case_id)
+ def get_test_case(self, **kwargs):
test_case_ctype = ContentType.objects.get(app_label="yaksh", model=self.test_case_type)
- test_case = test_case_ctype.get_object_for_this_type(question=self, id=test_case_id)
+ test_case = test_case_ctype.get_object_for_this_type(question=self, **kwargs)
return test_case
diff --git a/yaksh/settings.py b/yaksh/settings.py
index aaf6226..f8baa2c 100644
--- a/yaksh/settings.py
+++ b/yaksh/settings.py
@@ -20,12 +20,12 @@ SERVER_TIMEOUT = 2
URL_ROOT = ''
code_evaluators = {
- "python": {"standardtestcase": "yaksh.python_assertion_evaluator.PythonAssertionEvaluator",
- "stdoutbasedtestcase": "yaksh.python_stdout_evaluator.PythonStdoutEvaluator"
+ "python": {"standardtestcase": "python_assertion_evaluator.PythonAssertionEvaluator",
+ "stdoutbasedtestcase": "python_stdout_evaluator.PythonStdoutEvaluator"
},
- "c": {"standardtestcase": "yaksh.cpp_code_evaluator.CppCodeEvaluator"},
- "cpp": {"standardtestcase": "yaksh.cpp_code_evaluator.CppCodeEvaluator"},
- "java": {"standardtestcase": "yaksh.java_code_evaluator.JavaCodeEvaluator"},
- "bash": {"standardtestcase": "yaksh.bash_code_evaluator.BashCodeEvaluator"},
- "scilab": {"standardtestcase": "yaksh.scilab_code_evaluator.ScilabCodeEvaluator"},
+ "c": {"standardtestcase": "cpp_code_evaluator.CppCodeEvaluator"},
+ "cpp": {"standardtestcase": "cpp_code_evaluator.CppCodeEvaluator"},
+ "java": {"standardtestcase": "java_code_evaluator.JavaCodeEvaluator"},
+ "bash": {"standardtestcase": "bash_code_evaluator.BashCodeEvaluator"},
+ "scilab": {"standardtestcase": "scilab_code_evaluator.ScilabCodeEvaluator"},
}
diff --git a/yaksh/templates/yaksh/question.html b/yaksh/templates/yaksh/question.html
index e542fe9..8a67818 100644
--- a/yaksh/templates/yaksh/question.html
+++ b/yaksh/templates/yaksh/question.html
@@ -165,8 +165,14 @@ function call_skip(url)
<input type=hidden name="question_id" id="question_id" value={{ question.id }}></input>
{% if question.type == "mcq" %}
- {% for option in question.options.strip.splitlines %}
- <input name="answer" type="radio" value="{{option}}" />{{option}} <br/>
+ {% for test_case in test_cases %}
+ <input name="answer" type="radio" value="{{ test_case.options }}" />{{ test_case.options }} <br/>
+ {% endfor %}
+ {% endif %}
+ {% if question.type == "mcc" %}
+ {% for test_case in test_cases %}
+ <input name="answer" type="checkbox" value="{{ test_case.options }}"> {{ test_case.options }}
+ <br>
{% endfor %}
{% endif %}
{% if question.type == "upload" %}
@@ -174,12 +180,6 @@ function call_skip(url)
<input type=file id="assignment" name="assignment">
<hr>
{% endif %}
- {% if question.type == "mcc" %}
- {% for option in question.options.strip.splitlines %}
- <input name="answer" type="checkbox" value="{{ option }}"> {{ option }}
- <br>
- {% endfor %}
- {% endif %}
{% if question.type == "code" %}
<h3>Program:</h3>
<textarea rows="1" class="bash" readonly="yes" name="snippet" id="snippet" wrap="off" >{% if last_attempt %}{{ question.snippet }}{% else %}{% if question.type == "bash" %} #!/bin/bash&#13;&#10;{{ question.snippet }}{% else %}{{ question.snippet }}{% endif %}{% endif %}</textarea>
@@ -204,7 +204,7 @@ function call_skip(url)
{% endif %}
</form>
</div>
-
+
<!-- Modal -->
<div class="modal fade " id="upload_alert" >
<div class="modal-dialog">
diff --git a/yaksh/urls.py b/yaksh/urls.py
index 85d7fd1..6a33888 100644
--- a/yaksh/urls.py
+++ b/yaksh/urls.py
@@ -41,7 +41,7 @@ urlpatterns += [
url(r'^self_enroll/(?P<course_id>\d+)/$', views.self_enroll),
url(r'^manage/$', views.prof_manage),
url(r'^manage/addquestion/$', views.add_question),
- url(r'^manage/addquestion/(?P<question_id>\d+)/$', views.add_question),
+ url(r'^manage/addquestion/(?P<question_id>\d+)/$', views.edit_question),
url(r'^manage/addquiz/$', views.add_quiz),
url(r'^manage/addquiz/(?P<quiz_id>\d+)/$', views.edit_quiz),
url(r'^manage/gradeuser/$', views.grade_user),
diff --git a/yaksh/views.py b/yaksh/views.py
index e478cfe..9492166 100644
--- a/yaksh/views.py
+++ b/yaksh/views.py
@@ -565,7 +565,9 @@ def show_question(request, question, paper, error_message=None):
if paper.time_left() <= 0:
reason='Your time is up!'
return complete(request, reason, paper.attempt_number, paper.question_paper.id)
- context = {'question': question, 'paper': paper, 'error_message': error_message}
+ test_cases = question.get_test_cases()
+ context = {'question': question, 'paper': paper, 'error_message': error_message,
+ 'test_cases': test_cases}
answers = paper.get_previous_answers(question)
if answers:
context['last_attempt'] = answers[0]
@@ -666,6 +668,36 @@ def check(request, q_id, attempt_num=None, questionpaper_id=None):
return show_question(request, question, paper)
+# def validate_answer(user, user_answer, question, json_data=None):
+# """
+# Checks whether the answer submitted by the user is right or wrong.
+# If right then returns correct = True, success and
+# message = Correct answer.
+# success is True for MCQ's and multiple correct choices because
+# only one attempt are allowed for them.
+# For code questions success is True only if the answer is correct.
+# """
+
+# result = {'success': True, 'error': 'Incorrect answer'}
+# correct = False
+
+# if user_answer is not None:
+# if question.type == 'mcq':
+# if user_answer.strip() == question.test.strip():
+# correct = True
+# elif question.type == 'mcc':
+# answers = set(question.test.splitlines())
+# if set(user_answer) == answers:
+# correct = True
+# elif question.type == 'code':
+# user_dir = get_user_dir(user)
+# json_result = code_server.run_code(question.language, question.test_case_type, json_data, user_dir)
+# result = json.loads(json_result)
+# if result.get('success'):
+# correct = True
+
+# return correct, result
+
def validate_answer(user, user_answer, question, json_data=None):
"""
Checks whether the answer submitted by the user is right or wrong.
@@ -681,11 +713,15 @@ def validate_answer(user, user_answer, question, json_data=None):
if user_answer is not None:
if question.type == 'mcq':
- if user_answer.strip() == question.test.strip():
+ expected_answer = question.get_test_case(correct=True).options
+ if user_answer.strip() == expected_answer.strip():
correct = True
elif question.type == 'mcc':
- answers = set(question.test.splitlines())
- if set(user_answer) == answers:
+ expected_answers = []
+ for opt in question.get_test_cases(correct=True):
+ expected_answers.append(opt.options)
+ # answers = set(question.test.splitlines())
+ if set(user_answer) == set(expected_answers):
correct = True
elif question.type == 'code':
user_dir = get_user_dir(user)