From dedb8d81fe97118a082499b209f302695da8aa9b Mon Sep 17 00:00:00 2001 From: FreneticScribbler Date: Tue, 1 Mar 2022 18:36:17 +0000 Subject: [PATCH] FEAT(T): Add ability to log items at various depths during a session Also fixes inability to search by reference number --- training/forms.py | 10 ++++++---- training/templates/session_log_form.html | 23 +++++++++++------------ training/views.py | 18 ++++++++++-------- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/training/forms.py b/training/forms.py index e1a8ed5b..3859e0ec 100644 --- a/training/forms.py +++ b/training/forms.py @@ -71,8 +71,9 @@ class RequirementForm(forms.ModelForm): class SessionLogForm(forms.Form): trainees = forms.ModelMultipleChoiceField(models.Trainee.objects.all()) - items = forms.ModelMultipleChoiceField(models.TrainingItem.objects.all()) - depth = forms.ChoiceField(choices=models.TrainingItemQualification.CHOICES) + items_0 = forms.ModelMultipleChoiceField(models.TrainingItem.objects.all(), required=False) + items_1 = forms.ModelMultipleChoiceField(models.TrainingItem.objects.all(), required=False) + items_2 = forms.ModelMultipleChoiceField(models.TrainingItem.objects.all(), required=False) supervisor = forms.ModelChoiceField(models.Trainee.objects.all()) date = forms.DateField(initial=datetime.date.today) notes = forms.CharField(required=False, widget=forms.Textarea) @@ -88,6 +89,7 @@ class SessionLogForm(forms.Form): supervisor = self.cleaned_data['supervisor'] if supervisor in self.cleaned_data.get('trainees', []): raise forms.ValidationError('One may not supervise oneself...') - for item in self.cleaned_data.get('items', []): - validate_user_can_train_in(supervisor, item) + for depth in models.TrainingItemQualification.CHOICES: + for item in self.cleaned_data.get('items_{depth.0}', []): + validate_user_can_train_in(supervisor, item) return supervisor diff --git a/training/templates/session_log_form.html b/training/templates/session_log_form.html index 0cc7b429..b596f342 100644 --- a/training/templates/session_log_form.html +++ b/training/templates/session_log_form.html @@ -2,6 +2,7 @@ {% load static %} {% load button from filters %} +{% load colour_from_depth from tags %} {% block css %} {{ block.super }} @@ -36,18 +37,16 @@

Training Items

-
-
- - -
-
- {% include 'partials/form_field.html' with field=form.depth %} -
-
- {% include 'partials/form_field.html' with field=form.date %} -
+ {% for depth in depths %} +
+ + +
+ {% endfor %} +

Session Information

+
+ {% include 'partials/form_field.html' with field=form.date %}
{% include 'partials/form_field.html' with field=form.notes %} diff --git a/training/views.py b/training/views.py index 4b3ee26d..1e8f699e 100644 --- a/training/views.py +++ b/training/views.py @@ -219,18 +219,20 @@ class SessionLog(generic.FormView): success_url = reverse_lazy('trainee_list') def form_valid(self, form, *args, **kwargs): - for trainee in form.cleaned_data.get('trainees'): - for item in form.cleaned_data.get('items'): - try: - with transaction.atomic(): - models.TrainingItemQualification.objects.create(trainee=trainee, item=item, supervisor=form.cleaned_data.get('supervisor'), depth=form.cleaned_data.get('depth'), notes=form.cleaned_data.get('notes'), date=form.cleaned_data.get('date')) - reversion.add_to_revision(trainee) - except IntegrityError: - pass # There was an attempt to create a duplicate qualification, ignore it + for trainee in form.cleaned_data.get('trainees', []): + for depth in models.TrainingItemQualification.CHOICES: + for item in form.cleaned_data.get(f'items_{depth[0]}', []): + try: + with transaction.atomic(): + models.TrainingItemQualification.objects.create(trainee=trainee, item=item, supervisor=form.cleaned_data.get('supervisor'), depth=depth[0], notes=form.cleaned_data.get('notes'), date=form.cleaned_data.get('date')) + reversion.add_to_revision(trainee) + except IntegrityError: + pass # There was an attempt to create a duplicate qualification, ignore it return super().form_valid(form, *args, **kwargs) def get_context_data(self, **kwargs): context = super().get_context_data(**kwargs) + context["depths"] = models.TrainingItemQualification.CHOICES context["page_title"] = "Log Training Session" get_related(context['form'], context) return context