diff --git a/atdb/logs/atdb.log b/atdb/logs/atdb.log index 87f2820ef84552f80f63083c1a0147bba0d60a39..06ea631700c580a41acd0b847a83c52ebef045a9 100644 --- a/atdb/logs/atdb.log +++ b/atdb/logs/atdb.log @@ -42,3 +42,15 @@ logging[14/Apr/2023 14:17:24,827] unsupported operand type(s) for +=: 'NoneType' [01/May/2023 17:07:47,382] task 25485 - (regular) - 146233 has no plots, skipped. [01/May/2023 17:07:48,568] unsupported operand type(s) for &: 'bool' and 'str' [01/May/2023 17:07:48,569] task 25485 - (regular) - 146233 has no plots, skipped. +[04/May/2023 14:35:18,946] 'NoneType' object is not subscriptable +[04/May/2023 14:35:18,946] task 25378 - (regular) - 116876 has no plots, skipped. +[04/May/2023 14:35:21,861] 'NoneType' object is not subscriptable +[04/May/2023 14:35:21,861] task 25378 - (regular) - 116876 has no plots, skipped. +[04/May/2023 14:35:52,010] 'NoneType' object is not subscriptable +[04/May/2023 14:35:52,010] task 25378 - (regular) - 116876 has no plots, skipped. +[04/May/2023 14:35:52,100] 'NoneType' object is not subscriptable +[04/May/2023 14:35:52,100] task 25378 - (regular) - 116876 has no plots, skipped. +[04/May/2023 14:35:52,193] 'NoneType' object is not subscriptable +[04/May/2023 14:35:52,193] task 25378 - (regular) - 116876 has no plots, skipped. +[04/May/2023 14:35:52,294] 'NoneType' object is not subscriptable +[04/May/2023 14:35:52,294] task 25378 - (regular) - 116876 has no plots, skipped. diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html b/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html index 765c5664d54b4df4e72ab6e4be7df8cec6141aa1..cb27d6cc9006a2bf1680706790282391b9ccffd3 100644 --- a/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/discarded/headers.html @@ -26,5 +26,5 @@ <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> + <th>Reason</th> </tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html b/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html index 7dce28399612329adc74422498d626f0749facea..ab93845beb36597730d7519419715bf5da19c47c 100644 --- a/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/discarded/tasks.html @@ -37,7 +37,7 @@ <td>{{ task.filter }} </td> <td>{{ task.cleanup_policy }} </td> - <td>{{ task.remarks }} </td> + <td>{{ task.remarks.discard_reason }} </td> </tr> </div> {% endif %} diff --git a/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html index 3d167b86877a4f427f6595eea4bd35814d25e0cc..09c33c875749551bcac92051cfc7a0365828a451 100644 --- a/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/failures/tasks.html @@ -41,7 +41,6 @@ <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> diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html b/atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html new file mode 100644 index 0000000000000000000000000000000000000000..add183b0b428bdb6fd6e8fc139d66cdf4fd6ca99 --- /dev/null +++ b/atdb/taskdatabase/templates/taskdatabase/validation/confirm_discard.html @@ -0,0 +1,31 @@ +{% 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"> + + <h5> Are you sure you want to discard all ({{ count }}) tasks with SAS_ID {{ sas_id }}?</h5> + Enter a reason for discarding (optional) + {% csrf_token %} + + <div> + {{ my_form }} + </div> + + <p> + <button class="btn btn-success btn-sm" type="submit"><i class="fas fa-check"></i> OK</button> + <a href="{% url 'validation' %}" 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/validation/headers.html b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html index 7eba892199d051f15e51caa196417972e2f589aa..9cd3a073b39d0ad794b25d34a6467e172c84f693 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/headers.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/headers.html @@ -22,4 +22,5 @@ <th>Annotate</th> <th>Quality</th> <th>Validate (choose a Q)</th> + <th>Discard</th> </tr> \ No newline at end of file diff --git a/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html index d89f7fa7d330a4da131128cca864fcccabe19161..284464853668f2c72702244d7d12eb8fab1b803d 100644 --- a/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html +++ b/atdb/taskdatabase/templates/taskdatabase/validation/tasks.html @@ -68,7 +68,7 @@ </td> <td class="{{ task.quality }}">{{ task.quality|default_if_none:"-" }}</td> <td>{% include "taskdatabase/validation/validation_buttons.html" %}</td> - + <td><a href="{% url 'task-discard-view-sasid' task.pk 'discarded' my_tasks.number %}" class="btn btn-danger btn-sm" role="button"><i class="fas fa-trash-alt"></i></a></td> </tr> </div> {% endif %} diff --git a/atdb/taskdatabase/urls.py b/atdb/taskdatabase/urls.py index 636b2f38c48b033a2a3415346d162e7c394f36c8..102fe1aa79bd4e346edb0ddd263b42a48da96056 100644 --- a/atdb/taskdatabase/urls.py +++ b/atdb/taskdatabase/urls.py @@ -98,6 +98,7 @@ urlpatterns = [ 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>/discard/<new_status>/<page>', views.TaskDiscard, name='task-discard-view'), + path('tasks/<int:pk>/discard_sasid/<new_status>/<page>', views.TaskDiscardSasId, name='task-discard-view-sasid'), 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 e07be8eb2f4e7f13cf21c17549f08175a4d8a1f9..4f687a9cede8c7752e6cd79b36583b3d9c5d2732 100644 --- a/atdb/taskdatabase/views.py +++ b/atdb/taskdatabase/views.py @@ -1129,6 +1129,51 @@ def TaskDiscard(request, pk, new_status, page=0): return render(request, "taskdatabase/failures/confirm_discard.html", {'task': task, 'page': page}) + +def TaskDiscardSasId(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) + sas_id = task.sas_id + tasks = Task.objects.filter(sas_id=sas_id) + + if request.method == "POST": + form = QualityAnnotationForm(request.POST) + + for task in tasks: + task.cleanup_policy = task.status + + if form.is_valid(): + try: + task.remarks['discard_reason'] = request.POST.get("annotation", "") + except: + task.remarks = {} + task.remarks['discard_reason'] = request.POST.get("annotation", "") + + task.new_status = new_status + task.save() + + # return to the validation page + return redirect_with_params('validation', '?page=' + page) + + else: + # a GET means that the form should be presented to be filled in + try: + discard_reason = task.remarks['discard_reason'] + except: + discard_reason = "" + + count=tasks.count() + + my_form = QualityAnnotationForm(initial={'annotation': discard_reason, 'return_to_page': page}) + + # if not a POST, then render the confirmaton page, which will return to this function with a POST. + return render(request, "taskdatabase/validation/confirm_discard.html", + {'task': task, 'my_form': my_form, 'page': page, 'sas_id': sas_id, 'count': count}) + + # set a filter value in the session, used later by the 'get_searched_tasks' mechanism def TaskSetFilter(request, filter, redirect_to_page): request.session['task_filter'] = filter