summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.txt15
-rw-r--r--yaksh/bash_code_evaluator.py11
-rw-r--r--yaksh/models.py17
3 files changed, 36 insertions, 7 deletions
diff --git a/CHANGELOG.txt b/CHANGELOG.txt
index 6812c34..ab9e4b2 100644
--- a/CHANGELOG.txt
+++ b/CHANGELOG.txt
@@ -1,3 +1,18 @@
+=== 0.7.0 (Tentatively 23-10-2017) ===
+
+* Simplified Standard I/O type question error output.
+* Added the facility to search questions using tags.
+* Added the facility to search for user profiles on admin site.
+* Replaced json format with yaml format for downloading and uploading questions.
+* Fixed a bug that returned multiple answerpaper objects for a user.
+* Fixed a bug that allowed anonymous users access quit exam page.
+* Fixed a bug that prevented moderators from changing passwords.
+* Fixed a bug that returned nonetype object as the last attempted answer.
+* Updated the validation of MCQ/MCC type question.
+* Fixed a bug that did not allow expected input in Standard I/O type question to be none.
+* UI changes in grade user, view answerpaper and monitor pages.
+* Fixed a bug that would require shebang to be put in for Bash assertion based questions.
+
=== 0.6.0 (11-05-2017) ===
* Added a course code field that can be used to search a course.
diff --git a/yaksh/bash_code_evaluator.py b/yaksh/bash_code_evaluator.py
index a4f1389..288a744 100644
--- a/yaksh/bash_code_evaluator.py
+++ b/yaksh/bash_code_evaluator.py
@@ -77,7 +77,8 @@ class BashCodeEvaluator(BaseEvaluator):
if self.test_case_args:
self.tc_args_path = self.create_submit_code_file('main.args')
self.write_to_submit_code_file(self.tc_args_path, self.test_case_args)
- self.user_answer = self.user_answer.replace("\r", "")
+ shebang = "#!/bin/bash\n"
+ self.user_answer = shebang + self.user_answer.replace("\r", "")
self.test_case = self.test_case.replace("\r", "")
self.write_to_submit_code_file(self.submit_code_path, self.user_answer)
self.write_to_submit_code_file(self.test_code_path, self.test_case)
@@ -99,13 +100,13 @@ class BashCodeEvaluator(BaseEvaluator):
return False, msg, 0.0
if not clean_test_case_path:
- ret = self._run_command(clean_ref_code_path,
+ ret = self._run_command(["bash", clean_ref_code_path],
stdin=None,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
)
proc, inst_stdout, inst_stderr = ret
- ret = self._run_command(self.submit_code_path,
+ ret = self._run_command(["bash", self.submit_code_path],
stdin=None,
stdout=subprocess.PIPE,
stderr=subprocess.PIPE
@@ -136,7 +137,7 @@ class BashCodeEvaluator(BaseEvaluator):
for tc in test_cases:
loop_count += 1
if valid_answer:
- args = [clean_ref_code_path] + \
+ args = ["bash", clean_ref_code_path] + \
[x for x in tc.split()]
ret = self._run_command(args,
stdin=None,
@@ -146,7 +147,7 @@ class BashCodeEvaluator(BaseEvaluator):
proc, inst_stdout, inst_stderr = ret
if self.file_paths:
self.files = copy_files(self.file_paths)
- args = [self.submit_code_path] + \
+ args = ["bash", self.submit_code_path] + \
[x for x in tc.split()]
ret = self._run_command(args,
stdin=None,
diff --git a/yaksh/models.py b/yaksh/models.py
index ff326d3..d02b6d6 100644
--- a/yaksh/models.py
+++ b/yaksh/models.py
@@ -506,8 +506,20 @@ class Question(models.Model):
tmp_file_path = tempfile.mkdtemp()
yaml_path = os.path.join(tmp_file_path, "questions_dump.yaml")
for elem in q_dict:
- sorted_dict = CommentedMap(sorted(elem.items(), key=lambda x:x[0]))
- yaml_block = dict_to_yaml(sorted_dict)
+ relevant_dict = CommentedMap()
+ irrelevant_dict = CommentedMap()
+ relevant_dict['summary'] = elem.pop('summary')
+ relevant_dict['type'] = elem.pop('type')
+ relevant_dict['language'] = elem.pop('language')
+ relevant_dict['description'] = elem.pop('description')
+ relevant_dict['points'] = elem.pop('points')
+ relevant_dict['testcase'] = elem.pop('testcase')
+ relevant_dict.update(CommentedMap(sorted(elem.items(),
+ key=lambda x:x[0]
+ ))
+ )
+
+ yaml_block = dict_to_yaml(relevant_dict)
with open(yaml_path, "a") as yaml_file:
yaml_file.write(yaml_block)
zip_file.write(yaml_path, os.path.basename(yaml_path))
@@ -1097,6 +1109,7 @@ class AnswerPaperManager(models.Manager):
def get_users_for_questionpaper(self, questionpaper_id):
return self._get_answerpapers_for_quiz(questionpaper_id, status=True)\
.values("user__id", "user__first_name", "user__last_name")\
+ .order_by("user__first_name")\
.distinct()
def get_user_all_attempts(self, questionpaper, user):