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