From 2285761c6f09593121ad80f087127fcae0405934 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Tue, 2 Nov 2021 13:11:26 +0100
Subject: [PATCH] TMSS-1124: process lta archive information in transaction

---
 .../src/tmss/tmssapp/viewsets/scheduling.py   | 34 ++++++++++---------
 1 file changed, 18 insertions(+), 16 deletions(-)

diff --git a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py
index 7af1c78862e..531c63c3fc5 100644
--- a/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py
+++ b/SAS/TMSS/backend/src/tmss/tmssapp/viewsets/scheduling.py
@@ -40,6 +40,7 @@ from rest_framework.views import APIView
 from rest_framework.decorators import api_view, renderer_classes
 from django.core.exceptions import ObjectDoesNotExist
 import django_property_filter as property_filters
+from django.db import transaction
 
 class TextPlainAutoSchema(SwaggerAutoSchema):
     def get_produces(self):
@@ -481,27 +482,28 @@ class DataproductViewSet(LOFARViewSet):
 
         json_doc = json.loads(request.body.decode('utf-8'))
 
-        dataproduct.size = int(json_doc['file_size'])
-        dataproduct.directory, dataproduct.filename = json_doc['srm_url'].rsplit('/', maxsplit=1)
+        with transaction.atomic():
+            dataproduct.size = int(json_doc['file_size'])
+            dataproduct.directory, dataproduct.filename = json_doc['srm_url'].rsplit('/', maxsplit=1)
 
-        if 'storage_ticket' in json_doc:
-            models.DataproductArchiveInfo.objects.create(dataproduct=dataproduct, storage_ticket=json_doc['storage_ticket'])
+            if 'storage_ticket' in json_doc:
+                models.DataproductArchiveInfo.objects.create(dataproduct=dataproduct, storage_ticket=json_doc['storage_ticket'])
 
-        if 'md5_checksum' in json_doc:
-            models.DataproductHash.objects.create(dataproduct=dataproduct,
-                                                  hash_algorithm=models.HashAlgorithm.objects.get(value=models.HashAlgorithm.Choices.MD5.value),
-                                                  hash=json_doc['md5_checksum'])
+            if 'md5_checksum' in json_doc:
+                models.DataproductHash.objects.create(dataproduct=dataproduct,
+                                                      hash_algorithm=models.HashAlgorithm.objects.get(value=models.HashAlgorithm.Choices.MD5.value),
+                                                      hash=json_doc['md5_checksum'])
 
-        if 'adler32_checksum' in json_doc:
-            models.DataproductHash.objects.create(dataproduct=dataproduct,
-                                                  hash_algorithm=models.HashAlgorithm.objects.get(value=models.HashAlgorithm.Choices.ADLER32.value),
-                                                  hash=json_doc['adler32_checksum'])
+            if 'adler32_checksum' in json_doc:
+                models.DataproductHash.objects.create(dataproduct=dataproduct,
+                                                      hash_algorithm=models.HashAlgorithm.objects.get(value=models.HashAlgorithm.Choices.ADLER32.value),
+                                                      hash=json_doc['adler32_checksum'])
 
-        # create empty feedback. Apart from the archive info above, ingest does not create feedback like observations/pipelines do.
-        dataproduct.feedback_template = models.DataproductFeedbackTemplate.objects.get(name="empty")
-        dataproduct.feedback_doc = get_default_json_object_for_schema(dataproduct.feedback_template.schema)
+            # create empty feedback. Apart from the archive info above, ingest does not create feedback like observations/pipelines do.
+            dataproduct.feedback_template = models.DataproductFeedbackTemplate.objects.get(name="empty")
+            dataproduct.feedback_doc = dataproduct.feedback_template.get_default_json_document_for_schema()
+            dataproduct.save()
 
-        dataproduct.save()
         serializer = self.get_serializer(dataproduct)
         return RestResponse(serializer.data)
 
-- 
GitLab