diff --git a/atdb/docs/ATDB-LDV Data Model.png b/atdb/docs/ATDB-LDV Data Model.png index 2cb5d5ba14cc4cb74d94a9bb26ee581ee8a90e3b..357a6ea1859098a01ff2d7c195bc379c165a2496 100644 Binary files a/atdb/docs/ATDB-LDV Data Model.png and b/atdb/docs/ATDB-LDV Data Model.png differ diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index 1be1e5a9eb8e2f4172af34f984543de896293d9d..35ac5ff9c6c71c90a76d1906ca13847bc51e6d6c 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -292,6 +292,24 @@ class Task(models.Model): return False return True + @property + def joined_status(self): + # if a task has joined_input_tasks, then check their status + try: + joined_input_tasks = self.joined_input_tasks.all() + status = None + for task in joined_input_tasks: + if status and task.status != status: + return None + status = task.status + + # all statusses are the same, return it + return status + except Exception as e: + print(e) + + return "unknown" + # NV: this shows the latest status change, but because it is a derived property it cannot be sorted. # This functionality was not requested, and to avoid additional requests about 'sort' functionalty # it is currently commented out. Could be of use later though, so I leave it in for now. diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py index 37341fdab51f2fd5bfdfc2b1ef04b9a041634152..a233c9162d7a7db700aeaa479e49ef4994dbb14d 100644 --- a/atdb/taskdatabase/serializers.py +++ b/atdb/taskdatabase/serializers.py @@ -91,7 +91,8 @@ class TaskReadSerializer(serializers.ModelSerializer): class Meta: model = Task fields = ['id','task_type','creationTime','filter', - 'predecessor','predecessor_status','successors', 'joined_input_tasks','joined_output_task', + 'predecessor','predecessor_status','successors', + 'joined_input_tasks','joined_output_task','joined_status', 'project','sas_id','priority','purge_policy','cleanup_policy','resume', 'workflow', 'stage_request_id', @@ -123,7 +124,7 @@ class TaskReadSerializerFast(serializers.ModelSerializer): class Meta: model = Task fields = ['id','task_type','creationTime','filter','predecessor','predecessor_status', - 'joined_input_tasks', 'joined_output_task', + 'joined_input_tasks', 'joined_output_task', 'joined_status' 'project','sas_id','priority','purge_policy','cleanup_policy','resume', 'workflow', 'stage_request_id', diff --git a/atdb/taskdatabase/tests/test_models_joins.py b/atdb/taskdatabase/tests/test_models_joins.py new file mode 100644 index 0000000000000000000000000000000000000000..a540ab527d0d2107d481e3e13e71ba99e8d54c8f --- /dev/null +++ b/atdb/taskdatabase/tests/test_models_joins.py @@ -0,0 +1,54 @@ +from django.test import TestCase +import json + +from taskdatabase.models import Workflow,Task + + +class TestJoinedTasks(TestCase): + + @classmethod + def setUpTestData(cls): + + # Set up non-modified objects used by all test methods + workflow = Workflow() + workflow.save() + + # create a list of Tasks + Task.objects.get_or_create(sas_id=1, status='stored') + Task.objects.get_or_create(sas_id=2, status='stored') + Task.objects.get_or_create(sas_id=3, status='defined') + + + def test_add_input_tasks_to_task(self): + output_task = Task.objects.get(sas_id=1) + input_task_1 = Task.objects.get(sas_id=2) + input_task_2 = Task.objects.get(sas_id=3) + output_task.joined_input_tasks.set([input_task_1,input_task_2]) + output_task.save() + + # count number of input asks + count_input_tasks = output_task.joined_input_tasks.count() + self.assertEqual(count_input_tasks,2) + + + def test_join_status_none(self): + output_task = Task.objects.get(sas_id=1) + input_task_1 = Task.objects.get(sas_id=2) # stored + input_task_2 = Task.objects.get(sas_id=3) # defined + output_task.joined_input_tasks.set([input_task_1,input_task_2]) + output_task.save() + + # one input task on stored, and on on defined, should give: None + + self.assertEqual(output_task.joined_status,None) + + + def test_join_status_stored(self): + output_task = Task.objects.get(sas_id=3) + input_task_1 = Task.objects.get(sas_id=2) # stored + input_task_2 = Task.objects.get(sas_id=1) # stored + output_task.joined_input_tasks.set([input_task_1, input_task_2]) + output_task.save() + + # two input tasks 'stored', should give: 'stored' + self.assertEqual(output_task.joined_status, "stored") \ No newline at end of file