From e39f65706e339be6f37c5f96fbc7cbcdb0b090e6 Mon Sep 17 00:00:00 2001 From: bes-r <27369668+bes-r@users.noreply.github.com> Date: Fri, 12 Jun 2026 23:40:19 +0200 Subject: [PATCH] =?UTF-8?q?Gebruikersmodule=20(rollen=20+=20persoonskoppel?= =?UTF-8?q?ing),=20blok=20bewerken/kopi=C3=ABren=20in=20Roostermaker,=20pr?= =?UTF-8?q?intopties=20per=20klas/leerplein/leerling/personeel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ROADMAP.md | 12 ++++++++++++ backend/core/models.py | 16 ++++++++++++++++ backend/core/serializers.py | 19 +++++++++++++++---- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/ROADMAP.md b/ROADMAP.md index 15a582a..37ca9f7 100644 --- a/ROADMAP.md +++ b/ROADMAP.md @@ -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.** diff --git a/backend/core/models.py b/backend/core/models.py index 3d3835e..ceba82d 100644 --- a/backend/core/models.py +++ b/backend/core/models.py @@ -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) diff --git a/backend/core/serializers.py b/backend/core/serializers.py index 6d77707..e2d60c4 100644 --- a/backend/core/serializers.py +++ b/backend/core/serializers.py @@ -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(