From 011b4fa5ca3a93b4e7878bf1a696b994a3252314 Mon Sep 17 00:00:00 2001
From: Mario Raciti <mario.raciti@inaf.it>
Date: Tue, 4 May 2021 16:29:23 +0200
Subject: [PATCH] TMSS-610: Refactoring; add get_cycles_report util API

---
 .../src/tmss/tmssapp/adapters/reports.py      | 51 ++++++++-----------
 SAS/TMSS/backend/src/tmss/tmssapp/views.py    | 17 +++++++
 .../tmss/tmssapp/viewsets/specification.py    | 10 +---
 SAS/TMSS/backend/src/tmss/urls.py             |  1 +
 4 files changed, 41 insertions(+), 38 deletions(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
index 6b817132347..b6cb8916cc7 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py
@@ -6,67 +6,58 @@ from rest_framework.request import Request
 from datetime import timedelta
 
 
-def create_cycle_report(request: Request, current_cycle: models.Cycle, other_cycles: [models.Cycle]) -> {}:
+def create_cycle_report(request: Request, cycle: 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(),
-                                }})
+    result = {'cycle': cycle.pk,
+              'telescope_time_distribution': _get_telescope_time_distribution(cycle),
+              'average_efficiency': _get_average_efficiency(cycle),
+              'completion_level': _get_completion_level(cycle),
+              'observation_hours_per_category': _get_observation_hours_per_category(cycle),
+              'weekly_efficiency': _get_weekly_efficiency(cycle),
+              'data_ingested_per_site_and_category': _get_data_ingested_per_site_and_category(cycle),
+              'projects_summary': _get_projects_summary(cycle),
+              'usage_mode': _get_usage_mode(cycle),
+              'failures': _get_failures(cycle),
+              }
 
     return result
 
 
-def _get_average_efficiency():
+def _get_telescope_time_distribution(cycle: models.Cycle):
     return 0
 
 
-def _get_completion_level():
+def _get_average_efficiency(cycle: models.Cycle):
     return 0
 
 
-def _get_telescope_time_distribution():
+def _get_completion_level(cycle: models.Cycle):
     return 0
 
 
-def _get_observation_hours_per_category():
+def _get_observation_hours_per_category(cycle: models.Cycle):
     return 0
 
 
-def _get_weekly_efficiency():
+def _get_weekly_efficiency(cycle: models.Cycle):
     return 0
 
 
-def _get_data_ingested_per_site_and_category():
+def _get_data_ingested_per_site_and_category(cycle: models.Cycle):
     return 0
 
 
-def _get_projects_summary():
+def _get_projects_summary(cycle: models.Cycle):
     return 0
 
 
-def _get_usage_mode():
+def _get_usage_mode(cycle: models.Cycle):
     return 0
 
 
-def _get_failures():
+def _get_failures(cycle: models.Cycle):
     return 0
 
 
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/views.py b/SAS/TMSS/backend/src/tmss/tmssapp/views.py
index 85bdfe0de03..59b4c16e99c 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/views.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/views.py
@@ -6,6 +6,7 @@ from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.common.json_utils import get_default_json_object_for_schema
 from lofar.common.datetimeutils import formatDatetime
 from lofar.sas.tmss.tmss.tmssapp.adapters.parset import convert_to_parset
+from lofar.sas.tmss.tmss.tmssapp.adapters.reports import create_cycle_report
 from drf_yasg.utils import swagger_auto_schema
 from drf_yasg.openapi import Parameter
 from rest_framework.authtoken.models import Token
@@ -278,3 +279,19 @@ def get_target_rise_and_set(request):
     rise_set_dict = coordinates_timestamps_and_stations_to_target_rise_and_set(angle1=angle1, angle2=angle2, direction_type=direction_type, angle_to_horizon=horizon, timestamps=timestamps, stations=stations)
     return JsonResponse(rise_set_dict)
 
+
+# TODO: Add other responses and change parameter to array.
+@swagger_auto_schema(method='GET', responses={200: 'A JSON object with cycles information for reporting.'},
+                     manual_parameters=[Parameter(name='cycles', required=True, type='string', in_='query',
+                                                  description="Cycles' primary keys.")])
+@api_view(['GET'])
+def get_cycles_report(request):
+    cycles = [get_object_or_404(models.Cycle, pk='Cycle 00'), get_object_or_404(models.Cycle, pk='Cycle 01'),
+              get_object_or_404(models.Cycle, pk='Cycle 02')]#request.GET.get('cycles')
+
+    results = {}
+    for c in cycles:    # TODO: Cycles will be a list of pks
+        # c = get_object_or_404(models.Cycle, pk=c_pk)
+        info = create_cycle_report(request, c)
+        results[c.pk] = info
+    return JsonResponse(results)
diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
index 4e7123acfe1..8d268b2053c 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/specification.py
@@ -322,15 +322,9 @@ class CycleViewSet(LOFARViewSet):
                                     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.
+    def report(self, request, pk=None):
         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)
+        result = create_cycle_report(request, cycle)
         return Response(result, status=status.HTTP_200_OK)
 
 
diff --git a/SAS/TMSS/backend/src/tmss/urls.py b/SAS/TMSS/backend/src/tmss/urls.py
index 5306787cb40..b19efbc46ac 100644
--- a/SAS/TMSS/backend/src/tmss/urls.py
+++ b/SAS/TMSS/backend/src/tmss/urls.py
@@ -75,6 +75,7 @@ urlpatterns = [
     re_path('util/lst/?', views.lst, name="conversion-lst"),
     re_path('util/angular_separation/?', views.get_angular_separation, name='get_angular_separation'),
     re_path('util/target_rise_and_set/?', views.get_target_rise_and_set, name='get_target_rise_and_set'),
+    re_path('util/cycles_report/?', views.get_cycles_report, name='get_cycles_report'),
 ]
 
 if os.environ.get('SHOW_DJANGO_DEBUG_TOOLBAR', False):
-- 
GitLab