diff --git a/frontend/src/hooks/useOus/index.tsx b/frontend/src/hooks/useOus/index.tsx index 01459176acb55d3eeada3c9271b7ffc640d6b0b8..b8073e4e14c1263f6f5858712e41b1a72f433458 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 95258a1070bdb4324e0f5d1c288e03d8365794bf..1053f79bf934f59c4b6df11d1a2b4f8cd3ac3384 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 aaa40487cd74bcf78be456e59afb32578bab0abd..b318d9ae136aae5fc7e35d9d7e54a65dc373c2fb 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 4dc2065e072d845d708cd10e967aae23ebc78f76..362f2211d1a9eb073657644f50a9d797d28e7f9d 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 cbdf296086973b561b0cd1149c3ff44556a6639c..0c2f085bca00174ac661c1d3b2f1990378647ca8 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()), ]