diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index f732bc58c1ce2c5acce68ba34fe8a44c7e9bbff9..16cd9d7468733d2f4e9a833ee710a507ba2e27a9 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -31,6 +31,9 @@ class Task(models.Model): sas_id = models.CharField(max_length=30, blank=True, null=True) priority = models.IntegerField(default=0) purge_policy = models.CharField(max_length=5, default="no", blank=True, null=True) + desired_workflow_id = models.CharField(max_length=12, blank=True, null=True) + desired_workflow_uri = models.CharField(max_length=100, blank=True, null=True) + workflow = models.ForeignKey(Workflow, related_name='tasks', on_delete=models.SET_NULL, null=True,blank=True) inputs = models.JSONField(null=True, blank=True) outputs = models.JSONField(null=True, blank=True) diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py index c945e7b454536de518f0223e09fb167dfc481d21..7454684574ebece930d23fed74690c62e933b2ce 100644 --- a/atdb/taskdatabase/serializers.py +++ b/atdb/taskdatabase/serializers.py @@ -2,47 +2,19 @@ from rest_framework import serializers from .models import Status, Task, Workflow, LogEntry - -class WorkflowSerializer(serializers.ModelSerializer): - -# tasks = serializers.StringRelatedField( -# many=True, -# required=False, -# ) - - class Meta: - model = Workflow - fields = "__all__" - - class TaskSerializer(serializers.ModelSerializer): - status_history = serializers.StringRelatedField( - many=True, - required=False, - ) - class Meta: - model = Task - fields = ('id','task_type','taskID', - 'desired_predecessor_id','predecessor','successor', - 'project','sas_id','priority','purge_policy','skip', - 'workflow', - 'status','desired_status', - 'inputs','outputs','status_history') - -class TaskReadSerializer(serializers.ModelSerializer): status_history = serializers.StringRelatedField( many=True, required=False, ) - workflow = WorkflowSerializer(read_only=True) class Meta: model = Task fields = ('id','task_type','taskID', 'desired_predecessor_id','predecessor','successor', 'project','sas_id','priority','purge_policy','skip', - 'workflow', + 'desired_workflow_id','desired_workflow_uri','workflow', 'status','desired_status', 'inputs','outputs','status_history') @@ -54,6 +26,17 @@ class StatusSerializer(serializers.ModelSerializer): fields = "__all__" +class WorkflowSerializer(serializers.ModelSerializer): + +# tasks = serializers.StringRelatedField( +# many=True, +# required=False, +# ) + + class Meta: + model = Workflow + fields = "__all__" + class LogEntrySerializer(serializers.ModelSerializer): diff --git a/atdb/taskdatabase/services/signals.py b/atdb/taskdatabase/services/signals.py index deda8633fd6f8bb4a5db0a6e9b04bbeef9fabcef..03ce4475a2d896bceb94a9f90bdc55da32365365 100644 --- a/atdb/taskdatabase/services/signals.py +++ b/atdb/taskdatabase/services/signals.py @@ -34,6 +34,28 @@ def pre_save_task_handler(sender, **kwargs): handle_pre_save(sender, **kwargs) +def add_workflow(myTaskObject): + desired_workflow_id = myTaskObject.desired_workflow_id + desired_workflow_uri = myTaskObject.desired_workflow_uri + + # first try to find the workflow by desired workflow_id + try: + desired_workflow = Workflow.objects.get(id=desired_workflow_id) + except: + desired_workflow = None + + if (desired_workflow == None): + # then try workflow_uri + desired_workflow = Workflow.objects.get(workflow_uri=desired_workflow_uri) + + # first check if works needs to be done at all + if (myTaskObject.workflow != desired_workflow): + # set the new status + myTaskObject.workflow = desired_workflow + + return myTaskObject + + def add_predecessor(myTaskObject): # connect the task to a workflow after posting a (flat) task through the REST API @@ -79,6 +101,7 @@ def handle_pre_save(sender, **kwargs): myStatus.save() # connect the task to a workflow after posting a (flat) task through the REST API + myTaskObject = add_workflow(myTaskObject) myTaskObject = add_predecessor(myTaskObject) diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index 4ad5ff4cddc1ca0c7c71658718b0b87136e8d23c..9d629398fb83d9ec645a474ead7ec6f69e556abd 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -14,7 +14,7 @@ from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from .models import Task, Status, Workflow, LogEntry from django.db.models import Q -from .serializers import TaskSerializer, TaskReadSerializer, WorkflowSerializer, LogEntrySerializer +from .serializers import TaskSerializer, WorkflowSerializer, LogEntrySerializer from .forms import FilterForm from .services import algorithms @@ -133,11 +133,7 @@ class TaskListViewAPI(generics.ListCreateAPIView): model = Task queryset = Task.objects.all() serializer_class = TaskSerializer - def get_serializer_class(self): - if self.request.method in ['GET']: - return TaskReadSerializer - else: - return TaskSerializer + # using the Django Filter Backend - https://django-filter.readthedocs.io/en/latest/index.html filter_backends = (filters.DjangoFilterBackend,) filter_class = TaskFilter