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