From 359fd8e1b8c444d98f0ec446187b16b365e946ba Mon Sep 17 00:00:00 2001
From: "J.-S. Caux" <J.S.Caux@uva.nl>
Date: Fri, 18 Jun 2021 05:59:59 +0200
Subject: [PATCH] Work on organizations API

---
 scipost_django/api/urls.py                   |  3 +-
 scipost_django/journals/api/serializers.py   |  2 ++
 scipost_django/organizations/api/urls.py     | 30 ------------------
 scipost_django/organizations/api/views.py    | 33 --------------------
 scipost_django/organizations/api/viewsets.py | 22 ++++++++++++-
 5 files changed, 24 insertions(+), 66 deletions(-)
 delete mode 100644 scipost_django/organizations/api/urls.py
 delete mode 100644 scipost_django/organizations/api/views.py

diff --git a/scipost_django/api/urls.py b/scipost_django/api/urls.py
index b3fbee159..5422a80a5 100644
--- a/scipost_django/api/urls.py
+++ b/scipost_django/api/urls.py
@@ -27,7 +27,7 @@ router.register('publications', PublicationViewSet)
 
 # organizations
 router.register('organizations', OrganizationViewSet)
-router.register('nap/organizations', OrganizationNAPViewSet)
+router.register('nap', OrganizationNAPViewSet)
 
 # submissions
 router.register('submissions', SubmissionViewSet)
@@ -49,6 +49,5 @@ urlpatterns += [
     ),
     path('finances/', include('finances.api.urls')),
     path('journals/', include('journals.api.urls')),
-    path('organizations/', include('organizations.api.urls')),
 
 ]
diff --git a/scipost_django/journals/api/serializers.py b/scipost_django/journals/api/serializers.py
index 1bf970d0d..69a9cc6b3 100644
--- a/scipost_django/journals/api/serializers.py
+++ b/scipost_django/journals/api/serializers.py
@@ -4,6 +4,7 @@ __license__ = "AGPL v3"
 
 from rest_framework import serializers
 
+from organizations.api.serializers import OrganizationSerializer
 from ..models import Publication, OrgPubFraction
 
 
@@ -54,6 +55,7 @@ class OrgPubFractionSerializer(serializers.ModelSerializer):
 
     Takes optional `fields` argument specifying which fields should be displayed.
     """
+    organization = OrganizationSerializer()
     publication = PublicationSerializer()
 
     class Meta:
diff --git a/scipost_django/organizations/api/urls.py b/scipost_django/organizations/api/urls.py
deleted file mode 100644
index 1b9442509..000000000
--- a/scipost_django/organizations/api/urls.py
+++ /dev/null
@@ -1,30 +0,0 @@
-copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
-__license__ = "AGPL v3"
-
-
-from django.urls import path
-
-from rest_framework import routers
-
-#from organizations.api import views as api_views
-from . import views as api_views
-from . import viewsets as api_viewsets
-
-
-router = routers.SimpleRouter()
-
-# OrganizationNAPViewSet before OrganizationViewSet, to prevent 404
-router.register('nap', api_viewsets.OrganizationNAPViewSet)
-router.register('', api_viewsets.OrganizationViewSet)
-
-
-urlpatterns = router.urls
-
-urlpatterns += [
-
-    path( # /api/organizations/<int:pk>/balance
-        '<int:pk>/balance',
-        api_views.OrganizationBalanceAPIView.as_view(),
-        name='organization-balance',
-    )
-]
diff --git a/scipost_django/organizations/api/views.py b/scipost_django/organizations/api/views.py
deleted file mode 100644
index 2dfc6d549..000000000
--- a/scipost_django/organizations/api/views.py
+++ /dev/null
@@ -1,33 +0,0 @@
-__copyright__ = "Copyright © Stichting SciPost (SciPost Foundation)"
-__license__ = "AGPL v3"
-
-
-from rest_framework.generics import ListAPIView, RetrieveAPIView
-from rest_framework.settings import api_settings
-from rest_framework_csv import renderers as r
-
-from ..models import Organization
-from .serializers import (
-    OrganizationSerializer,
-    OrganizationNAPSerializer,
-    OrganizationBalanceSerializer
-)
-from .viewsets import OrganizationFilterSet
-
-
-class OrganizationNAPListAPIView(ListAPIView):
-    queryset = Organization.objects.all()
-    serializer_class = OrganizationNAPSerializer
-    renderer_classes = tuple(api_settings.DEFAULT_RENDERER_CLASSES) + (r.PaginatedCSVRenderer, )
-    search_fields = ['name', 'name_original', 'acronym',]
-    filterset_class = OrganizationFilterSet
-    default_filtering_fields = [
-        'name__icontains',
-        'name_original__icontains',
-        'acronym__icontains'
-    ]
-
-
-class OrganizationBalanceAPIView(RetrieveAPIView):
-    queryset = Organization.objects.all()
-    serializer_class = OrganizationBalanceSerializer
diff --git a/scipost_django/organizations/api/viewsets.py b/scipost_django/organizations/api/viewsets.py
index 839e4ae98..ce2bb0a96 100644
--- a/scipost_django/organizations/api/viewsets.py
+++ b/scipost_django/organizations/api/viewsets.py
@@ -16,7 +16,12 @@ from rest_framework_csv import renderers as r
 from api.viewsets.mixins import FilteringOptionsActionMixin
 
 from ..models import Organization
-from .serializers import OrganizationSerializer, OrganizationNAPSerializer
+from journals.api.serializers import OrgPubFractionSerializer
+from .serializers import (
+    OrganizationSerializer,
+    OrganizationNAPSerializer,
+    OrganizationBalanceSerializer
+)
 
 
 class OrganizationFilterSet(df_filters.FilterSet):
@@ -45,6 +50,21 @@ class OrganizationViewSet(FilteringOptionsActionMixin,
         'acronym__icontains'
     ]
 
+    @action(detail=True)
+    def pubfractions(self, request, pk=None):
+        pubfractions = self.get_object().pubfractions.all()
+        serializer = OrgPubFractionSerializer(
+            pubfractions,
+            many=True,
+            context={'request': self.request}
+        )
+        return Response(serializer.data)
+
+    @action(detail=True)
+    def balance(self, request, pk=None):
+        serializer = OrganizationBalanceSerializer(self.get_object())
+        return Response(serializer.data)
+
 
 class OrganizationNAPViewSet(OrganizationViewSet):
     serializer_class = OrganizationNAPSerializer
-- 
GitLab