mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-16 21:12:13 +00:00
Only require item prerequisites on competency assessed
This commit is contained in:
@@ -5,14 +5,6 @@ from django import forms
|
|||||||
from training import models
|
from training import models
|
||||||
|
|
||||||
|
|
||||||
def validate_user_can_train_in(self, supervisor, item):
|
|
||||||
if item.category.training_level:
|
|
||||||
if not supervisor.level_qualifications.filter(level=item.category.training_level):
|
|
||||||
self.add_error('supervisor', 'Selected supervising person is missing requisite training level to train in this department')
|
|
||||||
elif not supervisor.is_supervisor:
|
|
||||||
self.add_error('supervisor', 'Selected supervisor must actually *be* a supervisor...')
|
|
||||||
|
|
||||||
|
|
||||||
class QualificationForm(forms.ModelForm):
|
class QualificationForm(forms.ModelForm):
|
||||||
related_models = {
|
related_models = {
|
||||||
'item': models.TrainingItem,
|
'item': models.TrainingItem,
|
||||||
@@ -23,16 +15,6 @@ class QualificationForm(forms.ModelForm):
|
|||||||
model = models.TrainingItemQualification
|
model = models.TrainingItemQualification
|
||||||
fields = '__all__'
|
fields = '__all__'
|
||||||
|
|
||||||
def clean(self):
|
|
||||||
cleaned_data = super().clean()
|
|
||||||
item = cleaned_data.get('item')
|
|
||||||
trainee = cleaned_data.get('trainee')
|
|
||||||
supervisor = cleaned_data.get('supervisor')
|
|
||||||
if supervisor:
|
|
||||||
validate_user_can_train_in(self, supervisor, item)
|
|
||||||
if not item.user_has_requirements(trainee):
|
|
||||||
self.add_error('item', 'Missing prerequisites')
|
|
||||||
|
|
||||||
def clean_date(self):
|
def clean_date(self):
|
||||||
date = self.cleaned_data.get('date')
|
date = self.cleaned_data.get('date')
|
||||||
if date > date.today():
|
if date > date.today():
|
||||||
@@ -95,7 +77,4 @@ class SessionLogForm(forms.Form):
|
|||||||
supervisor = self.cleaned_data['supervisor']
|
supervisor = self.cleaned_data['supervisor']
|
||||||
if supervisor in self.cleaned_data.get('trainees', []):
|
if supervisor in self.cleaned_data.get('trainees', []):
|
||||||
raise forms.ValidationError('One may not supervise oneself...')
|
raise forms.ValidationError('One may not supervise oneself...')
|
||||||
for depth in models.TrainingItemQualification.CHOICES:
|
|
||||||
for item in self.cleaned_data.get('items_{depth.0}', []):
|
|
||||||
validate_user_can_train_in(self, supervisor, item)
|
|
||||||
return supervisor
|
return supervisor
|
||||||
|
|||||||
@@ -181,12 +181,27 @@ class TrainingItemQualification(models.Model, RevisionMixin):
|
|||||||
|
|
||||||
objects = TrainingItemQualificationManager()
|
objects = TrainingItemQualificationManager()
|
||||||
|
|
||||||
|
def clean(self):
|
||||||
|
errdict = {}
|
||||||
|
# Validate supervisor can train in this item
|
||||||
|
if hasattr(self, 'supervisor'): # This will be false if form validation fails
|
||||||
|
if self.item.category.training_level:
|
||||||
|
if not self.supervisor.level_qualifications.filter(level=self.item.category.training_level):
|
||||||
|
errdict['supervisor'] = ('Selected supervising person is missing requisite training level to train in this department')
|
||||||
|
elif not self.supervisor.is_supervisor:
|
||||||
|
errdict['supervisor'] = ('Selected supervisor must actually *be* a supervisor...')
|
||||||
|
# Item requirements only apply to being passed out
|
||||||
|
if self.depth == TrainingItemQualification.PASSED_OUT and not self.item.user_has_requirements(self.trainee):
|
||||||
|
errdict['item'] = ('Missing prerequisites')
|
||||||
|
if errdict != {}: # If there was an error when validation
|
||||||
|
raise ValidationError(errdict)
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
return f"{self.get_depth_display()} in {self.item} on {self.date.strftime('%b %d %Y')}"
|
return f"{self.get_depth_display()} in {self.item} on {self.date.strftime('%b %d %Y')}"
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def activity_feed_string(self):
|
def activity_feed_string(self):
|
||||||
return f"{self.get_depth_display()} in {self.item}"
|
return f"{self.trainee} {self.get_depth_display().lower()} {self.get_depth_display()} in {self.item}"
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def get_colour_from_depth(cls, depth):
|
def get_colour_from_depth(cls, depth):
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<li class="list-group-item {% if not item.active%}text-warning{%endif%}">{{ item }}
|
<li class="list-group-item {% if not item.active%}text-warning{%endif%}">{{ item }}
|
||||||
{% if item.prerequisites.exists %}
|
{% if item.prerequisites.exists %}
|
||||||
<div class="ml-3 font-italic">
|
<div class="ml-3 font-italic">
|
||||||
<p class="text-info mb-0">Prerequisites:</p>
|
<p class="text-info mb-0">Passed Out Prerequisites:</p>
|
||||||
<ul>
|
<ul>
|
||||||
{% for p in item.prerequisites.all %}
|
{% for p in item.prerequisites.all %}
|
||||||
<li>{{p}}</li>
|
<li>{{p}}</li>
|
||||||
|
|||||||
@@ -39,7 +39,7 @@
|
|||||||
<h3>Training Items</h3>
|
<h3>Training Items</h3>
|
||||||
{% for depth in depths %}
|
{% for depth in depths %}
|
||||||
<div class="form-group row">
|
<div class="form-group row">
|
||||||
<label for="selectpicker" class="col-sm-2 rounded bg-{% colour_from_depth depth.0 %} text-center py-1">{{ depth.1 }} Items</label>
|
<label for="selectpicker" class="col-sm-2 text-{% colour_from_depth depth.0 %} py-1">{{ depth.1 }} Items</label>
|
||||||
<select multiple name="items_{{depth.0}}" id="items_{{depth.0}}_id" class="selectpicker col-sm-10 px-0" data-live-search="true" data-sourceurl="{% url 'api_secure' model='training_item' %}?fields=display_id,description&filters=active">
|
<select multiple name="items_{{depth.0}}" id="items_{{depth.0}}_id" class="selectpicker col-sm-10 px-0" data-live-search="true" data-sourceurl="{% url 'api_secure' model='training_item' %}?fields=display_id,description&filters=active">
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
Reference in New Issue
Block a user