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' %} {% 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