Skip to content

Commit bef2a70

Browse files
committed
feat: add models to handle storing course tutor info
1 parent e39741d commit bef2a70

4 files changed

Lines changed: 56 additions & 4 deletions

File tree

hknweb/tutoring/admin.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,12 @@
11
from django.contrib import admin
22

3-
from hknweb.tutoring.models import Room, TutoringLogistics, Slot
3+
from hknweb.tutoring.models import Tutor, Room, TutoringLogistics, Slot
4+
5+
6+
@admin.register(Tutor)
7+
class TutorAdmin(admin.ModelAdmin):
8+
search_fields = ("user__username", "user__first_name", "user__last_name", "user__email")
9+
autocomplete_fields = ('user',)
410

511

612
@admin.register(TutoringLogistics)

hknweb/tutoring/apps.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@
33

44
class TutoringConfig(AppConfig):
55
name = "hknweb.tutoring"
6+
7+
def ready(self):
8+
from . import signals

hknweb/tutoring/models.py

Lines changed: 30 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,35 @@
66
from django.db.models import Value
77
from django.db.models.functions import Concat
88
from django.contrib.auth.models import User
9+
from django.core.exceptions import ValidationError
910

11+
from hknweb import settings
1012
from 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

1340
class 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))

hknweb/tutoring/signals.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
from django.db.models.signals import m2m_changed
2+
from django.dispatch import receiver
3+
4+
from hknweb import settings
5+
from hknweb.models import Committeeship, User
6+
from hknweb.tutoring.models import Tutor
7+
8+
9+
@receiver(m2m_changed, sender=Committeeship.committee_members.through)
10+
def deleteTutorIfRemovedFromCommittee(sender, instance, action, pk_set, **_):
11+
if action == "post_remove":
12+
Tutor.objects.filter(user__pk__in=pk_set).exclude(
13+
user__pk__in=User.objects.filter(
14+
pk__in=pk_set, cmembership__committee=settings.TUTORING_GROUP
15+
).values_list("pk", flat=True)
16+
).delete()

0 commit comments

Comments
 (0)