diff --git a/RIGS/static/imgs/tappytaptap.gif b/RIGS/static/imgs/tappytaptap.gif
new file mode 100644
index 00000000..ff7511bb
Binary files /dev/null and b/RIGS/static/imgs/tappytaptap.gif differ
diff --git a/templates/index.html b/templates/index.html
index 2dd304ef..ce238e34 100644
--- a/templates/index.html
+++ b/templates/index.html
@@ -23,7 +23,8 @@
-

+ {% now "m-d" as todays_date %}
+
diff --git a/training/admin.py b/training/admin.py
index 00c93a2c..0f3eacf4 100644
--- a/training/admin.py
+++ b/training/admin.py
@@ -3,7 +3,4 @@ from training import models
from reversion.admin import VersionAdmin
admin.site.register(models.Trainee, VersionAdmin)
-admin.site.register(models.TechnicalAssistant, VersionAdmin)
-admin.site.register(models.Technician, VersionAdmin)
-admin.site.register(models.Supervisor, VersionAdmin)
-admin.site.register(models.Department, VersionAdmin)
+admin.site.register(models.TrainingLevel, VersionAdmin)
diff --git a/training/migrations/0002_auto_20210630_1514.py b/training/migrations/0002_auto_20210630_1514.py
new file mode 100644
index 00000000..cede19b4
--- /dev/null
+++ b/training/migrations/0002_auto_20210630_1514.py
@@ -0,0 +1,118 @@
+# Generated by Django 3.1.5 on 2021-06-30 14:14
+
+import RIGS.models
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('training', '0001_initial'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='TrainingItemQualification',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('depth', models.IntegerField(choices=[(0, 'Training Started'), (1, 'Training Complete'), (2, 'Passed Out')])),
+ ('date', models.DateTimeField()),
+ ('notes', models.TextField()),
+ ],
+ ),
+ migrations.CreateModel(
+ name='TrainingLevel',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('department', models.CharField(max_length=50, null=True)),
+ ('level', models.IntegerField(choices=[(0, 'Technical Assistant'), (1, 'Technician'), (2, 'Supervisor')])),
+ ],
+ bases=(models.Model, RIGS.models.RevisionMixin),
+ ),
+ migrations.CreateModel(
+ name='TrainingLevelQualification',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('confirmed_on', models.DateTimeField()),
+ ('confirmed_by', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='confirmer', to='training.trainee')),
+ ('level', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='training.traininglevel')),
+ ('trainee', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='levels', to='training.trainee')),
+ ],
+ ),
+ migrations.RemoveField(
+ model_name='supervisor',
+ name='department',
+ ),
+ migrations.RemoveField(
+ model_name='supervisor',
+ name='requirements',
+ ),
+ migrations.RemoveField(
+ model_name='technicalassistant',
+ name='requirements',
+ ),
+ migrations.RemoveField(
+ model_name='technician',
+ name='department',
+ ),
+ migrations.RemoveField(
+ model_name='technician',
+ name='requirements',
+ ),
+ migrations.RemoveField(
+ model_name='trainingiteminstance',
+ name='item',
+ ),
+ migrations.RemoveField(
+ model_name='trainingiteminstance',
+ name='passed_out_by',
+ ),
+ migrations.RemoveField(
+ model_name='trainingiteminstance',
+ name='trainee',
+ ),
+ migrations.RemoveField(
+ model_name='trainingiteminstance',
+ name='training_complete_by',
+ ),
+ migrations.RemoveField(
+ model_name='trainingiteminstance',
+ name='training_started_by',
+ ),
+ migrations.AlterField(
+ model_name='trainingitem',
+ name='category',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='training.trainingcategory'),
+ ),
+ migrations.DeleteModel(
+ name='Department',
+ ),
+ migrations.DeleteModel(
+ name='Supervisor',
+ ),
+ migrations.DeleteModel(
+ name='TechnicalAssistant',
+ ),
+ migrations.DeleteModel(
+ name='Technician',
+ ),
+ migrations.DeleteModel(
+ name='TrainingItemInstance',
+ ),
+ migrations.AddField(
+ model_name='trainingitemqualification',
+ name='item',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='training.trainingitem'),
+ ),
+ migrations.AddField(
+ model_name='trainingitemqualification',
+ name='supervisor',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='training_started', to='training.trainee'),
+ ),
+ migrations.AddField(
+ model_name='trainingitemqualification',
+ name='trainee',
+ field=models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='items', to='training.trainee'),
+ ),
+ ]
diff --git a/training/models.py b/training/models.py
index cb346452..f880ed64 100644
--- a/training/models.py
+++ b/training/models.py
@@ -10,52 +10,50 @@ class Trainee(Profile):
# Items
class TrainingCategory(models.Model):
- number = models.CharField(max_length=3) # Does this 1:1 correspond with a department? I think the answer is sometimes...
- name = models.CharField(max_length=50)
-
-
-class TrainingItem(models.Model):
- category = models.ForeignKey('TrainingCategory', on_delete=models.CASCADE)
number = models.CharField(max_length=3)
name = models.CharField(max_length=50)
-class TrainingItemInstance(models.Model):
- item = models.ForeignKey('TrainingItem', on_delete=models.CASCADE)
- trainee = models.ForeignKey('Trainee', related_name='items', on_delete=models.CASCADE)
-
- training_started_on = models.DateField()
- training_started_by = models.ForeignKey('Trainee', related_name='training_started', on_delete=models.CASCADE)
-
- training_complete_on = models.DateField()
- training_complete_by = models.ForeignKey('Trainee', related_name='training_complete', on_delete=models.CASCADE)
-
- passed_out_on = models.DateField()
- passed_out_by = models.ForeignKey('Trainee', related_name='passed_out', on_delete=models.CASCADE)
-
-
-class Department(models.Model):
+class TrainingItem(models.Model):
+ category = models.ForeignKey('TrainingCategory', on_delete=models.RESTRICT)
+ number = models.CharField(max_length=3)
name = models.CharField(max_length=50)
+# TODO Validation that dates cannot be in the future
+class TrainingItemQualification(models.Model):
+ STARTED = 0
+ COMPLETE = 1
+ PASSED_OUT = 2
+ CHOICES = (
+ (STARTED, 'Training Started'),
+ (COMPLETE, 'Training Complete'),
+ (PASSED_OUT, 'Passed Out'),
+ )
+ item = models.ForeignKey('TrainingItem', on_delete=models.RESTRICT)
+ trainee = models.ForeignKey('Trainee', related_name='items', on_delete=models.RESTRICT)
+ depth = models.IntegerField(choices=CHOICES)
+ date = models.DateTimeField()
+ supervisor = models.ForeignKey('Trainee', related_name='training_started', on_delete=models.RESTRICT)
+ notes = models.TextField()
+
+
# Levels
class TrainingLevel(models.Model, RevisionMixin):
- requirements = models.ManyToManyField(TrainingItem)
-
- class Meta:
- abstract = True
-
-@reversion.register
-class TechnicalAssistant(TrainingLevel):
- # department = models.ForeignKey('Department', on_delete=models.CASCADE)
- pass
+ ASSISTANT = 0
+ TECHNICIAN = 1
+ SUPERVISOR = 2
+ CHOICES = (
+ (ASSISTANT, 'Technical Assistant'),
+ (TECHNICIAN, 'Technician'),
+ (SUPERVISOR, 'Supervisor'),
+ )
+ department = models.CharField(max_length=50, null=True) # Technical Assistant does not have a department
+ level = models.IntegerField(choices=CHOICES)
-@reversion.register
-class Technician(TrainingLevel):
- department = models.ForeignKey('Department', on_delete=models.CASCADE)
-
-
-@reversion.register
-class Supervisor(TrainingLevel):
- department = models.ForeignKey('Department', on_delete=models.CASCADE)
+class TrainingLevelQualification(models.Model):
+ trainee = models.ForeignKey('Trainee', related_name='levels', on_delete=models.RESTRICT)
+ level = models.ForeignKey('TrainingLevel', on_delete=models.RESTRICT)
+ confirmed_on = models.DateTimeField()
+ confirmed_by = models.ForeignKey('Trainee', related_name='confirmer', on_delete=models.RESTRICT)
diff --git a/training/templates/item_list.html b/training/templates/item_list.html
new file mode 100644
index 00000000..76479fdb
--- /dev/null
+++ b/training/templates/item_list.html
@@ -0,0 +1,5 @@
+{% extends 'base_rigs.html' %}
+
+{% block content %}
+
+{% endblock %}
diff --git a/training/urls.py b/training/urls.py
new file mode 100644
index 00000000..d2d839f0
--- /dev/null
+++ b/training/urls.py
@@ -0,0 +1,5 @@
+from django.urls import path
+
+urlpatterns = [
+
+]