diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py b/SAS/TMSS/backend/src/tmss/tmssapp/adapters/reports.py index 0c0684ea018102e796393bcdf1bafe2bcd6f9456..6b817132347edd4832111ccce59ce8c182b89ee6 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 e2f0b0663b136e84bf3bba8f21200dfac82de836..4e7123acfe18833b5eb6fc4580f62cac8be93ca8 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()