diff --git a/training/models.py b/training/models.py index 28504d25..8c433581 100644 --- a/training/models.py +++ b/training/models.py @@ -201,7 +201,9 @@ class TrainingLevel(models.Model, RevisionMixin): return 0 def user_has_requirements(self, user): - return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.all()) + 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())) + return has_required_items and has_required_levels def __str__(self): if self.department is None: diff --git a/training/templates/level_detail.html b/training/templates/level_detail.html index f8935e41..d85e3ce2 100644 --- a/training/templates/level_detail.html +++ b/training/templates/level_detail.html @@ -44,6 +44,7 @@ {% endblock %} {% block content %} +{% if u %}

for {{ u }}

{% endif %} {% if request.user.is_supervisor or perms.training.change_traininglevel %}
diff --git a/training/templates/trainee_detail.html b/training/templates/trainee_detail.html index 8e0bc227..61bc2ae2 100644 --- a/training/templates/trainee_detail.html +++ b/training/templates/trainee_detail.html @@ -2,6 +2,7 @@ {% load static %} {% load percentage_complete from tags %} +{% load confirm_button from tags %} {% load markdown_tags %} {% block css %} @@ -54,15 +55,7 @@
  • {{ qual.level.get_icon }} {{ qual.level }} - {% if qual.confirmed_on is None %} - {% if request.user.pk != object.pk and request.user.is_supervisor %} - Awaiting Confirmation Confirm - {% else %} - - {% endif %} - {% else %} Confirmed by {{ qual.confirmed_by|default:'System' }} on {{ qual.confirmed_on|date }} - {% endif %}
  • {% empty %}
    No qualifications in any levels yet...did someone forget to fill out the paperwork?
    @@ -72,14 +65,22 @@ {% for level in started_levels %} {% percentage_complete level object as completion %}
    -

    {{ level }}

    +

    {{ level }}

    {{ level.description|markdown }}
    + {% if completion == 100 %} + {% confirm_button request.user object level as cb %} + {% if cb %} + {{ cb }} + {% else %} +

    Missing prequisite level(s)

    + {% endif %} + {% endif %}
    {% endfor %} diff --git a/training/templatetags/tags.py b/training/templatetags/tags.py index 70f9320e..d5313dfc 100644 --- a/training/templatetags/tags.py +++ b/training/templatetags/tags.py @@ -40,3 +40,14 @@ def get_supervisor(tech): @register.filter def get_levels_of_depth(trainee, level): return trainee.level_qualifications.all().exclude(confirmed_on=None).exclude(level__department=models.TrainingLevel.HAULAGE).select_related('level').filter(level__level=level) + + +@register.simple_tag +def confirm_button(user, trainee, level): + if level.user_has_requirements(trainee): + string = "Awaiting Confirmation" + if user.is_supervisor or user.has_perm('training.add_traininglevelqualification'): + string += " Confirm" + return mark_safe(string) + else: + return "" diff --git a/training/tests/test_unit.py b/training/tests/test_unit.py index 1bca896a..aa423940 100644 --- a/training/tests/test_unit.py +++ b/training/tests/test_unit.py @@ -3,9 +3,3 @@ import pytest from pytest_django.asserts import assertFormError, assertRedirects, assertContains, assertNotContains pytestmark = pytest.mark.django_db - - -def test_(admin_client): - url = reverse('add_qualification') - response = admin_client.post(url) - assertFormError(response, 'form', 'name', 'This field is required.') diff --git a/training/urls.py b/training/urls.py index e1ec58bc..6b1dc232 100644 --- a/training/urls.py +++ b/training/urls.py @@ -17,11 +17,13 @@ urlpatterns = [ name='add_qualification'), path('trainee//edit_qualification/', permission_required_with_403('training.change_trainingitemqualification')(views.EditQualification.as_view()), name='edit_qualification'), - path('session/', login_required(views.SessionLog.as_view()), name='session_log'), + path('levels/', login_required(views.LevelList.as_view()), name='level_list'), path('level//', login_required(views.LevelDetail.as_view()), name='level_detail'), + path('level//user//', login_required(views.LevelDetail.as_view()), name='level_detail'), path('level//add_requirement/', login_required(views.AddLevelRequirement.as_view()), name='add_requirement'), path('level/remove_requirement//', login_required(views.RemoveRequirement.as_view()), name='remove_requirement'), + path('trainee//level//confirm', login_required(views.ConfirmLevel.as_view()), name='confirm_level'), path('trainee//item_record', login_required(views.TraineeItemDetail.as_view()), name='trainee_item_detail'), ]