Gebruikersmodule (rollen + persoonskoppeling), blok bewerken/kopiëren in Roostermaker, printopties per klas/leerplein/leerling/personeel

This commit is contained in:
bes-r 2026-06-12 23:40:19 +02:00
parent 87c1559553
commit e39f65706e
3 changed files with 43 additions and 4 deletions

View file

@ -48,6 +48,18 @@ volgt.
(de betreffende blokken vervallen voor die leerling).
- [ ] Stage instelbaar **per blok, per dagdeel of per dag**.
## Koppelingen & inzetregels
- [ ] **Personeel koppelen aan leerplein en subgroep** (nu alleen stamgroep
mogelijk in het personeelsformulier).
- [ ] **Theorievakken automatisch beschikbaar voor leerkrachten** (een leerkracht
mag altijd op een theorievak ingezet worden).
- [ ] **Inzetregel begeleider ↔ vak:** een leerkracht of praktijkondersteuner kan
alleen aan een vak/blok gekoppeld worden als hij/zij aan dat vak gekoppeld
is; een **klassenondersteuner kan overal** ingezet worden.
- [ ] **Hiërarchie vastleggen:** subgroepen verbonden aan groepen, en groepen aan
leerpleinen (subgroep → groep → leerplein).
## Module: Urenoverzicht
- [ ] **Module die berekent hoeveel uur een groep per vak krijgt.**

View file

@ -149,6 +149,15 @@ class Subgroep(models.Model):
naam = models.CharField("naam", max_length=100)
omschrijving = models.CharField("omschrijving", max_length=255, blank=True)
groep = models.ForeignKey(
Groep,
verbose_name="groep",
on_delete=models.SET_NULL,
null=True,
blank=True,
related_name="subgroepen",
help_text="De groep waar deze subgroep onder valt.",
)
leden = models.ManyToManyField(
Persoon,
verbose_name="leden",
@ -156,6 +165,13 @@ class Subgroep(models.Model):
blank=True,
limit_choices_to={"rol": Rol.LEERLING},
)
begeleiders = models.ManyToManyField(
Persoon,
verbose_name="begeleiders",
related_name="begeleide_subgroepen",
blank=True,
help_text="Medewerkers die aan deze subgroep gekoppeld zijn.",
)
actief = models.BooleanField("actief", default=True)
aangemaakt_op = models.DateTimeField(auto_now_add=True)

View file

@ -65,15 +65,26 @@ class PersoonSerializer(serializers.ModelSerializer):
data["vakken"] = []
return data
@staticmethod
def _met_theorievakken(gekozen):
"""Voeg de theorievakken toe aan de gekozen vakken (zonder dubbelen)."""
theorie = list(Activiteit.objects.filter(theorievak=True, actief=True))
ids = {v.id for v in gekozen}
return gekozen + [a for a in theorie if a.id not in ids]
def create(self, validated_data):
# Een leerkracht krijgt de theorievakken standaard direct gekoppeld.
if validated_data.get("rol") == "leerkracht":
theorie = list(Activiteit.objects.filter(theorievak=True, actief=True))
gekozen = validated_data.get("vakken", [])
ids = {v.id for v in gekozen}
validated_data["vakken"] = gekozen + [a for a in theorie if a.id not in ids]
validated_data["vakken"] = self._met_theorievakken(validated_data.get("vakken", []))
return super().create(validated_data)
def update(self, instance, validated_data):
# Ook bij bewerken houdt een leerkracht altijd de theorievakken.
rol = validated_data.get("rol", instance.rol)
if rol == "leerkracht" and "vakken" in validated_data:
validated_data["vakken"] = self._met_theorievakken(validated_data["vakken"])
return super().update(instance, validated_data)
class SubgroepSerializer(serializers.ModelSerializer):
leden = serializers.PrimaryKeyRelatedField(