bef8b7c3a992b606689a4d426261bb871611f28e
[edumed.git] / wtem / models.py
1 import random
2 import string
3
4 from django.db import models
5 from django.contrib.auth.models import User
6 from django.core.exceptions import ValidationError
7 from django.utils.translation import ugettext as _
8 from jsonfield import JSONField
9
10 from contact.models import Contact
11
12
13 DEBUG_KEY = '12345'
14
15 class Submission(models.Model):
16     contact = models.ForeignKey(Contact, null = True)
17     key = models.CharField(max_length = 30, unique = True)
18     first_name = models.CharField(max_length = 100)
19     last_name = models.CharField(max_length = 100)
20     email = models.EmailField(max_length = 100, unique = True)
21     answers = models.CharField(max_length = 65536, null = True, blank = True)
22     key_sent = models.BooleanField(default = False)
23     marks = JSONField()
24
25     def __unicode__(self):
26         return ', '.join((self.last_name, self.first_name, self.email))
27
28     @classmethod
29     def generate_key(cls):
30         key = ''
31         while not key or key in [record['key'] for record in cls.objects.values('key')]:
32             key = ''.join(random.choice(string.ascii_uppercase + string.ascii_lowercase + string.digits) for i in range(30))
33         return key
34
35     @classmethod
36     def create(cls, first_name, last_name, email, key = None, contact = None):
37         submission = cls(
38             contact = contact,
39             key = key if key else Submission.generate_key(),
40             first_name = first_name,
41             last_name = last_name,
42             email = email
43         )
44
45         submission.save()
46         return submission
47
48     def get_mark(self, user_id, exercise_id):
49         mark = None
50         user_id = str(user_id)
51         exercise_id = str(exercise_id)
52         if self.marks and user_id in self.marks:
53             mark = self.marks[user_id].get(exercise_id, None)
54         return mark
55
56     def set_mark(self, user_id, exercise_id, mark):
57         user_id = str(user_id)
58         exercise_id = str(exercise_id)
59         if not self.marks:
60             self.marks = dict()
61         
62         self.marks.setdefault(user_id, {})[exercise_id] = mark
63         if mark == 'None':
64             del self.marks[user_id][exercise_id]
65
66
67 class Attachment(models.Model):
68     submission = models.ForeignKey(Submission)
69     exercise_id = models.IntegerField()
70     file = models.FileField(upload_to = 'wtem/attachment')
71
72
73 class Assignment(models.Model):
74     user = models.ForeignKey(User, unique = True)
75     exercises = JSONField()
76
77     def clean(self):
78         if not isinstance(self.exercises, list):
79             raise ValidationError(_('Assigned exercises must be declared in a list format'))
80         for exercise in self.exercises:
81             if not isinstance(exercise, int) or exercise < 1:
82                 raise ValidationError(_('Invalid exercise id: %s' % exercise))
83
84     def __unicode__(self):
85         return self.user.username + ': ' + ','.join(map(str,self.exercises))