From d07ebc53487751484494b66286519da7754d8714 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Fri, 28 Aug 2020 12:37:41 +0200
Subject: [PATCH] TMSS-272: derive from common AbstractTemplateViewSet which
 implements common actions to get the schema or a default json blob

---
 .../tmss/tmssapp/viewsets/lofar_viewset.py    | 27 +++++++-
 .../src/tmss/tmssapp/viewsets/scheduling.py   | 26 ++-----
 .../tmss/tmssapp/viewsets/specification.py    | 67 ++-----------------
 3 files changed, 38 insertions(+), 82 deletions(-)

diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/lofar_viewset.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/lofar_viewset.py
index 017d8e13c90..977fc934165 100644
--- a/SAS/TMSS/src/tmss/tmssapp/viewsets/lofar_viewset.py
+++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/lofar_viewset.py
@@ -8,6 +8,10 @@ Adds the following functionality:
 from rest_framework import viewsets
 from drf_yasg.utils import swagger_auto_schema
 from rest_framework import mixins
+from django.shortcuts import get_object_or_404
+from django.http import JsonResponse
+from rest_framework.decorators import action
+from lofar.common.json_utils import get_default_json_object_for_schema
 
 class LOFARViewSet(viewsets.ModelViewSet):
     """
@@ -50,4 +54,25 @@ class LOFARNestedViewSet(mixins.CreateModelMixin,
 
     @swagger_auto_schema(responses={400: 'invalid specification', 403: 'forbidden'})
     def create(self, request, **kwargs):
-        return super(LOFARNestedViewSet, self).create(request, **kwargs)
\ No newline at end of file
+        return super(LOFARNestedViewSet, self).create(request, **kwargs)
+
+
+class AbstractTemplateViewSet(LOFARViewSet):
+    @swagger_auto_schema(responses={200: 'The schema as a JSON object',
+                                    403: 'forbidden'},
+                         operation_description="Get the schema as a JSON object.")
+    @action(methods=['get'], detail=True)
+    def schema(self, request, pk=None):
+        template = get_object_or_404(self.queryset.model, pk=pk)
+        return JsonResponse(template.schema)
+
+    @swagger_auto_schema(responses={200: 'JSON object with all the defaults from the schema filled in',
+                                    403: 'forbidden'},
+                         operation_description="Get a JSON object with all the defaults from the schema filled in.")
+    @action(methods=['get'], detail=True)
+    def default(self, request, pk=None):
+        template = get_object_or_404(self.queryset.model, pk=pk)
+        spec = get_default_json_object_for_schema(template.schema)
+        return JsonResponse(spec)
+
+
diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py
index e1ce15a72ab..72373992512 100644
--- a/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py
+++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/scheduling.py
@@ -4,7 +4,7 @@ This file contains the viewsets (based on the elsewhere defined data models and
 
 from django.shortcuts import get_object_or_404
 from rest_framework import viewsets
-from .lofar_viewset import LOFARViewSet, LOFARNestedViewSet
+from .lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet
 from .. import models
 from .. import serializers
 from django_filters import rest_framework as filters
@@ -88,7 +88,7 @@ class SubtaskTemplateFilter(filters.FilterSet):
             'version': ['lt', 'gt', 'exact']
         }
 
-class SubtaskTemplateViewSet(LOFARViewSet):
+class SubtaskTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.SubtaskTemplate.objects.all()
     serializer_class = serializers.SubtaskTemplateSerializer
     filter_class = SubtaskTemplateFilter
@@ -103,30 +103,13 @@ class SubtaskTemplateViewSet(LOFARViewSet):
 
         return queryset
 
-    @swagger_auto_schema(responses={200: 'The schema as a JSON object',
-                                    403: 'forbidden'},
-                         operation_description="Get the schema as a JSON object.")
-    @action(methods=['get'], detail=True)
-    def schema(self, request, pk=None):
-        subtask_template = get_object_or_404(models.SubtaskTemplate, pk=pk)
-        return JsonResponse(subtask_template.schema)
-
-    @swagger_auto_schema(responses={200: 'JSON object with all the defaults from the schema filled in',
-                                    403: 'forbidden'},
-                         operation_description="Get a JSON object with all the defaults from the schema filled in.")
-    @action(methods=['get'], detail=True)
-    def default_specification(self, request, pk=None):
-        subtask_template = get_object_or_404(models.SubtaskTemplate, pk=pk)
-        spec = get_default_json_object_for_schema(subtask_template.schema)
-        return JsonResponse(spec)
-
 
 class DefaultSubtaskTemplateViewSet(LOFARViewSet):
     queryset = models.DefaultSubtaskTemplate.objects.all()
     serializer_class = serializers.DefaultSubtaskTemplateSerializer
 
 
-class DataproductSpecificationsTemplateViewSet(LOFARViewSet):
+class DataproductSpecificationsTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.DataproductSpecificationsTemplate.objects.all()
     serializer_class = serializers.DataproductSpecificationsTemplateSerializer
 
@@ -135,7 +118,8 @@ class DefaultDataproductSpecificationsTemplateViewSet(LOFARViewSet):
     queryset = models.DefaultDataproductSpecificationsTemplate.objects.all()
     serializer_class = serializers.DefaultDataproductSpecificationsTemplateSerializer
 
-class DataproductFeedbackTemplateViewSet(LOFARViewSet):
+
+class DataproductFeedbackTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.DataproductFeedbackTemplate.objects.all()
     serializer_class = serializers.DataproductFeedbackTemplateSerializer
 
diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
index 7749da4beba..bfc8ebf7f1a 100644
--- a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
@@ -3,7 +3,6 @@ This file contains the viewsets (based on the elsewhere defined data models and
 """
 
 from django.shortcuts import get_object_or_404
-from django.http import JsonResponse
 from django.contrib.auth.models import User
 from django_filters import rest_framework as filters
 from rest_framework.viewsets import ReadOnlyModelViewSet
@@ -16,7 +15,7 @@ from rest_framework.decorators import action
 
 from drf_yasg.utils import swagger_auto_schema
 
-from lofar.sas.tmss.tmss.tmssapp.viewsets.lofar_viewset import LOFARViewSet, LOFARNestedViewSet
+from lofar.sas.tmss.tmss.tmssapp.viewsets.lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet
 from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.sas.tmss.tmss.tmssapp import serializers
 
@@ -41,39 +40,12 @@ class TagsViewSet(LOFARViewSet):
     serializer_class = serializers.TagsSerializer
 
 
-class CommonSchemaTemplateViewSet(LOFARViewSet):
+class CommonSchemaTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.CommonSchemaTemplate.objects.all()
     serializer_class = serializers.CommonSchemaTemplateSerializer
 
-    @swagger_auto_schema(responses={200: 'The schema as a JSON object',
-                                    403: 'forbidden'},
-                         operation_description="Get the schema as a JSON object.")
-    @action(methods=['get'], detail=True)
-    def schema(self, request, pk=None):
-        template = get_object_or_404(models.CommonSchemaTemplate, pk=pk)
-        return JsonResponse(template.schema)
-
-    @swagger_auto_schema(responses={200: 'The schema as a JSON object',
-                                    403: 'forbidden'},
-                         operation_description="Get the schema as a JSON object.")
-    @action(methods=['get'], detail=True)
-    def resolved_schema(self, request, pk=None):
-        template = get_object_or_404(models.CommonSchemaTemplate, pk=pk)
-        base_url = "%s://%s" % (request.scheme, request.get_host())
-        schema = json_utils.resolved_refs(template.schema)
-        return JsonResponse(schema)
-
-    @swagger_auto_schema(responses={200: 'JSON object with all the defaults from the schema filled in',
-                                    403: 'forbidden'},
-                         operation_description="Get a JSON object with all the defaults from the schema filled in.")
-    @action(methods=['get'], detail=True)
-    def default_specification(self, request, pk=None):
-        template = get_object_or_404(models.CommonSchemaTemplate, pk=pk)
-        spec = get_default_json_object_for_schema(template.schema)
-        return JsonResponse(spec)
-
 
-class GeneratorTemplateViewSet(LOFARViewSet):
+class GeneratorTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.GeneratorTemplate.objects.all()
     serializer_class = serializers.GeneratorTemplateSerializer
 
@@ -90,20 +62,11 @@ class SchedulingUnitTemplateFilter(filters.FilterSet):
             'version': ['lt', 'gt', 'exact']
         }
 
-class SchedulingUnitTemplateViewSet(LOFARViewSet):
+class SchedulingUnitTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.SchedulingUnitTemplate.objects.all()
     serializer_class = serializers.SchedulingUnitTemplateSerializer
     filter_class = SchedulingUnitTemplateFilter
 
-    @swagger_auto_schema(responses={200: 'JSON object with all the defaults from the schema filled in',
-                                    403: 'forbidden'},
-                         operation_description="Get a JSON object with all the defaults from the schema filled in.")
-    @action(methods=['get'], detail=True)
-    def default_specification(self, request, pk=None):
-        schedulingunit_template = get_object_or_404(models.SchedulingUnitTemplate, pk=pk)
-        spec = get_default_json_object_for_schema(schedulingunit_template.schema)
-        return JsonResponse(spec)
-
 
 class DefaultSchedulingUnitTemplateViewSet(LOFARViewSet):
     queryset = models.DefaultSchedulingUnitTemplate.objects.all()
@@ -117,35 +80,19 @@ class TaskTemplateFilter(filters.FilterSet):
             'version': ['lt', 'gt', 'exact']
         }
 
-class TaskTemplateViewSet(LOFARViewSet):
+
+class TaskTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.TaskTemplate.objects.all()
     serializer_class = serializers.TaskTemplateSerializer
     filter_class = TaskTemplateFilter
 
-    @swagger_auto_schema(responses={200: 'The schema as a JSON object',
-                                    403: 'forbidden'},
-                         operation_description="Get the schema as a JSON object.")
-    @action(methods=['get'], detail=True)
-    def schema(self, request, pk=None):
-        template = get_object_or_404(models.TaskTemplate, pk=pk)
-        return JsonResponse(template.schema)
-
-    @swagger_auto_schema(responses={200: 'JSON object with all the defaults from the schema filled in',
-                                    403: 'forbidden'},
-                         operation_description="Get a JSON object with all the defaults from the schema filled in.")
-    @action(methods=['get'], detail=True)
-    def default_specification(self, request, pk=None):
-        template = get_object_or_404(models.TaskTemplate, pk=pk)
-        spec = get_default_json_object_for_schema(template.schema)
-        return JsonResponse(spec)
-
 
 class DefaultTaskTemplateViewSet(LOFARViewSet):
     queryset = models.DefaultTaskTemplate.objects.all()
     serializer_class = serializers.DefaultTaskTemplateSerializer
 
 
-class TaskRelationSelectionTemplateViewSet(LOFARViewSet):
+class TaskRelationSelectionTemplateViewSet(AbstractTemplateViewSet):
     queryset = models.TaskRelationSelectionTemplate.objects.all()
     serializer_class = serializers.TaskRelationSelectionTemplateSerializer
 
-- 
GitLab