roosterwijs/backend/core/serializers.py

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()