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):
task_type = models.CharField(max_length=20, default="task")
# note: the apparent naming reversal is intentional. Predecessors are somebody elses successors.
desired_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)
successor = models.ForeignKey('self', related_name='task_predecessors', on_delete=models.SET_NULL, null=True,blank=True)
# todo: change to Integer... but then the specification service has to be changed to using a dict
# to properly translate a python 'None' string to a Null value.
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")
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)
new_workflow_id = models.CharField(max_length=12, blank=True, null=True)
new_workflow_uri = models.CharField(max_length=100, blank=True, null=True)
stage_request_id = models.IntegerField(default=0)
inputs = models.JSONField(null=True, blank=True)
outputs = models.JSONField(null=True, blank=True)
......@@ -41,7 +42,7 @@ class Task(models.Model):
skip = models.BooleanField(default=False)
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)
def __str__(self):
......@@ -62,7 +63,7 @@ class LogEntry(models.Model):
step_name = models.CharField(max_length=30, blank=True, null=True)
start_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)
def __str__(self):
......
......@@ -2,6 +2,21 @@ from rest_framework import serializers
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):
status_history = serializers.StringRelatedField(
......@@ -12,11 +27,12 @@ class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ('id','task_type','taskID',
'desired_predecessor_id','predecessor','successor',
'new_predecessor_id','predecessor',
'project','sas_id','priority','purge_policy','skip',
'desired_workflow_id','desired_workflow_uri','workflow',
'status','desired_status',
'inputs','outputs','status_history')
'new_workflow_id','new_workflow_uri','workflow',
'stage_request_id',
'status','new_status',
'inputs','outputs','status_history',)
class StatusSerializer(serializers.ModelSerializer):
......
......@@ -35,23 +35,23 @@ def pre_save_task_handler(sender, **kwargs):
def add_workflow(myTaskObject):
desired_workflow_id = myTaskObject.desired_workflow_id
desired_workflow_uri = myTaskObject.desired_workflow_uri
new_workflow_id = myTaskObject.new_workflow_id
new_workflow_uri = myTaskObject.new_workflow_uri
# first try to find the workflow by desired workflow_id
try:
desired_workflow = Workflow.objects.get(id=desired_workflow_id)
new_workflow = Workflow.objects.get(id=new_workflow_id)
except:
desired_workflow = None
new_workflow = None
if (desired_workflow == None):
if (new_workflow == None):
# 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
if (myTaskObject.workflow != desired_workflow):
if (myTaskObject.workflow != new_workflow):
# set the new status
myTaskObject.workflow = desired_workflow
myTaskObject.workflow = new_workflow
return myTaskObject
......@@ -60,14 +60,14 @@ def add_predecessor(myTaskObject):
# connect the task to a workflow after posting a (flat) task through the REST API
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
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
myTaskObject.predecessor = desired_predecessor
myTaskObject.predecessor = new_predecessor
except:
pass
......@@ -89,15 +89,15 @@ def handle_pre_save(sender, **kwargs):
# handle status change
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
myTaskObject.status = desired_status
myTaskObject.status = new_status
# 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()
# 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):
connect_signals()
# dispatch a job if the status has changed.
if (desired_status != None) and (status != desired_status):
jobs.dispatchJob(myTaskObject, desired_status)
if (new_status != None) and (status != new_status):
jobs.dispatchJob(myTaskObject, new_status)
@receiver(post_save, sender=Task)
......@@ -137,10 +137,10 @@ def handle_post_save(sender, **kwargs):
logger.info("save new "+str(myTaskObject.task_type))
# 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
myStatus = Status(name=myTaskObject.desired_status, task=myTaskObject)
myStatus = Status(name=myTaskObject.new_status, task=myTaskObject)
myStatus.save()
# temporarily disconnect the post_save handler to save the dataproduct (again) and avoiding recursion.
......
......@@ -39,12 +39,11 @@ TD {
color: red;
}
.staging,.submitting,.running,.ingesting {
.defining,.staging,.submitting,.running,.ingesting {
font-style: italic;
color: green;
font-weight: bold;
}
.running {
.processing {
font-weight: bold;
background-color: lightyellow;
}
......
......@@ -17,14 +17,14 @@
<table class="table table-striped table-bordered table-sm">
<thead>
<tr>
<th width="3%">TaskID</th>
<th width="10%">task_type</th>
<th width="5%">TaskID</th>
<th width="3%">task_type</th>
<th>Project</th>
<th>Workflow</th>
<th>Status</th>
<th>Created</th>
<th>Quality</th>
<th>Size</th>
<th>Details</th>
<th>Actions</th>
</tr>
</thead>
......@@ -44,7 +44,7 @@
</div>
{% include 'taskdatabase/pagination.html' %}
</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">
(function(seconds) {
var refresh,
......
{% load static %}
{% for task in my_tasks %}
{% if task.my_status != "removed_invisible" %}
{% if task.status != "removed_invisible" %}
<div class="row">
<tr class="{{ task.my_status }}">
<tr class="{{ task.status }}">
<td>
......@@ -14,66 +14,49 @@
</td>
<td>{{ task.project }}</td>
<td>
{% if task.my_status != "valid_priority" %}
{{ 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.workflow }}
<td>{{ task.status }}</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>
{% if "removed" in task.my_status and task.quality != "unknown" %}
{{ task.quality }}
{% endif %}
</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>
{% 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>
{% 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>
{% 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>
{% 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>
{% 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 'completed' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Ingest</a>
{% 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 'completed' my_tasks.number %}" class="btn btn-primary btn-sm" role="button">Cancel Ingest</a>
{% 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_bad' my_tasks.number %}" class="btn btn-danger btn-sm" role="button">Data is Bad</a>
{% 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_bad' my_tasks.number %}" class="btn btn-danger btn-sm" role="button">Data is Bad</a>
{% endif %}
......
......@@ -24,7 +24,7 @@ urlpatterns = [
name='get-next-taskid-view'),
# --- controller resources ---
path('tasks/<int:pk>/setstatus/<desired_status>/<page>',
path('tasks/<int:pk>/setstatus/<new_status>/<page>',
views.TaskSetStatus,
name='task-setstatus-view'),
......
......@@ -189,7 +189,7 @@ class LogEntryDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView):
# --- 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):
......@@ -200,10 +200,10 @@ def Skip(request,pk,skip_it,page):
return redirect('/atdb/?page='+page)
def TaskSetStatus(request,pk,desired_status,page):
def TaskSetStatus(request,pk,new_status,page):
model = Task
task = Task.objects.get(pk=pk)
task.desired_status = desired_status
task.new_status = new_status
task.save()
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