X-Git-Url: https://git.mdrn.pl/edumed.git/blobdiff_plain/334d0b5148de69b0509e001631154aa3ec788d36..cbae43d3842076cf85fcc206e2ed13fce7d0c0a4:/wtem/models.py diff --git a/wtem/models.py b/wtem/models.py index ccbf67f..2b093ae 100644 --- a/wtem/models.py +++ b/wtem/models.py @@ -165,52 +165,68 @@ class Submission(models.Model): else: if not self.answers: return None - answer = json.loads(self.answers)[exercise_id]['closed_part'] - t = exercise['type'] - if t == 'edumed_uporzadkuj': - return exercise['points'] if map(int, answer) == exercise['answer'] else 0 - if t == 'edumed_przyporzadkuj': - toret = 0 - for bucket_id, items in answer.items(): - for item_id in items: - is_corect = False - if exercise.get('answer_mode', None) == 'possible_buckets_for_item': - is_correct = int(bucket_id) in exercise['answer'].get(item_id) - else: - is_correct = int(item_id) in exercise['answer'].get(bucket_id, []) - if is_correct: - toret += exercise['points_per_hit'] - return toret - if t == 'edumed_wybor': - if len(exercise['answer']) == 1: - if len(answer) and int(answer[0]) == exercise['answer'][0]: - return exercise['points'] - else: - return 0 - else: + answers = json.loads(self.answers) + if exercise_id not in answers: + return None + else: + answer = answers[exercise_id]['closed_part'] + t = exercise['type'] + if t == 'edumed_uporzadkuj': + return exercise['points'] if map(int, answer) == exercise['answer'] else 0 + elif t == 'edumed_przyporzadkuj': toret = 0 - if exercise.get('answer_mode', None) == 'all_or_nothing': - toret = exercise['points'] if map(int, answer) == exercise['answer'] else 0 - else: - for answer_id in map(int, answer): - if answer_id in exercise['answer']: + for bucket_id, items in answer.items(): + for item_id in items: + if exercise.get('answer_mode', None) == 'possible_buckets_for_item': + is_correct = int(bucket_id) in exercise['answer'].get(item_id) + else: + is_correct = int(item_id) in exercise['answer'].get(bucket_id, []) + if is_correct: toret += exercise['points_per_hit'] return toret - if t == 'edumed_prawdafalsz': - toret = 0 - for idx, statement in enumerate(exercise['statements']): - if statement[1] == 'ignore': - continue - if answer[idx] == 'true': - given = True - elif answer[idx] == 'false': - given = False + elif t == 'edumed_wybor': + if exercise.get('answer_mode', None) == 'multi': + if not answer: + return None + # return exercise['points'] if map(int, answer) == exercise['answer'] else 0 + correct = 0. + for i in xrange(1, len(exercise['options']) + 1): + if (str(i) in answer) == (i in exercise['answer']): + correct += 1 + points1 = exercise['points'] * correct/len(exercise['options']) + points2 = exercise['points'] if map(int, answer) == exercise['answer'] else 0 + return points1 + points2 + elif len(exercise['answer']) == 1: + if len(answer) and int(answer[0]) == exercise['answer'][0]: + return exercise['points'] + else: + return 0 else: - given = None - if given == statement[1]: - toret += exercise['points_per_hit'] - return toret - raise NotImplementedError + toret = 0 + if exercise.get('answer_mode', None) == 'all_or_nothing': + toret = exercise['points'] if map(int, answer) == exercise['answer'] else 0 + else: + # głupie i szkodliwe + for answer_id in map(int, answer): + if answer_id in exercise['answer']: + toret += exercise['points_per_hit'] + return toret + elif t == 'edumed_prawdafalsz': + toret = 0 + for idx, statement in enumerate(exercise['statements']): + if statement[1] == 'ignore': + continue + if answer[idx] == 'true': + given = True + elif answer[idx] == 'false': + given = False + else: + given = None + if given == statement[1]: + toret += exercise['points_per_hit'] + return toret + else: + raise NotImplementedError @property def final_result(self): @@ -220,7 +236,7 @@ class Submission(models.Model): mark = self.get_final_exercise_mark(exercise_id) if mark is not None: final += mark - return final + return round(final, 2) @property def final_result_as_string(self):