move rounding to final_result
[edumed.git] / wtem / models.py
index 390687f..2b093ae 100644 (file)
@@ -79,6 +79,7 @@ class Submission(models.Model):
     email = models.EmailField(max_length=100, unique=True)
     answers = models.CharField(max_length=65536, null=True, blank=True)
     key_sent = models.BooleanField(default=False)
+    opened_link = models.BooleanField(default=False)
     marks = JSONField(default={})
     examiners = models.ManyToManyField(User, null=True, blank=True)
     end_time = models.CharField(max_length=5, null=True, blank=True)
@@ -164,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):
@@ -219,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):
@@ -278,6 +295,9 @@ class Confirmation(models.Model):
     def readable_contact(self):
         return '%s <%s>' % (self.contact.body.get('przewodniczacy'), self.contact.contact)
 
+    def school_phone(self):
+        return '%s, tel. %s' % (self.contact.body.get('school'), self.contact.body.get('school_phone'))
+
     def age(self):
         return timezone.now() - self.contact.created_at