From 120f6cf55e29d931420df2ce1f63d933f1d6a612 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Aleksander=20=C5=81ukasz?= Date: Wed, 13 Nov 2013 16:02:03 +0100 Subject: [PATCH] Calculate points for automatically checked questions --- wtem/models.py | 44 ++++++++++++++++++++++++++-- wtem/templates/wtem/admin_report.csv | 2 +- wtem/templatetags/wtem_csv.py | 4 ++- 3 files changed, 46 insertions(+), 4 deletions(-) diff --git a/wtem/models.py b/wtem/models.py index 56c814c..e29b1bc 100644 --- a/wtem/models.py +++ b/wtem/models.py @@ -87,7 +87,44 @@ class Submission(models.Model): 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: + if int(item_id) == exercise['answer'][bucket_id]: # @@ We assume only one item per bucker for now... + 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 + 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 +132,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) diff --git a/wtem/templates/wtem/admin_report.csv b/wtem/templates/wtem/admin_report.csv index 0bdaf57..c6ef91f 100644 --- a/wtem/templates/wtem/admin_report.csv +++ b/wtem/templates/wtem/admin_report.csv @@ -1,2 +1,2 @@ {% load wtem_csv %}email,nazwisko,imie,suma{% for exercise_id in exercise_ids %}{% csv_header exercise_id submissionsSet %}{% endfor %}{% for submission in submissionsSet.submissions %} -{{submission.email}},{{submission.last_name}},{{submission.first_name}},{{submission.final_result}}{% for exercise_id in exercise_ids %},{% csv_row_fragment exercise_id submission submissionsSet %}{% endfor %}{% endfor %} \ No newline at end of file +{{submission.email}},{{submission.last_name}},{{submission.first_name}},{{submission.final_result_as_string}}{% for exercise_id in exercise_ids %},{% csv_row_fragment exercise_id submission submissionsSet %}{% endfor %}{% endfor %} \ No newline at end of file diff --git a/wtem/templatetags/wtem_csv.py b/wtem/templatetags/wtem_csv.py index be3a905..590767c 100644 --- a/wtem/templatetags/wtem_csv.py +++ b/wtem/templatetags/wtem_csv.py @@ -15,7 +15,9 @@ def csv_header(exercise_id, submissionSet): @register.simple_tag def csv_row_fragment(exercise_id, submission, submissionSet): final_mark = submission.get_final_exercise_mark(exercise_id) - toret = str(final_mark) if isinstance(final_mark, int) else '-' + if final_mark is not None: + final_mark = ('%.2f' % final_mark).rstrip('0').rstrip('.') + toret = final_mark if final_mark else '-' examiners = submissionSet.examiners_by_exercise.get(exercise_id, []) marks_by_examiner = submission.get_exercise_marks_by_examiner(exercise_id) for examiner in examiners: -- 2.20.1