From fa193be2d3531f77a6daa2455a34fdd70ff07ce3 Mon Sep 17 00:00:00 2001
From: Jorrit Schaap <schaap@astron.nl>
Date: Fri, 9 Jun 2017 14:27:50 +0000
Subject: [PATCH] Task #10898: do not allow task_id or resource_id of claim to
 be changed

---
 .../radb/sql/add_functions_and_triggers.sql            | 10 ++++++++++
 .../ResourceAssignmentDatabase/tests/t_radb.py         |  7 +++++++
 2 files changed, 17 insertions(+)

diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql
index 8e6515d8234..e8389aeea5d 100644
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/radb/sql/add_functions_and_triggers.sql
@@ -634,6 +634,16 @@ BEGIN
         IF NEW.status_id = claim_claimed_status_id AND OLD.claim_size <> NEW.claim_size THEN
             RAISE EXCEPTION 'cannot update claim size on claimed claim; old:% new:%', OLD, NEW;
         END IF;
+
+        -- bounce any task_id updates
+        IF OLD.task_id <> NEW.task_id THEN
+            RAISE EXCEPTION 'cannot change the task to which a claim belongs; old:% new:%', OLD, NEW;
+        END IF;
+
+        -- bounce any resource_id updates
+        IF OLD.resource_id <> NEW.resource_id THEN
+            RAISE EXCEPTION 'cannot change the resource to which a claim belongs; old:% new:%', OLD, NEW;
+        END IF;
     END IF;
 
     --only check claim if status and/or claim_size and/or start/end time changed
diff --git a/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py b/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py
index d4307e04c4e..156a34b6802 100755
--- a/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py
+++ b/SAS/ResourceAssignment/ResourceAssignmentDatabase/tests/t_radb.py
@@ -1119,6 +1119,13 @@ class ResourceAssignmentDatabaseTest(unittest.TestCase):
         self.assertEqual(set([task_id1]), set(t['id'] for t in
                                               self.radb.get_conflicting_overlapping_tasks(t2_claim_ids[0])))
 
+        #try to connect this claim to task1, should fail
+        self.assertFalse(self.radb.updateResourceClaims(t2_claim_ids, task_id=task_id1))
+        self.assertEqual(task_id2, t2_claims[0]['task_id'])
+
+        #try to connect this claim to other resource, should fail
+        self.assertFalse(self.radb.updateResourceClaims(t2_claim_ids, resource_id=118))
+        self.assertEqual(117, t2_claims[0]['resource_id'])
 
         # try to update the task status to scheduled, should not succeed, since it's claims are not 'claimed' yet.
         self.assertFalse(self.radb.updateTask(task_id2, task_status='scheduled'))
-- 
GitLab