diff --git a/submissions/templates/submissions/monitor.html b/submissions/templates/submissions/monitor.html new file mode 100644 index 0000000000000000000000000000000000000000..7496c2fb5bafd35729f5d7156fa83bd8e05b565a --- /dev/null +++ b/submissions/templates/submissions/monitor.html @@ -0,0 +1,45 @@ +{% extends 'submissions/base.html' %} + +{% load bootstrap %} + +{% block meta_description %}{{ block.super }} Submissions monitor{% endblock meta_description %} +{% block pagetitle %}: Submissions monitor{% endblock pagetitle %} + +{% block breadcrumb_items %} + <a href="{% url 'scipost:index' %}" class="breadcrumb-item">Homepage</a> + <span class="breadcrumb-item">Submissions</span> + <span class="breadcrumb-item">Monitor</span> +{% endblock %} + +{% block content %} + <div class="row"> + <div class="col"> + <h1 class="highlight">Submissions Monitor</h1> + </div> + </div> + <div class="row"> + <div class="col"> + <h2 class="highlight">Submissions with status: unassigned (awaiting editor assignment)</h2> + <table class="table"> + <thead> + <th>Field</th> + <th>Specialty</th> + <th>Nr awaiting EIC</th> + <th>Total waiting days</th> + <th>Avg waiting days</th> + <th>Max waiting days</th> + </thead> + {% for entry in delays_unassigned %} + <tr{% if entry.avg_waiting_days > 10 %} class="bg-danger text-white"{% elif entry.avg_waiting_days > 5 %} class="bg-warning text-white"{% else %} class="bg-success text-white"{% endif %}> + <td>{{ entry.acad_field }}</td> + <td>{{ entry.specialty }}</td> + <td>{{ entry.number }}</td> + <th>{{ entry.waiting_days }}</th> + <th>{{ entry.avg_waiting_days }}</th> + <th>{{ entry.max_waiting_days }}</th> + </tr> + {% endfor %} + </table> + </div> + </div> +{% endblock content %} diff --git a/submissions/urls.py b/submissions/urls.py index b62fe5ecc531322d391b22d45c4df77847c2144a..e13a35eb2a7e679a1127f1e8b1089d3efa0923d3 100644 --- a/submissions/urls.py +++ b/submissions/urls.py @@ -246,4 +246,11 @@ urlpatterns = [ url(r'^vote_on_rec/(?P<rec_id>[0-9]+)$', views.vote_on_rec, name='vote_on_rec'), url(r'^remind_Fellows_to_vote/(?P<rec_id>[0-9]+)$', views.remind_Fellows_to_vote, name='remind_Fellows_to_vote'), + + # Monitoring + path( + 'monitor', + views.monitor, + name='monitor' + ), ] diff --git a/submissions/views.py b/submissions/views.py index 172d4789578b7e1d84ec3eb3699bebb0e5cbc7e3..b433661d42303bcb1da22cc787fbbb45291ecd0a 100644 --- a/submissions/views.py +++ b/submissions/views.py @@ -2279,3 +2279,48 @@ class PlagiarismReportPDFView(SubmissionAdminViewMixin, SingleObjectMixin, Redir if not url: raise Http404 return url + + +############## +# Monitoring # +############## + +def submissions_processing_delays(submissions): + """ + Generate a tuple containing information about delays on submissions. + """ + delays = [] + now = timezone.now() + from ontology.models import AcademicField + for acad_field in AcademicField.objects.all(): + for specialty in acad_field.specialties.all(): + submissions_in_spec = submissions.filter(acad_field=acad_field, specialties__in=[specialty]) + number = len(submissions_in_spec) + if number > 0: + waiting_days = 0 + max_waiting_days = 0 + for sub in submissions_in_spec.all(): + waiting_days += workdays_between(sub.submission_date, now) + max_waiting_days = max(waiting_days, max_waiting_days) + delays.append({ + 'acad_field': acad_field, + 'specialty': specialty, + 'number': number, + 'waiting_days': waiting_days, + 'avg_waiting_days': round(waiting_days/number, 2), + 'max_waiting_days': max_waiting_days + }) + + + return sorted(delays, key=lambda tup: tup['number'], reverse=True) + + +def monitor(request): + """ + Dashboard providing an overview of the status of submission workflows. + """ + # Compute stats for all submissions under processing + context = { + 'delays_unassigned': submissions_processing_delays(Submission.objects.unassigned()) + } + return render(request, 'submissions/monitor.html', context)