""" Kerndomein van Roosterwijs (Fase 1). Bewust klein gehouden, met veel flexibiliteit voor het speciaal onderwijs: - één Persoon-tabel met een rol (leerling, leerkracht, ondersteuner); - leerlingen horen bij een groep; - subgroepen zijn vrije, groep-overstijgende verzamelingen leerlingen. Roosterblokken, tijdslots en de kalender volgen in Fase 2. """ from django.db import models class Rol(models.TextChoices): LEERLING = "leerling", "Leerling" LEERKRACHT = "leerkracht", "Leerkracht" PRAKTIJKONDERSTEUNER = "praktijkondersteuner", "Praktijkondersteuner" KLASSENONDERSTEUNER = "klassenondersteuner", "Klassenondersteuner" class Groep(models.Model): """Een klas/groep waar leerlingen bij horen.""" naam = models.CharField("naam", max_length=100, unique=True) omschrijving = models.CharField("omschrijving", max_length=255, blank=True) actief = models.BooleanField("actief", default=True) aangemaakt_op = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = "groep" verbose_name_plural = "groepen" ordering = ["naam"] def __str__(self) -> str: return self.naam class Persoon(models.Model): """Leerling, leerkracht of ondersteuner - een tabel met een rol.""" voornaam = models.CharField("voornaam", max_length=80) achternaam = models.CharField("achternaam", max_length=120) rol = models.CharField("rol", max_length=32, choices=Rol.choices) groep = models.ForeignKey( Groep, verbose_name="groep", on_delete=models.SET_NULL, null=True, blank=True, related_name="leerlingen", help_text="Alleen van toepassing op leerlingen.", ) actief = models.BooleanField("actief", default=True) opmerkingen = models.TextField("opmerkingen", blank=True) aangemaakt_op = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = "persoon" verbose_name_plural = "personen" ordering = ["achternaam", "voornaam"] def __str__(self) -> str: return f"{self.volledige_naam} ({self.get_rol_display()})" @property def volledige_naam(self) -> str: return f"{self.voornaam} {self.achternaam}".strip() @property def is_leerling(self) -> bool: return self.rol == Rol.LEERLING def save(self, *args, **kwargs): # Een groepskoppeling hoort alleen bij leerlingen. if self.rol != Rol.LEERLING: self.groep = None super().save(*args, **kwargs) class Subgroep(models.Model): """Een vrije, groep-overstijgende verzameling leerlingen. Bijvoorbeeld een niveaugroepje rekenen met leerlingen uit meerdere groepen. """ naam = models.CharField("naam", max_length=100) omschrijving = models.CharField("omschrijving", max_length=255, blank=True) leden = models.ManyToManyField( Persoon, verbose_name="leden", related_name="subgroepen", blank=True, limit_choices_to={"rol": Rol.LEERLING}, ) actief = models.BooleanField("actief", default=True) aangemaakt_op = models.DateTimeField(auto_now_add=True) class Meta: verbose_name = "subgroep" verbose_name_plural = "subgroepen" ordering = ["naam"] def __str__(self) -> str: return self.naam