From 64341248040d945193a76f46b462e88760bc2bec Mon Sep 17 00:00:00 2001 From: "Daniel J. B. Clarke" Date: Fri, 18 Jun 2021 17:19:05 -0400 Subject: [PATCH] Add csv renderer to some API endpoints for csv exports References #121 --- FAIRshakeAPI/views.py | 22 +++++++++++++++++++--- requirements.txt | 1 + 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/FAIRshakeAPI/views.py b/FAIRshakeAPI/views.py index 251a6ca..474e907 100644 --- a/FAIRshakeAPI/views.py +++ b/FAIRshakeAPI/views.py @@ -17,6 +17,7 @@ from django.urls import reverse from django.core.exceptions import MultipleObjectsReturned from rest_framework import views, viewsets, schemas, response, mixins, decorators, renderers, permissions, status +from rest_framework_csv.renderers import CSVRenderer from functools import reduce from collections import defaultdict, OrderedDict @@ -59,6 +60,7 @@ def get_template_context(self, data, renderer_context): class CustomModelViewSet(viewsets.ModelViewSet): renderer_classes = [ renderers.JSONRenderer, + CSVRenderer, CustomTemplateHTMLRenderer, CustomBrowsableAPIRenderer, ] @@ -138,14 +140,27 @@ def get_or_create(self, request, **kwargs): headers = self.get_success_headers(serialized_item.data) return response.Response(serialized_item.data, status=status.HTTP_200_OK if found else status.HTTP_201_CREATED, headers=headers) - @swagger_auto_schema(methods=['get'], auto_schema=None) + @swagger_auto_schema(methods=['get']) @decorators.action( detail=True, methods=['get'], schema=None, - renderer_classes=[CustomTemplateHTMLRenderer], + renderer_classes=[ + renderers.JSONRenderer, + CSVRenderer, + CustomTemplateHTMLRenderer + ], ) def assessments(self, request, pk=None, **kwargs): self.check_permissions(request) - return response.Response() + if isinstance(request.accepted_renderer, CustomTemplateHTMLRenderer): + return response.Response() + # redirect /object/{pk}/assessments => assessments?object={pk} + GET = request.GET.copy() + GET[self.get_model_name()] = pk + return shortcuts.redirect( + reverse('assessment-list') + + '?' + + GET.urlencode() + ) @swagger_auto_schema(methods=['get', 'post'], auto_schema=None) @decorators.action( @@ -323,6 +338,7 @@ class DigitalObjectViewSet(IdentifiableModelViewSet): detail=True, methods=['get'], renderer_classes=[ renderers.JSONRenderer, + CSVRenderer, CustomBrowsableAPIRenderer, ], ) diff --git a/requirements.txt b/requirements.txt index 10d2e96..f50b1bb 100644 --- a/requirements.txt +++ b/requirements.txt @@ -12,6 +12,7 @@ django-filter==2.3.0 django-livereload-server==0.3.2 django-rest-auth==0.9.5 Django==2.2.13 +djangorestframework-csv==2.1.1 djangorestframework==3.11.0 drf-yasg==1.17.1 dynamic-rest==1.9.6