From fea43f2191b3504aedfbeb17a1b23c2a39b9e23e Mon Sep 17 00:00:00 2001 From: Andreas Ellewsen <ae@uio.no> Date: Thu, 25 Nov 2021 09:44:54 +0100 Subject: [PATCH] Expand orgunit objects in api responses When sending a GET request to an endpoint with an orgunit field you now get the orgunit object instead of the id. Other http methods behave as before. Resolves: GREG-126 --- greg/api/serializers/role.py | 13 +++++++++++++ greg/api/views/person.py | 13 +++++++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/greg/api/serializers/role.py b/greg/api/serializers/role.py index 56b88562..31b2a43f 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 d5bed746..3214b415 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: -- GitLab