X-Git-Url: https://git.mdrn.pl/edumed.git/blobdiff_plain/963ec6666865c661bb53519cce3f96b9c5fdd0a3..34511b8161f4fa25634a9659137a1143a1511c21:/wtem/models.py?ds=sidebyside diff --git a/wtem/models.py b/wtem/models.py index 56c814c..4c3d0ee 100644 --- a/wtem/models.py +++ b/wtem/models.py @@ -27,6 +27,7 @@ class Submission(models.Model): key_sent = models.BooleanField(default = False) marks = JSONField() examiners = models.ManyToManyField(User, null = True, blank = True) + end_time = models.CharField(max_length = 5, null = True, blank = True) def __unicode__(self): return ', '.join((self.last_name, self.first_name, self.email)) @@ -83,11 +84,56 @@ class Submission(models.Model): if exercise_checked_manually(exercise): marks_by_examiner = self.get_exercise_marks_by_examiner(exercise_id) if len(marks_by_examiner): - return max(map(int, marks_by_examiner.values())) + return sum(map(int, marks_by_examiner.values())) / float(len(marks_by_examiner)) else: return None else: - return 1 # TODO: actually calculate the result + if not self.answers: + return None + answer = simplejson.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: + toret = 0 + if exercise.get('answer_mode', None) == 'all_or_nothing': + toret = exercise['points'] if map(int, answer) == exercise['answer'] else 0 + else: + for id in map(int, answer): + if id in exercise['answer']: + toret += exercise['points_per_hit'] + return toret + if t == 'edumed_prawdafalsz': + toret = 0 + for idx, statement in enumerate(exercise['statements']): + 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 + raise NotImplementedError @property def final_result(self): @@ -95,9 +141,12 @@ class Submission(models.Model): for exercise_id in map(str,range(1, len(exercises) + 1)): mark = self.get_final_exercise_mark(exercise_id) if mark is not None: - final += int(mark) + final += mark return final + @property + def final_result_as_string(self): + return ('%.2f' % self.final_result).rstrip('0').rstrip('.') class Attachment(models.Model): submission = models.ForeignKey(Submission)