From 883b7b31b4dc87932df6874374356c09a03ddc2c Mon Sep 17 00:00:00 2001 From: Nico Vermaas <vermaas@astron.nl> Date: Mon, 17 Jan 2022 15:19:19 +0100 Subject: [PATCH] add PostProcessingRule object to database https://support.astron.nl/jira/browse/SDC-475 --- atdb/atdb/static/taskdatabase/style.css | 8 +++++ .../migrations/0008_postprocessingrule.py | 24 +++++++++++++ atdb/taskdatabase/models.py | 11 +++++- atdb/taskdatabase/serializers.py | 8 ++++- atdb/taskdatabase/static/css/sb-admin.css | 2 +- .../static/taskdatabase/style.css | 8 +++++ .../templates/taskdatabase/index.html | 2 +- atdb/taskdatabase/urls.py | 3 ++ atdb/taskdatabase/views.py | 34 +++++++++++++++++-- 9 files changed, 94 insertions(+), 6 deletions(-) create mode 100644 atdb/taskdatabase/migrations/0008_postprocessingrule.py diff --git a/atdb/atdb/static/taskdatabase/style.css b/atdb/atdb/static/taskdatabase/style.css index 64ce54c1..ead914e1 100644 --- a/atdb/atdb/static/taskdatabase/style.css +++ b/atdb/atdb/static/taskdatabase/style.css @@ -96,4 +96,12 @@ p.title { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; +} + +.modal-body { + padding: 0 !important; +} + +.modal-dialog .modal-lg { + max-width: 75% !important; } \ No newline at end of file diff --git a/atdb/taskdatabase/migrations/0008_postprocessingrule.py b/atdb/taskdatabase/migrations/0008_postprocessingrule.py new file mode 100644 index 00000000..5b79b84b --- /dev/null +++ b/atdb/taskdatabase/migrations/0008_postprocessingrule.py @@ -0,0 +1,24 @@ +# Generated by Django 3.1.4 on 2022-01-17 13:50 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('taskdatabase', '0007_auto_20211214_0941'), + ] + + operations = [ + migrations.CreateModel( + name='PostProcessingRule', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('aggregation_key', models.CharField(blank=True, db_index=True, default=None, max_length=20, null=True)), + ('trigger_status', models.CharField(blank=True, db_index=True, default='unknown', max_length=50, null=True)), + ('workflow_to_apply', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='to_apply', to='taskdatabase.workflow')), + ('workflow_to_process', models.ForeignKey(blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name='to_process', to='taskdatabase.workflow')), + ], + ), + ] diff --git a/atdb/taskdatabase/models.py b/atdb/taskdatabase/models.py index a514a48b..05ac8d4b 100644 --- a/atdb/taskdatabase/models.py +++ b/atdb/taskdatabase/models.py @@ -115,4 +115,13 @@ class Job(models.Model): # the representation of the value in the REST API def __str__(self): - return 'task_id:'+str(self.task_id)+', job_id:'+str(self.job_id) \ No newline at end of file + return 'task_id:'+str(self.task_id)+', job_id:'+str(self.job_id) + + +class PostProcessingRule(models.Model): + aggregation_key = models.CharField(db_index=True, max_length=20, default=None,null=True, blank=True) + trigger_status = models.CharField(db_index=True, default="unknown", max_length=50, blank=True, null=True) + + # relationships + workflow_to_process = models.ForeignKey(Workflow, related_name='to_process', on_delete=models.SET_NULL, null=True, blank=True) + workflow_to_apply = models.ForeignKey(Workflow, related_name='to_apply',on_delete=models.SET_NULL, null=True, blank=True) diff --git a/atdb/taskdatabase/serializers.py b/atdb/taskdatabase/serializers.py index bc8de136..af0c9704 100644 --- a/atdb/taskdatabase/serializers.py +++ b/atdb/taskdatabase/serializers.py @@ -1,5 +1,5 @@ from rest_framework import serializers -from .models import Status, Task, Workflow, LogEntry, Configuration, Job +from .models import Status, Task, Workflow, LogEntry, Configuration, Job, PostProcessingRule @@ -163,3 +163,9 @@ class JobSerializer(serializers.ModelSerializer): class Meta: model = Job fields = "__all__" + +class PostProcessingRuleSerializer(serializers.ModelSerializer): + + class Meta: + model = PostProcessingRule + fields = "__all__" \ No newline at end of file diff --git a/atdb/taskdatabase/static/css/sb-admin.css b/atdb/taskdatabase/static/css/sb-admin.css index 88836d67..549ed4d6 100644 --- a/atdb/taskdatabase/static/css/sb-admin.css +++ b/atdb/taskdatabase/static/css/sb-admin.css @@ -6322,7 +6322,7 @@ a.close.disabled { @media (min-width: 992px) { .modal-lg, .modal-xl { - max-width: 800px; + max-width: 75%; } } diff --git a/atdb/taskdatabase/static/taskdatabase/style.css b/atdb/taskdatabase/static/taskdatabase/style.css index d6a2ebd6..9fd5dc51 100644 --- a/atdb/taskdatabase/static/taskdatabase/style.css +++ b/atdb/taskdatabase/static/taskdatabase/style.css @@ -96,4 +96,12 @@ p.title { margin-bottom: 10px; border-top-left-radius: 0; border-top-right-radius: 0; +} + +.modal-body { + padding: 0 !important; +} + +.modal-dialog .modal-lg { + max-width: 75% !important; } \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index a9720c18..aca28baa 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -80,7 +80,7 @@ {% include 'taskdatabase/pagination.html' %} </div> </div> - <p class="footer"> Version 1.0.0 (3 jan 2021 - 17:00) + <p class="footer"> Version 1.0.0 (17 jan 2021 - 15:00) </div> diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index 6728fe0e..236a3a1e 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -46,6 +46,9 @@ urlpatterns = [ path('jobs/', views.JobListViewAPI.as_view()), path('jobs/<int:pk>/', views.JobDetailsViewAPI.as_view(), name='job-detail-view-api'), + path('postprocessing/', views.PostProcessingRuleListViewAPI.as_view()), + path('postprocessing/<int:pk>/', views.PostProcessingRuleDetailsViewAPI.as_view(), name='postprocessing-detail-view-api'), + # --- custom requests --- # /atdb/get_size?status__in=defined,staged path('tasks/get_size/', views.GetSizeView.as_view(), name='get-size-view'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index 33840c27..42c60a83 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -22,7 +22,7 @@ from django.shortcuts import render, redirect from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger from django.conf import settings -from .models import Task, Status, Workflow, LogEntry, Configuration, Job +from .models import Task, Status, Workflow, LogEntry, Configuration, Job, PostProcessingRule from .tables import TaskTable from django.db.models import Q @@ -33,7 +33,7 @@ from .serializers import \ WorkflowSerializer,\ LogEntrySerializer,\ ConfigurationSerializer,\ - JobSerializer + JobSerializer, PostProcessingRuleSerializer from .services import algorithms @@ -123,6 +123,18 @@ class JobFilter(filters.FilterSet): 'job_id': ['exact'], } +class PostProcessingFilter(filters.FilterSet): + + class Meta: + model = PostProcessingRule + + fields = { + 'aggregation_key': ['exact', 'icontains', 'in'], + 'trigger_status': ['exact', 'icontains', 'in'], + 'workflow_to_process__id': ['exact'], + 'workflow_to_apply__id': ['exact'], + } + # ---------- Tables2 Views (experimental) ----------- # implementation with tables2: http://localhost:8000/atdb/tables2 class QueryView(SingleTableMixin, FilterView): @@ -444,6 +456,7 @@ class ConfigurationDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): queryset = Configuration.objects.all() serializer_class = ConfigurationSerializer + # example: /atdb/job/ class JobListViewAPI(generics.ListCreateAPIView): model = Job @@ -460,6 +473,23 @@ class JobDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): queryset = Job.objects.all() serializer_class = JobSerializer + +# example: /atdb/job/ +class PostProcessingRuleListViewAPI(generics.ListCreateAPIView): + model = PostProcessingRule + queryset = PostProcessingRule.objects.all() + serializer_class = PostProcessingRuleSerializer + + filter_backends = (filters.DjangoFilterBackend,) + filter_class = PostProcessingFilter + + +# example: /atdb/job/5/ +class PostProcessingRuleDetailsViewAPI(generics.RetrieveUpdateDestroyAPIView): + model = PostProcessingRule + queryset = PostProcessingRule.objects.all() + serializer_class = PostProcessingRuleSerializer + # --- controller resources, triggered by a button in the GUI or directoy with a URL --- # set task status to 'new_status' - called from the GUI -- GitLab