roosterwijs/backend/core/models.py

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