66from django .db .models import Value
77from django .db .models .functions import Concat
88from django .contrib .auth .models import User
9+ from django .core .exceptions import ValidationError
910
11+ from hknweb import settings
1012from hknweb .coursesemester .models import Semester
13+ from hknweb .models import Course
14+
15+
16+ class Tutor (models .Model ):
17+ user = models .OneToOneField (
18+ User , on_delete = models .CASCADE , related_name = "tutoring_info"
19+ )
20+ completed_courses = models .ManyToManyField (
21+ Course , blank = True , related_name = "completed_tutors"
22+ )
23+ in_progress_courses = models .ManyToManyField (
24+ Course , blank = True , related_name = "in_progress_tutors"
25+ )
26+ preferred_courses = models .ManyToManyField (
27+ Course , blank = True , related_name = "preferred_tutors"
28+ )
29+
30+ def save (self , * args , ** kwargs ):
31+ if not self .user .cmemberships .filter (
32+ committee = settings .TUTORING_GROUP
33+ ).exists ():
34+ raise ValidationError (
35+ f"User { self .user .username } is not in the tutoring committee."
36+ )
37+ super ().save (* args , ** kwargs )
1138
1239
1340class Room (models .Model ):
@@ -26,10 +53,10 @@ class Meta:
2653 Semester , on_delete = models .CASCADE , null = True , default = None
2754 )
2855 one_hour_tutors = models .ManyToManyField (
29- User , blank = True , related_name = "one_hour_tutoring"
56+ Tutor , blank = True , related_name = "one_hour_tutoring"
3057 )
3158 two_hour_tutors = models .ManyToManyField (
32- User , blank = True , related_name = "two_hour_tutoring"
59+ Tutor , blank = True , related_name = "two_hour_tutoring"
3360 )
3461
3562 def __str__ (self ) -> str : # pragma: no cover
@@ -50,7 +77,7 @@ class Slot(models.Model):
5077 )
5178 room = models .ForeignKey (Room , on_delete = models .CASCADE , null = True , default = None )
5279 num_tutors = models .IntegerField (default = 0 )
53- tutors = models .ManyToManyField (User , blank = True , related_name = "tutoring_slots" )
80+ tutors = models .ManyToManyField (Tutor , blank = True , related_name = "tutoring_slots" )
5481
5582 WEEKDAY_STRS = "Mon Tue Wed Thu Fri Sat Sun" .split ()
5683 WEEKDAY_CHOICES = list (zip (range (len (WEEKDAY_STRS )), WEEKDAY_STRS ))
0 commit comments