diff --git a/greg/api/serializers/role.py b/greg/api/serializers/role.py index 56b8856243ebb9b697c0f7f956275d40739a2d91..31b2a43f187644fd83675982c5738567a3eea0ea 100644 --- a/greg/api/serializers/role.py +++ b/greg/api/serializers/role.py @@ -1,5 +1,7 @@ from rest_framework import serializers +from rest_framework.fields import IntegerField +from greg.api.serializers.organizational_unit import OrganizationalUnitSerializer from greg.models import Role, RoleType @@ -7,6 +9,7 @@ class RoleSerializer(serializers.ModelSerializer): type = serializers.SlugRelatedField( queryset=RoleType.objects.all(), slug_field="identifier" ) + orgunit = OrganizationalUnitSerializer() class Meta: model = Role @@ -20,3 +23,13 @@ class RoleSerializer(serializers.ModelSerializer): "updated", "type", ] + + +class RoleWriteSerializer(RoleSerializer): + """ + Serializer for use with GET. + + When doing GET we want the complete orgunit object, not just the id. + """ + + orgunit = IntegerField(source="orgunit_id") # type: ignore diff --git a/greg/api/views/person.py b/greg/api/views/person.py index d5bed74610ea16fa32e2ba15a4f88b99c040370b..3214b41504d1023b9160fc29283233424f70081a 100644 --- a/greg/api/views/person.py +++ b/greg/api/views/person.py @@ -8,9 +8,9 @@ from greg.api.filters import PersonFilter, RoleFilter, IdentityFilter from greg.api.pagination import PrimaryKeyCursorPagination from greg.api.serializers.person import ( PersonSerializer, - RoleSerializer, IdentitySerializer, ) +from greg.api.serializers.role import RoleSerializer, RoleWriteSerializer from greg.models import Person, Role, Identity @@ -49,12 +49,21 @@ class RoleViewSet(viewsets.ModelViewSet): """Person role API""" queryset = Role.objects.all().order_by("id") - serializer_class = RoleSerializer pagination_class = PrimaryKeyCursorPagination filter_backends = (filters.DjangoFilterBackend,) filterset_class = RoleFilter lookup_field = "id" + def get_serializer_class(self): + """ + Fetch different serializer depending on http method. + + To return the complete orgunit object for GET we use a different serializer. + """ + if self.request.method in ("POST", "PATCH"): + return RoleWriteSerializer + return RoleSerializer + def get_queryset(self): qs = self.queryset if not self.kwargs: