diff --git a/atdb/taskdatabase/templates/astronauth/navbar.html b/atdb/taskdatabase/templates/astronauth/navbar.html index 8b9121f1ed80811702f20c57ddffabcbd4bf9f28..02b3cf1f2168d17136d4b62e9fa2dd921b43735a 100644 --- a/atdb/taskdatabase/templates/astronauth/navbar.html +++ b/atdb/taskdatabase/templates/astronauth/navbar.html @@ -28,6 +28,7 @@ <li><a class="nav-link" href="{% url 'quality' %}">Quality</a></li> <li><a class="nav-link" href="{% url 'validation' %}">Validation</a></li> <li><a class="nav-link" href="{% url 'failures' %}">Failures</a></li> + <li><a class="nav-link" href="{% url 'discarded' %}">Discarded</a></li> <li><a class="nav-link" href="{% url 'finished' %}">Finished</a></li> <li><a class="nav-link" href="{% url 'monitoring' %}">Monitoring</a></li> <li><a class="nav-link" href="{% url 'diagram' %}">Diagram</a></li> diff --git a/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html b/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html index 40d040726da1185196d61a31c4020442b38cc3d8..4725101ecd71a85212d8a6a84c7ab6265ba57186 100644 --- a/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/archived/tasks.html @@ -26,9 +26,9 @@ </td> <td> <a class="open-modal btn btn-primary btn-sm" - href="{% url 'workflow-details' task.workflow %}" - data-popup-url="{% url 'workflow-details' task.workflow %}" - target="_blank"><i class="fas fa-project-diagram"></i> {{ task.workflow }} + href="{% url 'workflow-details' task.workflow.id %}" + data-popup-url="{% url 'workflow-details' task.workflow.id %}" + target="_blank"><i class="fas fa-project-diagram"></i> {{ task.workflow.id }} </a></td> </td> {% if task.resume %} diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html b/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html new file mode 100644 index 0000000000000000000000000000000000000000..765c5664d54b4df4e72ab6e4be7df8cec6141aa1 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html @@ -0,0 +1,30 @@ +<tr> + <th> + <a href="{% url 'sort-tasks' '-pk' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + ID + <a href="{% url 'sort-tasks' 'id' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th>Details</th> + <th> + <a href="{% url 'sort-tasks' '-status' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Status + <a href="{% url 'sort-tasks' 'status' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-project' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Project + <a href="{% url 'sort-tasks' 'project' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-sas_id' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + SAS_ID + <a href="{% url 'sort-tasks' 'sas_id' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th> + <a href="{% url 'sort-tasks' '-filter' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-up"></i></a> + Filter + <a href="{% url 'sort-tasks' 'filter' 'discarded' %}" class="btn btn-light btn-sm" role="button"><i class="fas fa-sort-down"></i></a> + </th> + <th>Cleanup Policy</th> + <th>Remarks</th> +</tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/page.html b/atdb/taskdatabase/templates/taskdatabase/discarded/page.html new file mode 100644 index 0000000000000000000000000000000000000000..79fbe26f757558e5bba6c1cf6f491010ff069492 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/discarded/page.html @@ -0,0 +1,51 @@ +{% extends 'taskdatabase/base.html' %} +{% load static %} + +{% block myBlock %} + +<div class="container-fluid details-container"> + <div class="card"> + <div class="card-body"> + <div class="row"> + <div class="col-8"> + <h3>Discarded</h3> + These the discarded tasks, invisible in the rest of ATDB. + <td>{% include 'taskdatabase/filter/search.html' %}</td> + <hr> + </div> + </div> + <div class="row"> + <div class="col-sm-12 col-md-12 col-lg-12"> + {% include 'taskdatabase/pagination.html' %} + + {% if my_tasks %} + <div class="panel panel-success"> + + <div class="panel-body"> + + <table class="table table-striped table-bordered table-sm"> + <thead> + {% include 'taskdatabase/discarded/headers.html' %} + </thead> + <tbody> + {% include 'taskdatabase/discarded/tasks.html' %} + </tbody> + </table> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + + </div> + </div> + {% include 'taskdatabase/pagination.html' %} + </div> + </div> + </div> + </div> +</div> + +{% include 'taskdatabase/no_refresh.html' %} + + +{% endblock %} + diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html b/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html new file mode 100644 index 0000000000000000000000000000000000000000..7dce28399612329adc74422498d626f0749facea --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html @@ -0,0 +1,48 @@ +{% load static %} +{% for task in my_tasks %} + + {% if task.status != "removed_invisible" %} + <div class="row"> + <tr> + + <td> + <a href="{{ task.get_absolute_url }}" target="_blank">{{ task.id }} </a> + </td> + <td> + {% if user.is_authenticated %} + <a class="btn btn-primary btn-sm" + href="{% url 'task-details' task.id my_tasks.number %}" + data-popup-url="{% url 'task-details' task.id my_tasks.number %}" + ><i class="fas fa-list"></i> Details + </a> + {% endif %} + {% if task.has_quality %} + <a class="open-modal btn btn-primary btn-sm" + href="{% url 'task-quality' task.id my_tasks.number %}" + data-popup-url="{% url 'task-quality' task.id my_tasks.number %}" + ><i class="fas fa-balance-scale"></i> Quality + </a> + {% endif %} + </td> + + {% if task.resume %} + <td class="bigger">{{ task.status }}</td> + {% endif %} + {% if not task.resume %} + <td class="bigger">{{ task.status }} (holding)</td> + {% endif %} + + <td>{{ task.project }}</td> + <td>{{ task.sas_id }}</td> + + <td>{{ task.filter }} </td> + <td>{{ task.cleanup_policy }} </td> + <td>{{ task.remarks }} </td> + </tr> + </div> + {% endif %} + +{% endfor %} + +{% include "taskdatabase/modal/modal_script.html" %} +{% include "taskdatabase/modal/modal.html" %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/confirm_discard.html b/atdb/taskdatabase/templates/taskdatabase/failures/confirm_discard.html new file mode 100644 index 0000000000000000000000000000000000000000..f69b24b98f03639f86d3744f775ab8715240dbad --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/failures/confirm_discard.html @@ -0,0 +1,24 @@ +{% extends 'taskdatabase/base.html' %} + +{% block myBlock %} +<div class="container-fluid details-container"> + + + <div class="card"> + <div class="card-body"> + + <form action="./{{ page }}" method="POST">{% csrf_token %} + <div class="text-center"> + <h4>Are you sure you want to discard task {{ task.id }}?</h4> + + <p> + <button class="btn btn-success btn-sm" type="submit"><i class="fas fa-check"></i> OK</button> + <a href="{% url 'failures' %}" class="btn btn-warning btn-sm" role="button"><i class="fas fa-times-circle"></i> Cancel</a>  + </p> + </div> + </form> + + </div> + </div> +</div> +{% endblock %} \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html index 51bd7cabba1fc72a5ae5fea04e123f93f51f29f8..3d167b86877a4f427f6595eea4bd35814d25e0cc 100644 --- a/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html @@ -20,7 +20,7 @@ <a class="open-modal btn btn-primary btn-sm" href="{% url 'task-quality' task.id my_tasks.number %}" data-popup-url="{% url 'task-quality' task.id my_tasks.number %}" - ><i class="fas fa-balance-scale-right"></i> Quality + ><i class="fas fa-balance-scale"></i> Quality </a> {% endif %} </td> @@ -38,7 +38,11 @@ <td>{{ task.filter }} </td> - <td>{% include "taskdatabase/failures/retry_buttons.html" %}</td> + <td> + {% include "taskdatabase/failures/retry_buttons.html" %} + <a href="{% url 'task-discard-view' task.pk 'discarded' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-trash-alt"></i> Discard</a> + + </td> </tr> </div> diff --git a/atdb/taskdatabase/templates/taskdatabase/index.html b/atdb/taskdatabase/templates/taskdatabase/index.html index a1bf1e87502b79b0e24be60140f1abd85806ec44..7a55509e6cb7b9d1634d5ebfd97f4c02795c8c67 100644 --- a/atdb/taskdatabase/templates/taskdatabase/index.html +++ b/atdb/taskdatabase/templates/taskdatabase/index.html @@ -8,34 +8,30 @@ {% include 'taskdatabase/filter/filter_buttons.html' %} <div class="row"> - <div class="col-sm-12 col-md-12 col-lg-12"> - {% include 'taskdatabase/pagination.html' %} - - {% if my_tasks %} - <div class="panel panel-success"> - - <div class="panel-body"> - - <table class="table table-striped table-bordered table-sm"> - - <thead> - {% include 'taskdatabase/tasks_headers.html' %} - </thead> - <tbody> - {% include 'taskdatabase/tasks.html' %} - </tbody> - </table> - {% else %} - <p>No recent Tasks.</p> - {% endif %} - + <div class="col-sm-12 col-md-12 col-lg-12"> + {% include 'taskdatabase/pagination.html' %} + + {% if my_tasks %} + <div class="panel panel-success"> + + <div class="panel-body"> + <table class="table table-striped table-bordered table-sm"> + <thead> + {% include 'taskdatabase/tasks_headers.html' %} + </thead> + <tbody> + {% include 'taskdatabase/tasks.html' %} + </tbody> + </table> + {% else %} + <p>No recent Tasks.</p> + {% endif %} + </div> </div> + {% include 'taskdatabase/pagination.html' %} </div> - {% include 'taskdatabase/pagination.html' %} - </div> </div> <p class="footer"> Version 4 May 2023 - </div> {% include 'taskdatabase/refresh.html' %} diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks.html b/atdb/taskdatabase/templates/taskdatabase/tasks.html index ca912c2ce1448c150b1c95a218725da2ef22808d..09f0ec7fe2ad91643e1243b04f63bc7050b7cdac 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks.html @@ -26,8 +26,8 @@ </td> <td> <a class="open-modal btn btn-primary btn-sm" - href="{% url 'workflow-details' task.workflow %}" - data-popup-url="{% url 'workflow-details' task.workflow %}" + href="{% url 'workflow-details' task.workflow.id %}" + data-popup-url="{% url 'workflow-details' task.workflow.id %}" target="_blank"><i class="fas fa-project-diagram"></i> {{ task.workflow.id }} </a></td> </td> diff --git a/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html b/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html index 54f6a7844161168f89d0b84ff507b8e6fda2da70..3daf2386b259fd302d334c819d55f0a894fa5e52 100644 --- a/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html +++ b/atdb/taskdatabase/templates/taskdatabase/tasks/details_card.html @@ -19,8 +19,8 @@ <tr class="{{ task.status }}"><td><b>status</b></td><td>{{ task.status }}</td></tr> <tr><td><b>workflow</b></td><td> <a class="open-modal btn btn-primary btn-sm" - href="{% url 'workflow-details' task.workflow %}" - data-popup-url="{% url 'workflow-details' task.workflow %}" + href="{% url 'workflow-details' task.workflow.id %}" + data-popup-url="{% url 'workflow-details' task.workflow.id %}" target="_blank"><i class="fas fa-project-diagram"></i> {{ task.workflow }} </a> {% if user.is_staff %} @@ -63,12 +63,13 @@ <tr><td><b>creationTime</b></td><td>{{ task.creationTime|date:"Y-m-d H:i:s" }}</td></tr> <tr><td><b>purge_policy</b></td><td>{{ task.purge_policy }}</td></tr> + <tr><td><b>cleanup_policy</b></td><td>{{ task.cleanup_policy }}</td></tr> <tr><td><b>resume</b></td><td>{{ task.resume }}</td></tr> <tr><td><b>stage_request_id</b></td><td>{{ task.stage_request_id }}</td></tr> <tr><td><b>size_to_process</b></td><td>{{ task.size_to_process|filesizeformat }}</td></tr> <tr><td><b>size_processed</b></td><td>{{ task.size_processed|filesizeformat }}</td></tr> <tr><td><b>total_processing_time</b></td><td>{{ task.total_processing_time }}</td></tr> - + <tr><td><b>remarks</b></td><td>{{ task.remarks }}</td></tr> </tbody> </table> </div> diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index 221d39ac911e24a19cd698493a7564de432c4c8a..636b2f38c48b033a2a3415346d162e7c394f36c8 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -18,6 +18,7 @@ urlpatterns = [ path('quality', views.ShowQualityPage.as_view(), name='quality'), path('validation', views.ShowValidationPage.as_view(), name='validation'), path('failures', views.ShowFailuresPage.as_view(), name='failures'), + path('discarded', views.ShowDiscardedPage.as_view(), name='discarded'), path('finished', views.ShowFinishedPage.as_view(), name='finished'), path('task_details/<int:id>/<page>', views.TaskDetails, name='task-details'), @@ -95,7 +96,8 @@ urlpatterns = [ path('tasks/<int:pk>/setstatus/<new_status>', views.TaskSetStatus, name='task-details-setstatus'), path('tasks/<int:pk>/validate/<quality>/<new_status>/<page>', views.TaskValidate, name='task-validate-view'), - path('tasks/<int:pk>/retry//<new_status>/<page>', views.TaskRetry, name='task-retry-view'), + path('tasks/<int:pk>/retry/<new_status>/<page>', views.TaskRetry, name='task-retry-view'), + path('tasks/<int:pk>/discard/<new_status>/<page>', views.TaskDiscard, name='task-discard-view'), path('tasks/<int:pk>/change_priority/<priority_change>/<page>', views.ChangePriority, name='task-change-priority'), path('tasks/<int:pk>/change_priority/<priority_change>', views.ChangePriority, name='task-change-priority'), diff --git a/atdb/taskdatabase/views.py b/atdb/taskdatabase/views.py index 1393419915a1e1c8926b4b02b984163e40c64c79..e07be8eb2f4e7f13cf21c17549f08175a4d8a1f9 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -405,6 +405,45 @@ class ShowFailuresPage(ListView): return tasks +class ShowDiscardedPage(ListView): + """ + This shows the tasks that are discarded + Note that the global filter is also applied + """ + template_name = 'taskdatabase/discarded/page.html' + + # by default this returns the list in an object called object_list, so use 'object_list' in the html page. + # but if 'context_object_name' is defined, then this returned list is named and can be accessed that way in html. + context_object_name = 'my_tasks' + + def get_queryset(self): + + discarded_tasks = Task.objects.filter(status__icontains='discarded') + tasks = get_filtered_tasks(self.request, discarded_tasks) + + paginator = Paginator(tasks, config.TASKS_PER_PAGE) # Show 50 tasks per page + page = self.request.GET.get('page') + + try: + # check if there was a page on the session, if so, use it. + if page == None: + page = self.request.session['page'] + self.request.session['page'] = None + except: + pass + + try: + tasks = paginator.page(page) + except PageNotAnInteger: + # If page is not an integer, deliver first page. + tasks = paginator.page(1) + except EmptyPage: + # If page is out of range (e.g. 9999), deliver last page of results. + tasks = paginator.page(paginator.num_pages) + + return tasks + + class ShowFinishedPage(ListView): """ This shows the tasks that are archived @@ -1025,7 +1064,7 @@ def TaskSetStatus(request, pk, new_status, page=0): @login_required def TaskValidate(request, pk, quality, new_status, page=0): - model = Task + task = Task.objects.get(pk=pk) # find all tasks with the same SAS_ID, and set this quality to all of them @@ -1047,7 +1086,7 @@ def TaskValidate(request, pk, quality, new_status, page=0): @login_required def TaskRetry(request, pk, new_status, page=0): - model = Task + task = Task.objects.get(pk=pk) task.new_status = new_status task.save() @@ -1059,6 +1098,36 @@ def TaskRetry(request, pk, new_status, page=0): # redirect to tasks list return redirect_with_params('failures', '?page=' + page) +@login_required +def TaskDiscard(request, pk, new_status, page=0): + # TODO: when the cleanup service in place, + # make a change in this line in failures\tasks.html. Change 'discard' into 'discarded'. + # <a href="{% url 'task-discard-view' task.pk 'discarded' my_tasks.number %}" + + task = Task.objects.get(pk=pk) + + if request.method == "POST": + + # set the cleanup_policy, which states what the cleanup service should do with it. + task.cleanup_policy = task.status + + # also add an annotation + try: + task.remarks['discard_reason'] = task.status + except: + task.remarks = {} + task.remarks['discard_reason'] = task.status + + # set the status to discard and save it + task.new_status = new_status + task.save() + + # return to the failures page + return redirect_with_params('failures', '?page=' + page) + + # if not a POST, then render the confirmaton page, which will return to this function with a POST. + return render(request, "taskdatabase/failures/confirm_discard.html", {'task': task, 'page': page}) + # set a filter value in the session, used later by the 'get_searched_tasks' mechanism def TaskSetFilter(request, filter, redirect_to_page):