From 3b5b3b84d46dbb952a11477dca11d914af9964af Mon Sep 17 00:00:00 2001 From: Arona Jones Date: Mon, 27 Dec 2021 14:59:30 +0000 Subject: [PATCH] Significant improvements to level list Added search Ordered by qualification count Added display for technician qualifications --- RIGS/templates/event_form.html | 2 +- training/models.py | 10 ++++++++++ training/templates/trainee_list.html | 18 +++++++++++++++--- training/templatetags/tags.py | 5 ++++- training/views.py | 16 ++++++++++++++-- 5 files changed, 44 insertions(+), 7 deletions(-) diff --git a/RIGS/templates/event_form.html b/RIGS/templates/event_form.html index 9c152f6b..3237b557 100644 --- a/RIGS/templates/event_form.html +++ b/RIGS/templates/event_form.html @@ -79,7 +79,7 @@ }); $(function () { $('[data-toggle="tooltip"]').tooltip(); - }) + }); {% endblock %} diff --git a/training/models.py b/training/models.py index 50eb8449..f314deb7 100644 --- a/training/models.py +++ b/training/models.py @@ -4,6 +4,8 @@ from RIGS.models import RevisionMixin, Profile from reversion import revisions as reversion from django.urls import reverse +from django.utils.safestring import SafeData, mark_safe + # 'shim' overtop the profile model to neatly contain all training related fields etc @@ -251,6 +253,14 @@ class TrainingLevelQualification(models.Model, RevisionMixin): reversion_hide = True + @property + def get_icon(self): + if self.level.icon is not None: + icon = "".format(self.level.icon) + else: + icon = "".join([w[0] for w in str(self.level).split()]) + return mark_safe("{}".format(self.level.department_colour, self.level, icon)) + def __str__(self): if self.level.is_common_competencies: return "{} is qualified in the {}".format(self.trainee, self.level) diff --git a/training/templates/trainee_list.html b/training/templates/trainee_list.html index b753921f..ea3a9e15 100644 --- a/training/templates/trainee_list.html +++ b/training/templates/trainee_list.html @@ -5,9 +5,19 @@ {% load paginator from filters %} {% load linkornone from filters %} {% load button from filters %} +{% load get_levels_of_depth from tags %} + +{% block js %} + +{% endblock %} {% block content %} -
+{% include 'partials/list_search.html' %} +
@@ -15,6 +25,7 @@ + @@ -25,9 +36,10 @@ + - - + diff --git a/training/templatetags/tags.py b/training/templatetags/tags.py index e6204063..d980ec0c 100644 --- a/training/templatetags/tags.py +++ b/training/templatetags/tags.py @@ -27,7 +27,10 @@ def percentage_complete(level, user): def colour_from_depth(depth): return models.TrainingItemQualification.get_colour_from_depth(depth) - @register.filter def get_supervisor(tech): return models.TrainingLevel.objects.get(department=tech.department, level=models.TrainingLevel.SUPERVISOR) + +@register.filter +def get_levels_of_depth(trainee, level): + return trainee.level_qualifications(True).filter(level__level=level) diff --git a/training/views.py b/training/views.py index b257e23c..10cfdc18 100644 --- a/training/views.py +++ b/training/views.py @@ -7,6 +7,7 @@ from PyRIGS.views import OEmbedView, is_ajax, ModalURLMixin from training import models, forms from django.utils import timezone from django.db import transaction +from django.db.models import Q, Count from users import views @@ -86,10 +87,21 @@ class TraineeList(generic.ListView): model = models.Trainee template_name = 'trainee_list.html' paginate_by = 25 - ordering = ['qualifications_obtained'] def get_queryset(self): - return self.model.objects.prefetch_related('levels', 'qualifications_obtained') + q = self.request.GET.get('q', "") + + filter = Q(first_name__icontains=q) | Q(last_name__icontains=q) | Q(initials__icontains=q) + + # try and parse an int + try: + val = int(q) + filter = filter | Q(pk=val) + except: # noqa + # not an integer + pass + + return self.model.objects.filter(filter).annotate(num_qualifications=Count('qualifications_obtained')).order_by('-num_qualifications').prefetch_related('levels', 'qualifications_obtained') def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs)
Name Van Driver?Technician? Supervisor? Qualification Count
{{ object.name }} {% if request.user.pk == object.pk %}{%endif%} {{ object.is_driver|yesno|title }}{% for level in object|get_levels_of_depth:1 %}{{ level.get_icon }}{%empty%}No{%endfor%} {{ object.is_supervisor|yesno|title }}{{ object.qualifications_obtained.all|length }} + {{ object.num_qualifications }} View Training Record View Detailed Record