mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-23 00:12:15 +00:00
Autofire of traininglevelqualification basically works
This commit is contained in:
@@ -16,13 +16,21 @@ class QualificationForm(forms.ModelForm):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
pk = kwargs.pop('pk', None)
|
pk = kwargs.pop('pk', None)
|
||||||
super().__init__()
|
super(QualificationForm, self).__init__(*args, **kwargs)
|
||||||
self.fields['trainee'].initial = Profile.objects.get(pk=pk)
|
self.fields['trainee'].initial = Profile.objects.get(pk=pk)
|
||||||
|
self.fields['date'].initial = date.today()
|
||||||
|
|
||||||
def clean_date(self):
|
def clean_date(self):
|
||||||
date = self.cleaned_data['date']
|
date = self.cleaned_data['date']
|
||||||
if date > date.today():
|
if date > date.today():
|
||||||
raise ValidationError('Qualification date may not be in the future')
|
raise forms.ValidationError('Qualification date may not be in the future')
|
||||||
|
return date
|
||||||
|
|
||||||
|
def clean_supervisor(self):
|
||||||
|
supervisor = self.cleaned_data['supervisor']
|
||||||
|
if supervisor.pk == self.cleaned_data['trainee'].pk:
|
||||||
|
raise forms.ValidationError('One may not supervise oneself...')
|
||||||
|
return supervisor # TODO also confirm that the supervisor is a Supervisor
|
||||||
|
|
||||||
class RequirementForm(forms.ModelForm):
|
class RequirementForm(forms.ModelForm):
|
||||||
depth = forms.ChoiceField(choices=models.TrainingItemQualification.CHOICES)
|
depth = forms.ChoiceField(choices=models.TrainingItemQualification.CHOICES)
|
||||||
@@ -33,5 +41,5 @@ class RequirementForm(forms.ModelForm):
|
|||||||
|
|
||||||
def __init__(self, *args, **kwargs):
|
def __init__(self, *args, **kwargs):
|
||||||
pk = kwargs.pop('pk', None)
|
pk = kwargs.pop('pk', None)
|
||||||
super().__init__()
|
super(RequirementForm, self).__init__(*args, **kwargs)
|
||||||
self.fields['level'].initial = models.TrainingLevel.objects.get(pk=pk)
|
self.fields['level'].initial = models.TrainingLevel.objects.get(pk=pk)
|
||||||
|
|||||||
24
training/migrations/0003_auto_20210716_0150.py
Normal file
24
training/migrations/0003_auto_20210716_0150.py
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Generated by Django 3.1.5 on 2021-07-16 00:50
|
||||||
|
|
||||||
|
from django.db import migrations, models
|
||||||
|
import django.db.models.deletion
|
||||||
|
|
||||||
|
|
||||||
|
class Migration(migrations.Migration):
|
||||||
|
|
||||||
|
dependencies = [
|
||||||
|
('training', '0002_auto_20210706_0053'),
|
||||||
|
]
|
||||||
|
|
||||||
|
operations = [
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='traininglevelqualification',
|
||||||
|
name='confirmed_by',
|
||||||
|
field=models.ForeignKey(null=True, on_delete=django.db.models.deletion.RESTRICT, related_name='confirmer', to='training.trainee'),
|
||||||
|
),
|
||||||
|
migrations.AlterField(
|
||||||
|
model_name='traininglevelqualification',
|
||||||
|
name='confirmed_on',
|
||||||
|
field=models.DateTimeField(null=True),
|
||||||
|
),
|
||||||
|
]
|
||||||
@@ -26,6 +26,9 @@ class TrainingCategory(models.Model):
|
|||||||
reference_number = models.CharField(max_length=3)
|
reference_number = models.CharField(max_length=3)
|
||||||
name = models.CharField(max_length=50)
|
name = models.CharField(max_length=50)
|
||||||
|
|
||||||
|
def __str__(self):
|
||||||
|
return "{}. {}".format(self.reference_number, self.name)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
verbose_name_plural = 'Training Categories'
|
verbose_name_plural = 'Training Categories'
|
||||||
|
|
||||||
@@ -67,9 +70,9 @@ class TrainingItemQualification(models.Model):
|
|||||||
|
|
||||||
def save(self, *args, **kwargs):
|
def save(self, *args, **kwargs):
|
||||||
super().save()
|
super().save()
|
||||||
for level in TrainingLevel.models.all(): # Mm yes efficiency
|
for level in TrainingLevel.objects.all(): # Mm yes efficiency
|
||||||
if level.user_has_requirements(self.trainee):
|
if level.user_has_requirements(self.trainee):
|
||||||
level_qualification = models.TrainingLevelQualification.create(trainee=self.trainee, level=level)
|
level_qualification = TrainingLevelQualification.objects.create(trainee=self.trainee, level=level)
|
||||||
|
|
||||||
|
|
||||||
# Levels
|
# Levels
|
||||||
@@ -118,8 +121,7 @@ class TrainingLevel(models.Model, RevisionMixin):
|
|||||||
return 0
|
return 0
|
||||||
|
|
||||||
def user_has_requirements(self, user):
|
def user_has_requirements(self, user):
|
||||||
return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.all())
|
return all(TrainingItem.user_has_qualification(req.item, user, req.depth) for req in self.requirements.all())
|
||||||
|
|
||||||
|
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
if self.department is None: # 2TA
|
if self.department is None: # 2TA
|
||||||
|
|||||||
@@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load widget_tweaks %}
|
{% load widget_tweaks %}
|
||||||
|
{% load button from filters %}
|
||||||
|
|
||||||
{% block css %}
|
{% block css %}
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
@@ -23,26 +24,26 @@
|
|||||||
{% if form.errors %}
|
{% if form.errors %}
|
||||||
{% include 'form_errors.html' %}
|
{% include 'form_errors.html' %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
<form id="item-form" action="{{ form.action|default:request.path }}" method="post">{% csrf_token %}
|
<form role="form" action="{{ form.action|default:request.path }}" method="POST">{% csrf_token %}
|
||||||
{% render_field form.trainee|attr:'hidden' value=form.trainee.initial %}
|
{% render_field form.trainee|attr:'hidden' value=form.trainee.initial %}
|
||||||
<div class="form-group form-row">
|
<div class="form-group form-row">
|
||||||
<label for="item_id" class="col-sm-2 col-form-label">Item</label>
|
<label for="item_id" class="col-sm-2 col-form-label">Item</label>
|
||||||
<select name="item" id="item_id" class="form-control selectpicker custom-select col-sm-10" data-live-search="true" data-sourceurl="{% url 'api_secure' model='training_item' %}" required>
|
<select name="item" id="item_id" class="form-control selectpicker custom-select col-sm-4" data-live-search="true" data-sourceurl="{% url 'api_secure' model='training_item' %}" required>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group form-row">
|
<div class="form-group form-row">
|
||||||
<label for="depth" class="col-sm-2 col-form-label">Depth</label>
|
<label for="depth" class="col-sm-2 col-form-label">Depth</label>
|
||||||
{% render_field form.depth|add_class:'form-control custom-select selectpicker col-sm' %}
|
{% render_field form.depth|add_class:'form-control custom-select col-sm-4' %}
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group form-row">
|
<div class="form-group form-row">
|
||||||
<label for="selectpicker" class="col-sm-2 col-form-label">Supervisor</label>
|
<label for="supervisor" class="col-sm-2 col-form-label">Supervisor</label>
|
||||||
<select name="supervisor" id="supervisor_id" class="form-control selectpicker custom-select col-sm-10" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials" required>
|
<select name="supervisor" id="supervisor_id" class="form-control selectpicker custom-select col-sm-10" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials" required>
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group form-row">
|
<div class="form-group form-row">
|
||||||
<label for="date" class="col-sm-2 col-form-label">Training Date</label>
|
<label for="date" class="col-sm-2 col-form-label">Training Date</label>
|
||||||
<div class="col-sm-10">
|
<div class="col-sm-10">
|
||||||
{% render_field form.date|add_class:'form-control'|attr:'type="date"' %}
|
{% render_field form.date|add_class:'form-control'|attr:'type="date"' value=form.date.initial %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group form-row">
|
<div class="form-group form-row">
|
||||||
@@ -52,6 +53,8 @@
|
|||||||
id="notes" rows="3"></textarea>
|
id="notes" rows="3"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<input type="submit" class="btn btn-primary">
|
<div class="col-sm-12 text-right pr-0"}>
|
||||||
|
{% button 'submit' %}
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
@@ -20,7 +20,7 @@
|
|||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<p>{{ level.description|truncatewords:30 }}</p>
|
<p>{{ level.description|truncatewords:30 }}</p>
|
||||||
<div class="progress mb-2">
|
<div class="progress mb-2">
|
||||||
{% percentage_complete level request.user as completion %}
|
{% percentage_complete level object as completion %}
|
||||||
|
|
||||||
<div class="progress-bar progress-bar-striped" role="progressbar" style="width: 25%" aria-valuenow="{{completion}}" aria-valuemin="0" aria-valuemax="100">{{completion}}% complete</div>
|
<div class="progress-bar progress-bar-striped" role="progressbar" style="width: 25%" aria-valuenow="{{completion}}" aria-valuemin="0" aria-valuemax="100">{{completion}}% complete</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -61,19 +61,17 @@
|
|||||||
</div>
|
</div>
|
||||||
<div class="row">
|
<div class="row">
|
||||||
<h2 class="col-12">Training Items</h2><br>
|
<h2 class="col-12">Training Items</h2><br>
|
||||||
|
<h3 class="col-12">Key: <span class="badge badge-warning">Training Started</span> <span class="badge badge-success">Training Complete</span> <span class="badge badge-info">Passed Out</span></h3>
|
||||||
<div class="card-columns">
|
<div class="card-columns">
|
||||||
{% for category in categories %}
|
{% for category in categories %}
|
||||||
<div class="card mb-3">
|
<div class="card mb-3">
|
||||||
<h3 class="card-header">{{ category.name }}</h3>
|
<h3 class="card-header">{{ category }}</h3>
|
||||||
<div class="list-group list-group-flush">
|
<div class="list-group list-group-flush">
|
||||||
{% for depth in depths %}
|
|
||||||
<li class="list-group-item {% if depth.0 == 0 %}list-group-item-warning{%elif depth.0 == 1%}list-group-item-success{%else%}list-group-item-info{%endif%}">{{depth.1}}</li>
|
|
||||||
{% for q in object.qualifications_obtained.all %}
|
{% for q in object.qualifications_obtained.all %}
|
||||||
{% if q.depth == depth.0 and q.item.category == category %}
|
{% if q.item.category == category %}
|
||||||
<li class="list-group-item">{{q.item}} ({{q.date}})</li>
|
<li class="list-group-item {% if q.depth == 0 %}list-group-item-warning{%elif q.depth == 1%}list-group-item-success{%else%}list-group-item-info{%endif%}">{{q.item}} ({{q.date}})</li>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% endfor %}
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|||||||
@@ -62,16 +62,16 @@ class AddQualification(generic.CreateView):
|
|||||||
|
|
||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(AddQualification, self).get_context_data(**kwargs)
|
context = super(AddQualification, self).get_context_data(**kwargs)
|
||||||
# context["page_title"] = "Edit {}'s Training Record".format(self.object)
|
|
||||||
context["depths"] = models.TrainingItemQualification.CHOICES
|
context["depths"] = models.TrainingItemQualification.CHOICES
|
||||||
if is_ajax(self.request):
|
if is_ajax(self.request):
|
||||||
context['override'] = "base_ajax.html"
|
context['override'] = "base_ajax.html"
|
||||||
else:
|
else:
|
||||||
context['override'] = 'base_rigs.html' # TODO
|
context['override'] = 'base_training.html'
|
||||||
|
context['page_title'] = "Add Qualification for {}".format(models.Trainee.objects.get(pk=self.kwargs['pk']))
|
||||||
return context
|
return context
|
||||||
|
|
||||||
def get_success_url(self):
|
def get_success_url(self):
|
||||||
return reverse_lazy('trainee_detail')
|
return reverse_lazy('trainee_detail', kwargs={"pk": self.object.pk })
|
||||||
|
|
||||||
def get_form_kwargs(self):
|
def get_form_kwargs(self):
|
||||||
kwargs = super(AddQualification, self).get_form_kwargs()
|
kwargs = super(AddQualification, self).get_form_kwargs()
|
||||||
|
|||||||
Reference in New Issue
Block a user