diff options
-rw-r--r-- | CHANGELOG.txt | 15 | ||||
-rw-r--r-- | yaksh/bash_code_evaluator.py | 11 | ||||
-rw-r--r-- | yaksh/models.py | 17 |
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): |