From 458a7343319197b3866fb66c21768ead6a08042e Mon Sep 17 00:00:00 2001 From: Arona Jones Date: Thu, 1 Jul 2021 09:50:13 +0100 Subject: [PATCH] Machine switch --- templates/index.html | 1 + .../commands/generateSampleTrainingData.py | 6 ++-- .../migrations/0003_auto_20210630_1624.py | 19 ++++++++++++ .../migrations/0004_auto_20210630_1641.py | 23 ++++++++++++++ training/models.py | 30 ++++++++++--------- training/templates/item_list.html | 7 ++++- training/templates/session_log_form.html | 12 ++++++++ training/templates/trainee_detail.html | 29 ++++++++++++++++++ training/urls.py | 8 +++++ training/views.py | 21 ++++++++++++- 10 files changed, 137 insertions(+), 19 deletions(-) create mode 100644 training/migrations/0003_auto_20210630_1624.py create mode 100644 training/migrations/0004_auto_20210630_1641.py create mode 100644 training/templates/session_log_form.html create mode 100644 training/templates/trainee_detail.html diff --git a/templates/index.html b/templates/index.html index 912b7d87..af442c2f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -43,6 +43,7 @@

Training Database

+ My Training Record View Training Items Log Training Session
diff --git a/training/management/commands/generateSampleTrainingData.py b/training/management/commands/generateSampleTrainingData.py index f92c363f..7fa68615 100644 --- a/training/management/commands/generateSampleTrainingData.py +++ b/training/management/commands/generateSampleTrainingData.py @@ -33,13 +33,13 @@ class Command(BaseCommand): names = [(1, "Basic"), (2, "Sound"), (3, "Lighting"), (4, "Rigging"), (5, "Power"), (6, "Haulage")] for i, name in names: - category = models.TrainingCategory.objects.create(number=i, name=name) + category = models.TrainingCategory.objects.create(reference_number=i, name=name) category.save() self.categories.append(category) def setup_items(self): - names = ["Motorised Power Towers", "Catering", "Forgetting Cables", "Gazebo Construction", "Balanced Audio", "Unbalanced Audio"] + names = ["Motorised Power Towers", "Catering", "Forgetting Cables", "Gazebo Construction", "Balanced Audio", "Unbalanced Audio", "BBQ/Bin Interactions", "Pushing Boxes", "How Not To Die", "Setting up projectors", "Basketing truss", "First Aid", "Digging Trenches", "Avoiding Bin Lorries", "Getting cherry pickers stuck in mud", "Crashing the Van"] for i,name in enumerate(names): - item = models.TrainingItem.objects.create(category=random.choice(self.categories), number=random.randint(0, 100), name=name) + item = models.TrainingItem.objects.create(category=random.choice(self.categories), reference_number=random.randint(0, 100), name=name) self.items.append(item) diff --git a/training/migrations/0003_auto_20210630_1624.py b/training/migrations/0003_auto_20210630_1624.py new file mode 100644 index 00000000..d835e908 --- /dev/null +++ b/training/migrations/0003_auto_20210630_1624.py @@ -0,0 +1,19 @@ +# Generated by Django 3.1.5 on 2021-06-30 15:24 + +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('training', '0002_auto_20210630_1514'), + ] + + operations = [ + migrations.AlterField( + model_name='trainingitem', + name='category', + field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='items', to='training.trainingcategory'), + ), + ] diff --git a/training/migrations/0004_auto_20210630_1641.py b/training/migrations/0004_auto_20210630_1641.py new file mode 100644 index 00000000..339f6b18 --- /dev/null +++ b/training/migrations/0004_auto_20210630_1641.py @@ -0,0 +1,23 @@ +# Generated by Django 3.1.5 on 2021-06-30 15:41 + +from django.db import migrations + + +class Migration(migrations.Migration): + + dependencies = [ + ('training', '0003_auto_20210630_1624'), + ] + + operations = [ + migrations.RenameField( + model_name='trainingcategory', + old_name='number', + new_name='reference_number', + ), + migrations.RenameField( + model_name='trainingitem', + old_name='number', + new_name='reference_number', + ), + ] diff --git a/training/models.py b/training/models.py index df07dd95..baf4b621 100644 --- a/training/models.py +++ b/training/models.py @@ -4,23 +4,26 @@ from RIGS.models import RevisionMixin, Profile from reversion import revisions as reversion # 'shim' overtop the profile model to neatly contain all training related fields etc -@reversion.register class Trainee(Profile): - pass + class Meta: + proxy = True + + def get_records_of_depth(self, depth): + return self.training_items.filter(depth=depth) # Items class TrainingCategory(models.Model): - number = models.CharField(max_length=3) + reference_number = models.CharField(max_length=3) name = models.CharField(max_length=50) class TrainingItem(models.Model): - category = models.ForeignKey('TrainingCategory', related_name='category', on_delete=models.RESTRICT) - number = models.CharField(max_length=3) + reference_number = models.CharField(max_length=3) + category = models.ForeignKey('TrainingCategory', related_name='items', on_delete=models.RESTRICT) name = models.CharField(max_length=50) def __str__(self): - return "{}.{} {}".format(self.category.number, self.number, self.name) + return "{}.{} {}".format(self.category.reference_number, self.reference_number, self.name) # TODO Validation that dates cannot be in the future @@ -34,24 +37,23 @@ class TrainingItemQualification(models.Model): (PASSED_OUT, 'Passed Out'), ) item = models.ForeignKey('TrainingItem', on_delete=models.RESTRICT) - trainee = models.ForeignKey('Trainee', related_name='items', on_delete=models.RESTRICT) + trainee = models.ForeignKey('Trainee', related_name='training_items', on_delete=models.RESTRICT) depth = models.IntegerField(choices=CHOICES) date = models.DateTimeField() + # TODO Remember that some training is external. Support for making an organisation the trainer? supervisor = models.ForeignKey('Trainee', related_name='training_started', on_delete=models.RESTRICT) notes = models.TextField() # Levels +# FIXME Common Competencies... class TrainingLevel(models.Model, RevisionMixin): - ASSISTANT = 0 - TECHNICIAN = 1 - SUPERVISOR = 2 CHOICES = ( - (ASSISTANT, 'Technical Assistant'), - (TECHNICIAN, 'Technician'), - (SUPERVISOR, 'Supervisor'), + (0, 'Technical Assistant'), + (1, 'Technician'), + (2, 'Supervisor'), ) - department = models.CharField(max_length=50, null=True) # Technical Assistant does not have a department + department = models.CharField(max_length=50, null=True) # N.B. Technical Assistant does not have a department level = models.IntegerField(choices=CHOICES) diff --git a/training/templates/item_list.html b/training/templates/item_list.html index 7b3457e8..35c2919c 100644 --- a/training/templates/item_list.html +++ b/training/templates/item_list.html @@ -4,8 +4,13 @@
{% for category in categories %}
-
+

{{ category.name }}

+
+ {% for item in category.items.all %} +
  • {{ item }}
  • + {% endfor %} +
    {% endfor %} diff --git a/training/templates/session_log_form.html b/training/templates/session_log_form.html new file mode 100644 index 00000000..0563bfb7 --- /dev/null +++ b/training/templates/session_log_form.html @@ -0,0 +1,12 @@ +{% extends 'base_rigs.html' %} + +{% block content %} +
    +

    Log New Training Session

    +
    + + +
    +
    +{% endblock %} diff --git a/training/templates/trainee_detail.html b/training/templates/trainee_detail.html new file mode 100644 index 00000000..7c3639c2 --- /dev/null +++ b/training/templates/trainee_detail.html @@ -0,0 +1,29 @@ +{% extends 'base_rigs.html' %} + +{% block content %} +
    +

    Training Levels

    +

    {{ user.name }} is a...

    +
    +

    Sound Supervisor

    +

    Power Technician

    +

    Technical Assistant

    +
    +
    +
    +

    Training Items


    +{% for category in categories %} +
    +
    +

    {{ category.name }}

    +
    + {% for depth in depths %} +
  • {{depth.1}}
  • +
  • Dummy Item
  • + {% endfor %} +
    +
    +
    +{% endfor %} +
    +{% endblock %} diff --git a/training/urls.py b/training/urls.py index f7462685..d26b75e4 100644 --- a/training/urls.py +++ b/training/urls.py @@ -1,7 +1,15 @@ from django.urls import path +from django.contrib.auth.decorators import login_required +from PyRIGS.decorators import permission_required_with_403 + from training import views urlpatterns = [ path('items/', views.ItemList.as_view(), name='item_list'), + + path('trainee/', login_required(views.TraineeDetail.as_view()), name='trainee_detail'), + path('trainee//', + permission_required_with_403('RIGS.view_profile')(views.TraineeDetail.as_view()), + name='trainee_detail'), ] diff --git a/training/views.py b/training/views.py index 87380226..4bf9f601 100644 --- a/training/views.py +++ b/training/views.py @@ -3,11 +3,30 @@ from django.shortcuts import render from django.views import generic from training import models +from users import views + class ItemList(generic.ListView): template_name = "item_list.html" model = models.TrainingItem def get_context_data(self, **kwargs): context = super(ItemList, self).get_context_data(**kwargs) - context["categories"] = models.TrainingCategory.objects.all() + context["page_title"] = "Training Items" + context["categories"] = models.TrainingCategory.objects.all() return context + + +class TraineeDetail(views.ProfileDetail): + template_name = "trainee_detail.html" + model = models.Trainee + + def get_context_data(self, **kwargs): + context = super(TraineeDetail, self).get_context_data(**kwargs) + context["page_title"] = "{}'s Training Record".format(self.object) + context["categories"] = models.TrainingCategory.objects.all() + choices = models.TrainingItemQualification.CHOICES + context["depths"] = choices + for i in [x for x,_ in choices]: + context[str(i)] = self.object.get_records_of_depth(i) + return context +