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