Repair confirmation logic

This commit is contained in:
2022-01-03 15:28:17 +00:00
parent 7a70270dfd
commit 3e8cfe4f11
5 changed files with 10 additions and 11 deletions

View File

@@ -202,7 +202,7 @@ class TrainingLevel(models.Model, RevisionMixin):
def user_has_requirements(self, user):
has_required_items = all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.all())
has_required_levels = set(user.level_qualifications.values_list('level', flat=True)).issubset(set(self.prerequisite_levels.all()))
has_required_levels = not self.prerequisite_levels.all().exists() or set(user.level_qualifications.values_list('level', flat=True)).issubset(set(self.prerequisite_levels.all()))
return has_required_items and has_required_levels
def __str__(self):

View File

@@ -89,11 +89,11 @@
<ul>
{% for level in object.prerequisite_levels.all %}
{% user_level_if_present u level as level_qualification %}
<li><a href="{{level.get_absolute_url}}">{{ level }}</a> <span class="fas {% if level_qualification %}text-success fa-check{% if level_qualification.confirmed_by is not None %}-double{% endif %}{% else %}fa-hourglass-start text-warning{%endif%}"></span></li>
<li><a href="{% url 'level_detail' level.pk u.pk %}">{{ level }}</a> <span class="fas {% if level_qualification %}text-success fa-check{% if level_qualification.confirmed_by is not None %}-double{% endif %}{% else %}fa-hourglass-start text-warning{%endif%}"></span></li>
{% for nested_level in level.prerequisite_levels.all %}
{% user_level_if_present u nested_level as nested_level_qualification %}
<ul>
<li><a href="{{nested_level.get_absolute_url}}">{{ nested_level }}</a> <span class="fas {% if nested_level_qualification %}text-success fa-check{% if nested_level_qualification.confirmed_by is not None %}-double{% endif %}{% else %}fa-hourglass-start text-warning{%endif%}"></span></li>
<li><a href="{% url 'level_detail' nested_level.pk u.pk %}">{{ nested_level }}</a> <span class="fas {% if nested_level_qualification %}text-success fa-check{% if nested_level_qualification.confirmed_by is not None %}-double{% endif %}{% else %}fa-hourglass-start text-warning{%endif%}"></span></li>
</ul>
{% endfor %}
{% empty %}

View File

@@ -74,9 +74,10 @@
<div class="progress-bar progress-bar-striped" role="progressbar" style="width: {{completion}}%" aria-valuenow="{{completion}}" aria-valuemin="0" aria-valuemax="100">{{completion}}% complete</div>
</div>
{% if completion == 100 %}
<br>
{% confirm_button request.user object level as cb %}
{% if cb %}
{{ cb }}
<div class="d-flex justify-content-between">{{ cb }}</div>
{% else %}
<p class="font-italic pt-2 pb-0">Missing prequisite level(s)</p>
{% endif %}

View File

@@ -3,6 +3,7 @@ from django import template
from django.utils.html import escape
from django.utils.safestring import SafeData, mark_safe
from django.utils.text import normalize_newlines
from django.urls import reverse
from training import models
@@ -45,9 +46,9 @@ def get_levels_of_depth(trainee, level):
@register.simple_tag
def confirm_button(user, trainee, level):
if level.user_has_requirements(trainee):
string = "<span class='badge badge-warning'>Awaiting Confirmation</span>"
if user.is_supervisor or user.has_perm('training.add_traininglevelqualification'):
string += " <a class='btn btn-info' href='{% url 'confirm_level' trainee.pk level.pk %}'>Confirm</a>"
string = "<span class='badge badge-warning p-2'>Awaiting Confirmation</span>"
if models.Trainee.objects.get(pk=user.pk).is_supervisor or user.has_perm('training.add_traininglevelqualification'):
string += "<a class='btn btn-info' href='{}'>Confirm</a>".format(reverse('confirm_level', kwargs={'pk': trainee.pk, 'level_pk': level.pk}))
return mark_safe(string)
else:
return ""

View File

@@ -205,10 +205,7 @@ class ConfirmLevel(generic.RedirectView):
@transaction.atomic()
@reversion.create_revision()
def get_redirect_url(self, *args, **kwargs):
level_qualification = models.TrainingLevelQualification.objects.get(trainee=kwargs['pk'], level=kwargs['level_pk'])
level_qualification.confirmed_by = self.request.user
level_qualification.confirmed_on = timezone.now()
level_qualification.save()
level_qualification = models.TrainingLevelQualification.objects.create(trainee=models.Trainee.objects.get(pk=kwargs['pk']), level=models.TrainingLevel.objects.get(pk=kwargs['level_pk']), confirmed_by=self.request.user, confirmed_on=timezone.now())
reversion.add_to_revision(level_qualification.trainee)
reversion.set_user(self.request.user)
return reverse_lazy('trainee_detail', kwargs={'pk': kwargs['pk']})