From a8fedb7ff3e9480c8230344b3844888f38c1dded Mon Sep 17 00:00:00 2001
From: Andreas Ellewsen <ae@uio.no>
Date: Mon, 22 Nov 2021 16:52:29 +0100
Subject: [PATCH] Simplify Ou View

Separates the queryset and the serialization from each other.
---
 frontend/src/hooks/useOus/index.tsx         |  4 ++--
 greg/api/serializers/organizational_unit.py | 12 +++++++++-
 gregui/api/urls.py                          |  2 ++
 gregui/api/views/ou.py                      | 25 +++++++--------------
 gregui/urls.py                              |  2 --
 5 files changed, 23 insertions(+), 22 deletions(-)

diff --git a/frontend/src/hooks/useOus/index.tsx b/frontend/src/hooks/useOus/index.tsx
index 01459176..b8073e4e 100644
--- a/frontend/src/hooks/useOus/index.tsx
+++ b/frontend/src/hooks/useOus/index.tsx
@@ -9,10 +9,10 @@ type OuData = {
 function useOus(): OuData[] {
   const [ous, setOus] = useState<OuData[]>([])
   const getOptions = async () => {
-    const response = await fetch('/api/ui/v1/ous/?format=json')
+    const response = await fetch('/api/ui/v1/ous?format=json')
     if (response.ok) {
       const ousJson = await response.json()
-      setOus(ousJson.ous)
+      setOus(ousJson)
     }
   }
 
diff --git a/greg/api/serializers/organizational_unit.py b/greg/api/serializers/organizational_unit.py
index 95258a10..1053f79b 100644
--- a/greg/api/serializers/organizational_unit.py
+++ b/greg/api/serializers/organizational_unit.py
@@ -1,4 +1,5 @@
-from rest_framework.serializers import ModelSerializer
+from rest_framework.serializers import ModelSerializer, CharField
+
 from greg.api.serializers.ouidentifier import OuIdentifierSerializer
 
 from greg.models import OrganizationalUnit
@@ -20,3 +21,12 @@ class OrganizationalUnitSerializer(ModelSerializer):
             "parent",
             "identifiers",
         ]
+
+
+class SponsorOrgUnitsSerializer(ModelSerializer):
+    nb = CharField(source="name_nb")
+    en = CharField(source="name_en")
+
+    class Meta:
+        model = OrganizationalUnit
+        fields = ["id", "nb", "en"]
diff --git a/gregui/api/urls.py b/gregui/api/urls.py
index aaa40487..b318d9ae 100644
--- a/gregui/api/urls.py
+++ b/gregui/api/urls.py
@@ -8,6 +8,7 @@ from gregui.api.views.invitation import (
     InvitationView,
     InvitedGuestView,
 )
+from gregui.api.views.ou import OusViewSet
 from gregui.api.views.person import PersonSearchView, PersonView
 from gregui.api.views.role import RoleInfoViewSet
 from gregui.api.views.roletypes import RoleTypeViewSet
@@ -16,6 +17,7 @@ from gregui.api.views.unit import UnitsViewSet
 router = DefaultRouter(trailing_slash=False)
 router.register(r"role", RoleInfoViewSet, basename="role")
 router.register(r"identity", IdentityViewSet, basename="identity")
+router.register(r"ous", OusViewSet, basename="ou")
 
 urlpatterns = router.urls
 urlpatterns += [
diff --git a/gregui/api/views/ou.py b/gregui/api/views/ou.py
index 4dc2065e..362f2211 100644
--- a/gregui/api/views/ou.py
+++ b/gregui/api/views/ou.py
@@ -1,29 +1,20 @@
-from django.http import JsonResponse
+from rest_framework import mixins
 from rest_framework.authentication import SessionAuthentication, BasicAuthentication
 from rest_framework.permissions import IsAuthenticated
-from rest_framework.views import APIView
+from rest_framework.viewsets import GenericViewSet
+from greg.api.serializers.organizational_unit import SponsorOrgUnitsSerializer
 
-from greg.models import Sponsor
 from greg.permissions import IsSponsor
 from gregui.models import GregUserProfile
 
 
-class OusView(APIView):
+class OusViewSet(mixins.ListModelMixin, GenericViewSet):
     """Fetch Ous related to the authenticated sponsor."""
 
     authentication_classes = [SessionAuthentication, BasicAuthentication]
     permission_classes = [IsAuthenticated, IsSponsor]
+    serializer_class = SponsorOrgUnitsSerializer
 
-    @staticmethod
-    # pylint: disable=W0622
-    def get(request, format=None):
-        profile = GregUserProfile.objects.get(user=request.user)
-        sponsor = Sponsor.objects.get(id=profile.sponsor.id)
-        return JsonResponse(
-            {
-                "ous": [
-                    {"id": i.id, "nb": i.name_nb, "en": i.name_en}
-                    for i in sponsor.units.all()
-                ]
-            }
-        )
+    def get_queryset(self):
+        sponsor = GregUserProfile.objects.get(user=self.request.user).sponsor
+        return sponsor.units.all()
diff --git a/gregui/urls.py b/gregui/urls.py
index cbdf2960..0c2f085b 100644
--- a/gregui/urls.py
+++ b/gregui/urls.py
@@ -5,7 +5,6 @@ from django.urls import path
 from django.urls.resolvers import URLResolver
 
 from gregui.api import urls as api_urls
-from gregui.api.views.ou import OusView
 from gregui.api.views.userinfo import UserInfoView
 from gregui.api.views.person import GuestInfoView
 from . import views
@@ -21,6 +20,5 @@ urlpatterns: List[URLResolver] = [
     path("api/ui/v1/testmail/", views.send_test_email, name="api-testmail"),
     path("api/ui/v1/whoami/", views.WhoAmIView.as_view(), name="api-whoami"),
     path("api/ui/v1/userinfo/", UserInfoView.as_view(), name="api-userinfo"),  # type: ignore
-    path("api/ui/v1/ous/", OusView.as_view()),
     path("api/ui/v1/guests/", GuestInfoView.as_view()),
 ]
-- 
GitLab