roosterwijs/backend/modules/leerplein/models.py

61 lines
2.1 KiB
Python

"""
Leerplein-module: een overkoepelende groepsstructuur.
- Een Leerplein bundelt meerdere groepen en/of subgroepen, en kan daarnaast
losse (individuele) leerlingen bevatten.
- Een SubgroepGroep-koppeling verbindt een subgroep met een groep.
De module raakt de kernmodellen niet aan; het zijn losse koppeltabellen die
alleen bestaan als de module geïnstalleerd is.
"""
from django.db import models
class Leerplein(models.Model):
naam = models.CharField("naam", max_length=100, unique=True)
omschrijving = models.CharField("omschrijving", max_length=255, blank=True)
actief = models.BooleanField("actief", default=True)
groepen = models.ManyToManyField(
"core.Groep", verbose_name="groepen", related_name="leerpleinen", blank=True
)
subgroepen = models.ManyToManyField(
"core.Subgroep", verbose_name="subgroepen", related_name="leerpleinen", blank=True
)
leerlingen = models.ManyToManyField(
"core.Persoon", verbose_name="losse leerlingen", related_name="leerpleinen",
blank=True, limit_choices_to={"rol": "leerling"},
)
aangemaakt_op = models.DateTimeField(auto_now_add=True)
class Meta:
verbose_name = "leerplein"
verbose_name_plural = "leerpleinen"
ordering = ["naam"]
def __str__(self) -> str:
return self.naam
class SubgroepGroep(models.Model):
"""Koppelt een subgroep aan een groep (subgroep hoort bij groep)."""
groep = models.ForeignKey(
"core.Groep", on_delete=models.CASCADE, related_name="subgroep_koppelingen"
)
subgroep = models.ForeignKey(
"core.Subgroep", on_delete=models.CASCADE, related_name="groep_koppelingen"
)
class Meta:
verbose_name = "subgroep-groep-koppeling"
verbose_name_plural = "subgroep-groep-koppelingen"
ordering = ["groep__naam", "subgroep__naam"]
constraints = [
models.UniqueConstraint(
fields=["groep", "subgroep"], name="uniek_groep_subgroep"
)
]
def __str__(self) -> str:
return f"{self.subgroep}{self.groep}"