104 lines
3.3 KiB
Python
104 lines
3.3 KiB
Python
"""
|
|
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
|