Skip to content
Snippets Groups Projects
Commit c36d382d authored by Nico Vermaas's avatar Nico Vermaas
Browse files

adding... loads of stuff

parent b1f451c1
Branches
No related tags found
No related merge requests found
Pipeline #8293 passed
...@@ -21,19 +21,20 @@ class Task(models.Model): ...@@ -21,19 +21,20 @@ class Task(models.Model):
task_type = models.CharField(max_length=20, default="task") task_type = models.CharField(max_length=20, default="task")
# note: the apparent naming reversal is intentional. Predecessors are somebody elses successors. # note: the apparent naming reversal is intentional. Predecessors are somebody elses successors.
desired_predecessor_id = models.CharField(max_length=12, blank=True, null=True) # todo: change to Integer... but then the specification service has to be changed to using a dict
predecessor = models.ForeignKey('self', related_name='task_successors', on_delete=models.SET_NULL, null=True,blank=True) # to properly translate a python 'None' string to a Null value.
successor = models.ForeignKey('self', related_name='task_predecessors', on_delete=models.SET_NULL, null=True,blank=True)
workflow = models.ForeignKey(Workflow, related_name='tasks', on_delete=models.SET_NULL, null=True) new_predecessor_id = models.CharField(max_length=12, blank=True, null=True)
predecessor = models.ForeignKey('self', related_name='task_successors', on_delete=models.SET_NULL, null=True,blank=True)
workflow = models.ForeignKey(Workflow, related_name='tasks', on_delete=models.SET_NULL, null=True, blank=True)
project = models.CharField(max_length=100, blank=True, null=True, default="unknown") project = models.CharField(max_length=100, blank=True, null=True, default="unknown")
sas_id = models.CharField(max_length=30, blank=True, null=True) sas_id = models.CharField(max_length=30, blank=True, null=True)
priority = models.IntegerField(default=0) priority = models.IntegerField(default=0)
purge_policy = models.CharField(max_length=5, default="no", blank=True, null=True) 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) new_workflow_id = models.CharField(max_length=12, blank=True, null=True)
desired_workflow_uri = models.CharField(max_length=100, blank=True, null=True) new_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) stage_request_id = models.IntegerField(default=0)
inputs = models.JSONField(null=True, blank=True) inputs = models.JSONField(null=True, blank=True)
outputs = models.JSONField(null=True, blank=True) outputs = models.JSONField(null=True, blank=True)
...@@ -41,7 +42,7 @@ class Task(models.Model): ...@@ -41,7 +42,7 @@ class Task(models.Model):
skip = models.BooleanField(default=False) skip = models.BooleanField(default=False)
creationTime = models.DateTimeField(default=datetime.utcnow, blank=True) creationTime = models.DateTimeField(default=datetime.utcnow, blank=True)
desired_status = models.CharField(max_length=50, default="defining", null=True) new_status = models.CharField(max_length=50, default="defining", null=True)
status = models.CharField(db_index=True, default="unknown", max_length=50,blank=True, null=True) status = models.CharField(db_index=True, default="unknown", max_length=50,blank=True, null=True)
def __str__(self): def __str__(self):
...@@ -62,7 +63,7 @@ class LogEntry(models.Model): ...@@ -62,7 +63,7 @@ class LogEntry(models.Model):
step_name = models.CharField(max_length=30, blank=True, null=True) step_name = models.CharField(max_length=30, blank=True, null=True)
start_time = models.DateTimeField(blank=True, null=True) start_time = models.DateTimeField(blank=True, null=True)
end_time = models.DateTimeField(blank=True, null=True) end_time = models.DateTimeField(blank=True, null=True)
desired_status = models.CharField(max_length=50, default="defined", blank=True, null=True) new_status = models.CharField(max_length=50, default="defined", blank=True, null=True)
status = models.CharField(max_length=50,default="defined", blank=True, null=True) status = models.CharField(max_length=50,default="defined", blank=True, null=True)
def __str__(self): def __str__(self):
......
...@@ -2,6 +2,21 @@ from rest_framework import serializers ...@@ -2,6 +2,21 @@ from rest_framework import serializers
from .models import Status, Task, Workflow, LogEntry from .models import Status, Task, Workflow, LogEntry
class WorkflowSerializer(serializers.ModelSerializer):
# tasks = serializers.StringRelatedField(
# many=True,
# required=False,
# )
#workflow = WorkflowSerializer()
class Meta:
model = Workflow
fields = "__all__"
class TaskSerializer(serializers.ModelSerializer): class TaskSerializer(serializers.ModelSerializer):
status_history = serializers.StringRelatedField( status_history = serializers.StringRelatedField(
...@@ -12,11 +27,12 @@ class TaskSerializer(serializers.ModelSerializer): ...@@ -12,11 +27,12 @@ class TaskSerializer(serializers.ModelSerializer):
class Meta: class Meta:
model = Task model = Task
fields = ('id','task_type','taskID', fields = ('id','task_type','taskID',
'desired_predecessor_id','predecessor','successor', 'new_predecessor_id','predecessor',
'project','sas_id','priority','purge_policy','skip', 'project','sas_id','priority','purge_policy','skip',
'desired_workflow_id','desired_workflow_uri','workflow', 'new_workflow_id','new_workflow_uri','workflow',
'status','desired_status', 'stage_request_id',
'inputs','outputs','status_history') 'status','new_status',
'inputs','outputs','status_history',)
class StatusSerializer(serializers.ModelSerializer): class StatusSerializer(serializers.ModelSerializer):
......
...@@ -35,23 +35,23 @@ def pre_save_task_handler(sender, **kwargs): ...@@ -35,23 +35,23 @@ def pre_save_task_handler(sender, **kwargs):
def add_workflow(myTaskObject): def add_workflow(myTaskObject):
desired_workflow_id = myTaskObject.desired_workflow_id new_workflow_id = myTaskObject.new_workflow_id
desired_workflow_uri = myTaskObject.desired_workflow_uri new_workflow_uri = myTaskObject.new_workflow_uri
# first try to find the workflow by desired workflow_id # first try to find the workflow by desired workflow_id
try: try:
desired_workflow = Workflow.objects.get(id=desired_workflow_id) new_workflow = Workflow.objects.get(id=new_workflow_id)
except: except:
desired_workflow = None new_workflow = None
if (desired_workflow == None): if (new_workflow == None):
# then try workflow_uri # then try workflow_uri
desired_workflow = Workflow.objects.get(workflow_uri=desired_workflow_uri) new_workflow = Workflow.objects.get(workflow_uri=new_workflow_uri)
# first check if works needs to be done at all # first check if works needs to be done at all
if (myTaskObject.workflow != desired_workflow): if (myTaskObject.workflow != new_workflow):
# set the new status # set the new status
myTaskObject.workflow = desired_workflow myTaskObject.workflow = new_workflow
return myTaskObject return myTaskObject
...@@ -60,14 +60,14 @@ def add_predecessor(myTaskObject): ...@@ -60,14 +60,14 @@ def add_predecessor(myTaskObject):
# connect the task to a workflow after posting a (flat) task through the REST API # connect the task to a workflow after posting a (flat) task through the REST API
try: try:
desired_predecessor_id = myTaskObject.desired_predecessor_id new_predecessor_id = myTaskObject.new_predecessor_id
# first try to find the workflow by desired workflow_id # first try to find the workflow by desired workflow_id
desired_predecessor = Task.objects.get(id=desired_predecessor_id) new_predecessor = Task.objects.get(id=new_predecessor_id)
if (myTaskObject.predecessor != desired_predecessor): if (myTaskObject.predecessor != new_predecessor):
# set the new status # set the new status
myTaskObject.predecessor = desired_predecessor myTaskObject.predecessor = new_predecessor
except: except:
pass pass
...@@ -89,15 +89,15 @@ def handle_pre_save(sender, **kwargs): ...@@ -89,15 +89,15 @@ def handle_pre_save(sender, **kwargs):
# handle status change # handle status change
status = str(myTaskObject.status) status = str(myTaskObject.status)
desired_status = str(myTaskObject.desired_status) new_status = str(myTaskObject.new_status)
if (desired_status!=None) and (status!=desired_status): if (new_status!=None) and (status!=new_status):
# set the new status # set the new status
myTaskObject.status = desired_status myTaskObject.status = new_status
# add the new to the status history by brewing a status object out of it # add the new to the status history by brewing a status object out of it
myStatus = Status(name=desired_status, task=myTaskObject) myStatus = Status(name=new_status, task=myTaskObject)
myStatus.save() myStatus.save()
# connect the task to a workflow after posting a (flat) task through the REST API # connect the task to a workflow after posting a (flat) task through the REST API
...@@ -113,8 +113,8 @@ def handle_pre_save(sender, **kwargs): ...@@ -113,8 +113,8 @@ def handle_pre_save(sender, **kwargs):
connect_signals() connect_signals()
# dispatch a job if the status has changed. # dispatch a job if the status has changed.
if (desired_status != None) and (status != desired_status): if (new_status != None) and (status != new_status):
jobs.dispatchJob(myTaskObject, desired_status) jobs.dispatchJob(myTaskObject, new_status)
@receiver(post_save, sender=Task) @receiver(post_save, sender=Task)
...@@ -137,10 +137,10 @@ def handle_post_save(sender, **kwargs): ...@@ -137,10 +137,10 @@ def handle_post_save(sender, **kwargs):
logger.info("save new "+str(myTaskObject.task_type)) logger.info("save new "+str(myTaskObject.task_type))
# set status # set status
myTaskObject.status = myTaskObject.desired_status myTaskObject.status = myTaskObject.new_status
# add the new to the status history by brewing a status object out of it # add the new to the status history by brewing a status object out of it
myStatus = Status(name=myTaskObject.desired_status, task=myTaskObject) myStatus = Status(name=myTaskObject.new_status, task=myTaskObject)
myStatus.save() myStatus.save()
# temporarily disconnect the post_save handler to save the dataproduct (again) and avoiding recursion. # temporarily disconnect the post_save handler to save the dataproduct (again) and avoiding recursion.
......
...@@ -39,12 +39,11 @@ TD { ...@@ -39,12 +39,11 @@ TD {
color: red; color: red;
} }
.staging,.submitting,.running,.ingesting { .defining,.staging,.submitting,.running,.ingesting {
font-style: italic; font-style: italic;
color: green; color: green;
font-weight: bold;
} }
.running { .processing {
font-weight: bold; font-weight: bold;
background-color: lightyellow; background-color: lightyellow;
} }
......
...@@ -17,14 +17,14 @@ ...@@ -17,14 +17,14 @@
<table class="table table-striped table-bordered table-sm"> <table class="table table-striped table-bordered table-sm">
<thead> <thead>
<tr> <tr>
<th width="3%">TaskID</th> <th width="5%">TaskID</th>
<th width="10%">task_type</th> <th width="3%">task_type</th>
<th>Project</th> <th>Project</th>
<th>Workflow</th>
<th>Status</th> <th>Status</th>
<th>Created</th> <th>Created</th>
<th>Quality</th>
<th>Size</th> <th>Size</th>
<th>Details</th>
<th>Actions</th> <th>Actions</th>
</tr> </tr>
</thead> </thead>
...@@ -44,7 +44,7 @@ ...@@ -44,7 +44,7 @@
</div> </div>
{% include 'taskdatabase/pagination.html' %} {% include 'taskdatabase/pagination.html' %}
</div> </div>
<p class="footer"> Version 1.0.0 (17 jan 2021 - 09:00) <p class="footer"> Version 1.0.0 (21 jan 2021 - 11:00)
<script type="text/javascript"> <script type="text/javascript">
(function(seconds) { (function(seconds) {
var refresh, var refresh,
......
{% load static %} {% load static %}
{% for task in my_tasks %} {% for task in my_tasks %}
{% if task.my_status != "removed_invisible" %} {% if task.status != "removed_invisible" %}
<div class="row"> <div class="row">
<tr class="{{ task.my_status }}"> <tr class="{{ task.status }}">
<td> <td>
...@@ -14,66 +14,49 @@ ...@@ -14,66 +14,49 @@
</td> </td>
<td>{{ task.project }}</td> <td>{{ task.project }}</td>
<td> <td>{{ task.workflow }}
{% if task.my_status != "valid_priority" %} <td>{{ task.status }}</td>
{{ task.my_status }}
{% endif %}
{% if task.my_status == "valid_priority" %}
valid (priority)
{% endif %}
{% if task.my_status == "ingesting" %}
{% if task.control_parameters != "unknown" %}
{{ task.control_parameters }}
{% endif %}
{% endif %}
</td>
<td>{{ task.creationTime|date:"Y-m-d H:i:s" }} </td> <td>{{ task.creationTime|date:"Y-m-d H:i:s" }} </td>
<td>{{ task.endtime|date:"Y-m-d H:i:s" }} </td>
<td>{{ task.size|filesizeformat }} </td> <td>{{ task.size|filesizeformat }} </td>
<td>
{% if "removed" in task.my_status and task.quality != "unknown" %}
{{ task.quality }}
{% endif %}
</td> </td>
<td> <td>
{% if task.my_status == "defined" %} {% if task.status == "defined" %}
<a href="{% url 'task-setstatus-view' task.pk 'scheduled' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Schedule</a> <a href="{% url 'task-setstatus-view' task.pk 'scheduled' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Schedule</a>
{% endif %} {% endif %}
{% if task.my_status == "scheduled" %} {% if task.status == "scheduled" %}
<a href="{% url 'task-setstatus-view' task.pk 'defined' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Unschedule</a> <a href="{% url 'task-setstatus-view' task.pk 'defined' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Unschedule</a>
{% if not task.skip_auto_ingest %} {% if not task.skip_auto_ingest %}
<a href="{% url 'task-skipautoingest-view' task.pk 'true' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Skip Ingest</a> <a href="{% url 'task-skipautoingest-view' task.pk 'true' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Skip Ingest</a>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if task.my_status == "completed" or task.my_status == "incomplete" %} {% if task.status == "completed" or task.status == "incomplete" %}
<a href="{% url 'task-setstatus-view' task.pk 'valid' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Ready to Ingest</a> <a href="{% url 'task-setstatus-view' task.pk 'valid' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Ready to Ingest</a>
{% endif %} {% endif %}
{% if task.my_status == "error (no completing)" or task.my_status == "defined" %} {% if task.status == "error (no completing)" or task.status == "defined" %}
<a href="{% url 'task-setstatus-view' task.pk 'completing' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Completing</a> <a href="{% url 'task-setstatus-view' task.pk 'completing' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Completing</a>
{% endif %} {% endif %}
{% if task.my_status == "valid" %} {% if task.status == "valid" %}
<a href="{% url 'task-setstatus-view' task.pk 'valid_priority' my_tasks.number %}" class="btn btn-warning btn-sm" role="button">Priority Ingest</a> <a href="{% url 'task-setstatus-view' task.pk 'valid_priority' my_tasks.number %}" class="btn btn-warning btn-sm" role="button">Priority Ingest</a>
<a href="{% url 'task-setstatus-view' task.pk 'completed' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Ingest</a> <a href="{% url 'task-setstatus-view' task.pk 'completed' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Ingest</a>
{% endif %} {% endif %}
{% if task.my_status == "valid_priority" %} {% if task.status == "valid_priority" %}
<a href="{% url 'task-setstatus-view' task.pk 'valid' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Priority</a> <a href="{% url 'task-setstatus-view' task.pk 'valid' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Priority</a>
<a href="{% url 'task-setstatus-view' task.pk 'completed' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Ingest</a> <a href="{% url 'task-setstatus-view' task.pk 'completed' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Ingest</a>
{% endif %} {% endif %}
{% if task.my_status == "archived" %} {% if task.status == "archived" %}
<a href="{% url 'task-setquality-view' task.pk 'data_is_good' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Data is Good</a> <a href="{% url 'task-setquality-view' task.pk 'data_is_good' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Data is Good</a>
<a href="{% url 'task-setquality-view' task.pk 'data_is_bad' my_tasks.number %}" class="btn btn-danger btn-sm" role="button">Data is Bad</a> <a href="{% url 'task-setquality-view' task.pk 'data_is_bad' my_tasks.number %}" class="btn btn-danger btn-sm" role="button">Data is Bad</a>
{% endif %} {% endif %}
{% if task.my_status == "removed" and task.quality == "unknown" %} {% if task.status == "removed" and task.quality == "unknown" %}
<a href="{% url 'task-setquality-view' task.pk 'data_is_good' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Data is Good</a> <a href="{% url 'task-setquality-view' task.pk 'data_is_good' my_tasks.number %}" class="btn btn-success btn-sm" role="button">Data is Good</a>
<a href="{% url 'task-setquality-view' task.pk 'data_is_bad' my_tasks.number %}" class="btn btn-danger btn-sm" role="button">Data is Bad</a> <a href="{% url 'task-setquality-view' task.pk 'data_is_bad' my_tasks.number %}" class="btn btn-danger btn-sm" role="button">Data is Bad</a>
{% endif %} {% endif %}
......
...@@ -24,7 +24,7 @@ urlpatterns = [ ...@@ -24,7 +24,7 @@ urlpatterns = [
name='get-next-taskid-view'), name='get-next-taskid-view'),
# --- controller resources --- # --- controller resources ---
path('tasks/<int:pk>/setstatus/<desired_status>/<page>', path('tasks/<int:pk>/setstatus/<new_status>/<page>',
views.TaskSetStatus, views.TaskSetStatus,
name='task-setstatus-view'), name='task-setstatus-view'),
......
...@@ -189,7 +189,7 @@ class LogEntryDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): ...@@ -189,7 +189,7 @@ class LogEntryDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
# --- controller resources, triggered by a button in the GUI or directoy with a URL --- # --- controller resources, triggered by a button in the GUI or directoy with a URL ---
# set task status to 'desired_status' - called from the GUI # set task status to 'new_status' - called from the GUI
def Skip(request,pk,skip_it,page): def Skip(request,pk,skip_it,page):
...@@ -200,10 +200,10 @@ def Skip(request,pk,skip_it,page): ...@@ -200,10 +200,10 @@ def Skip(request,pk,skip_it,page):
return redirect('/atdb/?page='+page) return redirect('/atdb/?page='+page)
def TaskSetStatus(request,pk,desired_status,page): def TaskSetStatus(request,pk,new_status,page):
model = Task model = Task
task = Task.objects.get(pk=pk) task = Task.objects.get(pk=pk)
task.desired_status = desired_status task.new_status = new_status
task.save() task.save()
return redirect('/atdb/?page='+page) return redirect('/atdb/?page='+page)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment