61 lines
1.9 KiB
Python
61 lines
1.9 KiB
Python
"""DRF-serializers voor het kerndomein."""
|
|
from rest_framework import serializers
|
|
|
|
from .models import Groep, Persoon, Subgroep
|
|
|
|
|
|
class GroepSerializer(serializers.ModelSerializer):
|
|
aantal_leerlingen = serializers.IntegerField(
|
|
source="leerlingen.count", read_only=True
|
|
)
|
|
|
|
class Meta:
|
|
model = Groep
|
|
fields = [
|
|
"id", "naam", "omschrijving", "actief",
|
|
"aantal_leerlingen", "aangemaakt_op",
|
|
]
|
|
read_only_fields = ["aangemaakt_op"]
|
|
|
|
|
|
class PersoonSerializer(serializers.ModelSerializer):
|
|
volledige_naam = serializers.CharField(read_only=True)
|
|
rol_label = serializers.CharField(source="get_rol_display", read_only=True)
|
|
groep_naam = serializers.CharField(
|
|
source="groep.naam", read_only=True, default=None
|
|
)
|
|
|
|
class Meta:
|
|
model = Persoon
|
|
fields = [
|
|
"id", "voornaam", "achternaam", "volledige_naam",
|
|
"rol", "rol_label", "groep", "groep_naam",
|
|
"actief", "opmerkingen", "aangemaakt_op",
|
|
]
|
|
read_only_fields = ["aangemaakt_op"]
|
|
|
|
|
|
class SubgroepSerializer(serializers.ModelSerializer):
|
|
# Lezen: namen tonen. Schrijven: lijst met leerling-id's.
|
|
leden = serializers.PrimaryKeyRelatedField(
|
|
many=True, queryset=Persoon.objects.filter(rol="leerling"), required=False
|
|
)
|
|
leden_namen = serializers.SerializerMethodField()
|
|
aantal_leden = serializers.SerializerMethodField()
|
|
|
|
class Meta:
|
|
model = Subgroep
|
|
fields = [
|
|
"id", "naam", "omschrijving", "actief",
|
|
"leden", "leden_namen", "aantal_leden", "aangemaakt_op",
|
|
]
|
|
read_only_fields = ["aangemaakt_op"]
|
|
|
|
def get_leden_namen(self, obj):
|
|
return [
|
|
{"id": p.id, "naam": p.volledige_naam}
|
|
for p in obj.leden.all()
|
|
]
|
|
|
|
def get_aantal_leden(self, obj):
|
|
return obj.leden.count()
|