From 6751dca63ad80bad378f6971dfb324931c7aa25c Mon Sep 17 00:00:00 2001
From: Vermaas <vermaas@astron.nl>
Date: Mon, 5 Feb 2024 13:04:06 +0100
Subject: [PATCH] experimenting with activities

---
 atdb/taskdatabase/services/activities.py      | 11 ++++-
 atdb/taskdatabase/services/signals.py         | 22 ++++++++++
 .../templates/taskdatabase/ingest2/page.html  |  4 +-
 .../taskdatabase/ingest2/pagination.html      | 43 +++++++++++++++++++
 atdb/taskdatabase/views.py                    |  2 +-
 5 files changed, 77 insertions(+), 5 deletions(-)
 create mode 100644 atdb/taskdatabase/templates/taskdatabase/ingest2/pagination.html

diff --git a/atdb/taskdatabase/services/activities.py b/atdb/taskdatabase/services/activities.py
index a34cd5bf..534705f2 100644
--- a/atdb/taskdatabase/services/activities.py
+++ b/atdb/taskdatabase/services/activities.py
@@ -1,7 +1,8 @@
-
+import logging;
 from .common import State
 from taskdatabase.models import Task, Activity
 
+logger = logging.getLogger(__name__)
 
 def calculate_ingested_fraction(this_task):
     """
@@ -52,10 +53,14 @@ def update_activity(task):
     - to SCRUBBED, ARCHIVING, ARCHIVED, FINISHED : calculate ingested_fraction
 
     """
+    logger.info(f'update_activity for task {task.id} with sas_id {task.sas_id} and status {task.status}')
+
     try:
         activity = Activity.objects.get(sas_id=task.sas_id)
     except:
         # no activity exists yet, create it
+        logger.info(f'create new activity for sas_id {task.sas_id}')
+
         activity = Activity(sas_id=task.sas_id,
                             workflow=task.workflow,
                             project=task.project,
@@ -66,12 +71,14 @@ def update_activity(task):
 
     # depending on the status transition, perform calculations
     if task.status == State.STORED.value:
+        logger.info(f'- calculate_qualities')
         # quality is calculated per task and per sas_id, reget the quality per sas_id
         activity.calculated_quality = task.calculated_qualities['per_sasid']
         activity.save()
 
     # calculate the fraction and list of statusses of ingested tasks of this SAS_ID
     if task.status in [State.SCRUBBED.value, State.ARCHIVING.value, State.ARCHIVED.value, State.FINISHING.value]:
+        logger.info(f'- calculate_ingested_fraction')
         result = calculate_ingested_fraction(task)
         activity.ingested_fraction = result['completion']
         activity.ingestq_status = result['status']
@@ -80,7 +87,7 @@ def update_activity(task):
 
     # check of any task of this activity already has LTA information. If so, copy to the activity level
     if task.status in [State.ARCHIVING.value, State.ARCHIVED.value, State.FINISHING.value]:
-
+        logger.info(f'- add archive json')
         for t in Task.objects.filter(sas_id=task.sas_id):
             try:
                 if t.archive['sas_id_archived']:
diff --git a/atdb/taskdatabase/services/signals.py b/atdb/taskdatabase/services/signals.py
index 42ae560a..05d0c9c5 100644
--- a/atdb/taskdatabase/services/signals.py
+++ b/atdb/taskdatabase/services/signals.py
@@ -49,6 +49,26 @@ def handle_pre_save(sender, **kwargs):
         myStatus.save()
 
 
+    # temporarily disconnect to avoid recursion.
+    # update_activity(task)
+
+    disconnect_signals()
+    task.save()
+    connect_signals()
+
+
+@receiver(post_save, sender=Task)
+def post_save_task_handler(sender, **kwargs):
+    handle_post_save(sender, **kwargs)
+
+def handle_post_save(sender, **kwargs):
+    """
+    post_save handler. Update activities and do some calculations
+    :param (in) sender: The model class that sends the trigger
+    :param (in) kwargs: The instance of the object that sends the trigger.
+    """
+    task = kwargs.get('instance')
+
     # temporarily disconnect to avoid recursion.
     update_activity(task)
 
@@ -60,7 +80,9 @@ def handle_pre_save(sender, **kwargs):
 def connect_signals():
     #logger.info("connect_signals")
     pre_save.connect(pre_save_task_handler, sender=Task)
+    post_save.connect(post_save_task_handler, sender=Task)
 
 def disconnect_signals():
     #logger.info("disconnect_signals")
     pre_save.disconnect(pre_save_task_handler, sender=Task)
+    post_save.disconnect(post_save_task_handler, sender=Task)
\ No newline at end of file
diff --git a/atdb/taskdatabase/templates/taskdatabase/ingest2/page.html b/atdb/taskdatabase/templates/taskdatabase/ingest2/page.html
index 60539738..70442ffc 100644
--- a/atdb/taskdatabase/templates/taskdatabase/ingest2/page.html
+++ b/atdb/taskdatabase/templates/taskdatabase/ingest2/page.html
@@ -19,7 +19,7 @@
         </div>
         <div class="row">
         <div class="col-sm-12 col-md-12 col-lg-12">
-            {% include 'taskdatabase/pagination.html' %}
+            {% include 'taskdatabase/ingest2/pagination.html' %}
             &nbsp;
             {% if my_activities %}
             <div class="panel panel-success">
@@ -40,7 +40,7 @@
 
                 </div>
             </div>
-            {% include 'taskdatabase/pagination.html' %}
+            {% include 'taskdatabase/ingest2/pagination.html' %}
            </div>
         </div>
        </div>
diff --git a/atdb/taskdatabase/templates/taskdatabase/ingest2/pagination.html b/atdb/taskdatabase/templates/taskdatabase/ingest2/pagination.html
new file mode 100644
index 00000000..64ab02c0
--- /dev/null
+++ b/atdb/taskdatabase/templates/taskdatabase/ingest2/pagination.html
@@ -0,0 +1,43 @@
+    <div class="btn-group" role="group" aria-label="Item pagination" style="margin-bottom: 1rem">
+
+        {% if my_activities.has_previous %}
+            <a href="?page=1" class="btn btn-outline-primary">First</a>
+            <a href="?page={{ my_activities.previous_page_number }}" class="btn btn-outline-primary">Previous</a>
+        {% else %}
+            <button class="btn btn-outline-primary" disabled>First</button>
+            <button class="btn btn-outline-primary" disabled>Previous</button>
+        {% endif %}
+
+        {% for page_number in my_activities.paginator.page_range %}
+            {% if my_activities.number == page_number %}
+                <button class="btn btn-outline-primary active">
+                    <span>{{ page_number }} <span class="sr-only">(current)</span></span>
+                </button>
+            <!-- first and last 20 pages -->
+            {% elif my_activities.number < 10 and page_number < 20 or my_activities.number > my_activities.paginator.num_pages|add:"-10" and page_number > my_activities.paginator.num_pages|add:"-20" %}
+                <a href="?page={{ page_number }}" class="btn btn-outline-primary">
+                    {{ page_number }}
+                </a>
+            <!-- 10 pages around current page -->
+            {% elif page_number < my_activities.number and page_number > my_activities.number|add:"-10" or page_number > my_activities.number and page_number < my_activities.number|add:10 %}
+                <a href="?page={{ page_number }}" class="btn btn-outline-primary">
+                    {{ page_number }}
+                </a>
+            {% endif %}
+        {% endfor %}
+
+        <!-- last page button or ellipsis if last page is too far -->
+        {% if my_activities.number|add:10 < my_activities.paginator.num_pages %}
+            <button class="btn btn-outline-primary" disabled>...</button>
+        {% elif my_activities.number|add:10 == my_activities.paginator.num_pages %}
+            <a href="?page={{ my_activities.paginator.num_pages }}" class="btn btn-outline-primary">{{ my_activities.paginator.num_pages }}</a>
+        {% endif %}
+
+        {% if my_activities.has_next %}
+            <a href="?page={{ my_activities.next_page_number }}" class="btn btn-outline-primary">Next</a>
+            <a href="?page={{ my_activities.paginator.num_pages }}" class="btn btn-outline-primary">Last</a>
+        {% else %}
+            <button class="btn btn-outline-primary" disabled>Next</button>
+            <button class="btn btn-outline-primary" disabled>Last</button>
+        {% endif %}
+    </div>
diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py
index c4145658..c86f01dd 100644
--- a/atdb/taskdatabase/views.py
+++ b/atdb/taskdatabase/views.py
@@ -511,7 +511,7 @@ class ShowIngestQPage2(ListView):
 
         activities = Activity.objects.filter(
             Q(ingestq_status__icontains=State.SCRUBBED.value) |
-            (Q(ingested_fraction__gt=0) & Q(ingested_fraction__lt=100) ))
+            (Q(ingested_fraction__gt=0) & Q(ingested_fraction__lt=100) )).order_by('-sas_id')
 
         # exclude the failed tasks
         paginator = Paginator(activities, config.TASKS_PER_PAGE_SMALL)  # Show 10 tasks per page
-- 
GitLab