From 88e18c210859f6314f296978acf7cab2336bf8bf Mon Sep 17 00:00:00 2001
From: Mario Raciti <mario.raciti@inaf.it>
Date: Mon, 3 May 2021 16:43:53 +0200
Subject: [PATCH] TMSS-610: Add skeleton for cycle reporting

---
 .../src/tmss/tmssapp/adapters/reports.py      | 64 +++++++++++++++++++
 .../tmss/tmssapp/viewsets/specification.py    | 17 ++++-
 2 files changed, 80 insertions(+), 1 deletion(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
index 0c0684ea018..6b817132347 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
@@ -6,6 +6,70 @@ from rest_framework.request import Request
 from datetime import timedelta
 
 
+def create_cycle_report(request: Request, current_cycle: models.Cycle, other_cycles: [models.Cycle]) -> {}:
+    """
+    Create a cycle report as a JSON object.
+    """
+
+    current_cycle_pk = current_cycle.pk
+    other_cycles_pk = [c.pk for c in other_cycles] if other_cycles else []
+    result = {'current_cycle': current_cycle_pk}
+
+    # TODO: Manage default cases. See TMSS-610.
+
+    # Add properties
+    result['cycles'] = []
+    for c in sorted(other_cycles_pk + [current_cycle_pk, ]):
+        result['cycles'].append({c: {'telescope_time_distribution': _get_telescope_time_distribution(),
+                                'average_efficiency': _get_average_efficiency(),
+                                'completion_level': _get_completion_level(),
+                                'observation_hours_per_category': _get_observation_hours_per_category(),
+                                'weekly_efficiency': _get_weekly_efficiency(),
+                                'data_ingested_per_site_and_category': _get_data_ingested_per_site_and_category(),
+                                'projects_summary': _get_projects_summary(),
+                                'usage_mode': _get_usage_mode(),
+                                'failures': _get_failures(),
+                                }})
+
+    return result
+
+
+def _get_average_efficiency():
+    return 0
+
+
+def _get_completion_level():
+    return 0
+
+
+def _get_telescope_time_distribution():
+    return 0
+
+
+def _get_observation_hours_per_category():
+    return 0
+
+
+def _get_weekly_efficiency():
+    return 0
+
+
+def _get_data_ingested_per_site_and_category():
+    return 0
+
+
+def _get_projects_summary():
+    return 0
+
+
+def _get_usage_mode():
+    return 0
+
+
+def _get_failures():
+    return 0
+
+
 def create_project_report(request: Request, project: models.Project) -> {}:
     """
     Create a project report as a JSON object.
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
index e2f0b0663b1..4e7123acfe1 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
@@ -23,7 +23,7 @@ from drf_yasg.openapi import Parameter
 from lofar.sas.tmss.tmss.tmssapp.viewsets.lofar_viewset import LOFARViewSet, LOFARNestedViewSet, AbstractTemplateViewSet, LOFARCopyViewSet, LOFARFilterBackend
 from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.sas.tmss.tmss.tmssapp import serializers
-from lofar.sas.tmss.tmss.tmssapp.adapters.reports import create_project_report
+from lofar.sas.tmss.tmss.tmssapp.adapters.reports import create_cycle_report, create_project_report
 from django.http import JsonResponse
 
 from datetime import datetime
@@ -318,6 +318,21 @@ class CycleViewSet(LOFARViewSet):
     serializer_class = serializers.CycleSerializer
     ordering = ['start']
 
+    @swagger_auto_schema(responses={200: 'The Report information',
+                                    403: 'forbidden'},
+                         operation_description="Get Report information for the cycle.")
+    @action(methods=['get'], detail=True, url_name="report", name="Get Report")
+    def report(self, request, pk=None, other_cycles=None):
+        # TODO: Maybe would it be better to implement this method outside of the viewset?
+        #       Let's assume the cycle istance is the current cycle for the moment.
+        cycle = get_object_or_404(models.Cycle, pk=pk)
+        cycles = []
+        if other_cycles is not None:
+            for c in other_cycles:
+                cycles.append(get_object_or_404(models.Cycle, pk=c.pk))
+        result = create_cycle_report(request, cycle, cycles)
+        return Response(result, status=status.HTTP_200_OK)
+
 
 class CycleQuotaViewSet(LOFARViewSet):
     queryset = models.CycleQuota.objects.all()
-- 
GitLab