From f4dbf49e4d2a28856255af4c00c5e0bd393d2be0 Mon Sep 17 00:00:00 2001
From: goei <goei@astron.nl>
Date: Mon, 18 May 2020 16:53:43 +0200
Subject: [PATCH] TMSS-171 Create API for specifying an observation

---
 SAS/TMSS/src/query.py                         | 17 +++++++++++++-
 SAS/TMSS/src/tmss/tmssapp/CMakeLists.txt      |  1 +
 SAS/TMSS/src/tmss/tmssapp/tasks.py            | 20 +++++++++++++++++
 SAS/TMSS/src/tmss/tmssapp/views.py            |  9 ++++++++
 .../tmss/tmssapp/viewsets/specification.py    | 22 +++++++++++++++++--
 5 files changed, 66 insertions(+), 3 deletions(-)
 create mode 100644 SAS/TMSS/src/tmss/tmssapp/tasks.py

diff --git a/SAS/TMSS/src/query.py b/SAS/TMSS/src/query.py
index d8b352d7b82..0fb99f664ee 100644
--- a/SAS/TMSS/src/query.py
+++ b/SAS/TMSS/src/query.py
@@ -31,4 +31,19 @@ def main_set_subtask_state():
     parser.add_argument("subtask_id", help="The ID of the TMSS subtask to set the status on")
     parser.add_argument("state", help="The state to set")
     args = parser.parse_args()
-    set_subtask_state(args.subtask_id, args.state)
\ No newline at end of file
+    set_subtask_state(args.subtask_id, args.state)
+
+
+def _specify_observation_task(task_id: int):
+    with TMSSsession(TMSS_USER, TMSS_PASS, TMSS_HOST, TMSS_AUTHENTICATION_METHOD) as session:
+        return session.get(url=TMSS_HOST+'/api/task/%s/specify_observation' % task_id)
+
+
+def main_specify_observation_task():
+    """
+    Ask user for parameter 'taskid' and execute API-call to specify observation
+    """
+    parser = argparse.ArgumentParser()
+    parser.add_argument("task_id", help="The ID of the TMSS task to specify for observation")
+    args = parser.parse_args()
+    _specify_observation_task(args.task_id)
diff --git a/SAS/TMSS/src/tmss/tmssapp/CMakeLists.txt b/SAS/TMSS/src/tmss/tmssapp/CMakeLists.txt
index 566ea86c023..d4e6f9001d4 100644
--- a/SAS/TMSS/src/tmss/tmssapp/CMakeLists.txt
+++ b/SAS/TMSS/src/tmss/tmssapp/CMakeLists.txt
@@ -9,6 +9,7 @@ set(_py_files
     populate.py
     validation.py
     subtasks.py
+    tasks.py
     )
 
 python_install(${_py_files}
diff --git a/SAS/TMSS/src/tmss/tmssapp/tasks.py b/SAS/TMSS/src/tmss/tmssapp/tasks.py
new file mode 100644
index 00000000000..ad7a00a6dac
--- /dev/null
+++ b/SAS/TMSS/src/tmss/tmssapp/tasks.py
@@ -0,0 +1,20 @@
+from lofar.sas.tmss.tmss.tmssapp import models
+from lofar.common.datetimeutils import formatDatetime
+from lofar.sas.tmss.tmss.exceptions import *
+from lofar.sas.tmss.tmss.tmssapp.models.specification import TaskDraft, TaskBlueprint, TaskRelationBlueprint, \
+    TaskRelationDraft
+from lofar.sas.tmss.tmss.tmssapp.models.scheduling import Subtask, SubtaskType
+
+
+
+def instantiate_subtasks_from_taskdraft(task: models.TaskDraft):
+    """
+    Create a task_blueprint from the task_draft
+    and for every subtask in task:
+     - create subtask and set to DEFINING
+     - create subtask input and outputs and link
+     - link subtask inputs to predecessor outputs
+     - set subtask to DEFINED
+    :raises Exception if instantiate fails.
+    """
+    print("Doe iets...")
\ No newline at end of file
diff --git a/SAS/TMSS/src/tmss/tmssapp/views.py b/SAS/TMSS/src/tmss/tmssapp/views.py
index 92b02f26838..ec0e4e4abba 100644
--- a/SAS/TMSS/src/tmss/tmssapp/views.py
+++ b/SAS/TMSS/src/tmss/tmssapp/views.py
@@ -4,19 +4,28 @@ from django.shortcuts import get_object_or_404
 from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.common.json_utils import get_default_json_object_for_schema
 from lofar.sas.tmss.tmss.tmssapp.adapters.parset import convert_to_parset
+from lofar.sas.tmss.tmss.tmssapp.tasks import instantiate_subtasks_from_taskdraft
+
 
 def subtask_template_default_specification(request, subtask_template_pk:int):
     subtask_template = get_object_or_404(models.SubtaskTemplate, pk=subtask_template_pk)
     spec = get_default_json_object_for_schema(subtask_template.schema)
     return JsonResponse(spec)
 
+
 def task_template_default_specification(request, task_template_pk:int):
     task_template = get_object_or_404(models.TaskTemplate, pk=task_template_pk)
     spec = get_default_json_object_for_schema(task_template.schema)
     return JsonResponse(spec)
 
+
 def subtask_parset(request, subtask_pk:int):
     subtask = get_object_or_404(models.Subtask, pk=subtask_pk)
     parset = convert_to_parset(subtask)
     return HttpResponse(str(parset), content_type='text/plain')
 
+
+def task_specify_observation(request, pk=None):
+    task = get_object_or_404(models.TaskDraft, pk=pk)
+    instantiate_subtasks_from_taskdraft(task)
+    return HttpResponse("response", content_type='text/plain')
\ No newline at end of file
diff --git a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
index 16f25c43c2a..b14225844e9 100644
--- a/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
+++ b/SAS/TMSS/src/tmss/tmssapp/viewsets/specification.py
@@ -3,7 +3,7 @@ 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.http import HttpResponse, JsonResponse
 from django.contrib.auth.models import User
 from rest_framework.viewsets import ReadOnlyModelViewSet
 
@@ -17,7 +17,10 @@ from lofar.sas.tmss.tmss.tmssapp.viewsets.lofar_viewset import LOFARViewSet
 from lofar.sas.tmss.tmss.tmssapp import models
 from lofar.sas.tmss.tmss.tmssapp import serializers
 
+from datetime import datetime
 from lofar.common.json_utils import get_default_json_object_for_schema
+from lofar.common.datetimeutils import formatDatetime
+from lofar.sas.tmss.tmss.tmssapp.tasks import instantiate_subtasks_from_taskdraft
 
 
 # This is required for keeping a user reference as ForeignKey in other models
@@ -229,6 +232,8 @@ class TaskBlueprintViewSetJSONeditorOnline(LOFARViewSet):
             name += ' ' + self.suffix
         return name
 
+
+
 class TaskDraftViewSetJSONeditorOnline(LOFARViewSet):
     queryset = models.TaskDraft.objects.all()
     serializer_class = serializers.TaskDraftSerializerJSONeditorOnline
@@ -244,4 +249,17 @@ class TaskDraftViewSetJSONeditorOnline(LOFARViewSet):
             scheduling_unit_draft = get_object_or_404(models.SchedulingUnitDraft, pk=self.kwargs['scheduling_unit_draft_pk'])
             return scheduling_unit_draft.task_drafts.all()
         else:
-            return models.TaskDraft.objects.all()
\ No newline at end of file
+            return models.TaskDraft.objects.all()
+
+    @action(methods=['get'], detail=True)
+    def specify_observation(self, request, pk=None):
+        task = get_object_or_404(models.TaskDraft, pk=pk)
+        instantiate_subtasks_from_taskdraft(task)
+
+        results_str = "# SUBTASKS GENERATED BY TMSS FROM THE SPECIFICATION OF TASK DRAFT ID=%d ON %s url: %s\n" % (
+            task.pk,
+            formatDatetime(datetime.utcnow()),
+            request._request.get_raw_uri(),
+        )
+        return HttpResponse(results_str, content_type='text/plain')
+
-- 
GitLab