diff --git a/PyRIGS/settings.py b/PyRIGS/settings.py index 82b94bb4..94562a1a 100644 --- a/PyRIGS/settings.py +++ b/PyRIGS/settings.py @@ -61,6 +61,7 @@ INSTALLED_APPS = ( 'users', 'RIGS', 'assets', + 'training', 'debug_toolbar', 'registration', diff --git a/RIGS/admin.py b/RIGS/admin.py index b3d43b71..62c840f5 100644 --- a/RIGS/admin.py +++ b/RIGS/admin.py @@ -14,7 +14,7 @@ from reversion.admin import VersionAdmin from RIGS import models from users import forms as user_forms -# Register your models here. + admin.site.register(models.VatRate, VersionAdmin) admin.site.register(models.Event, VersionAdmin) admin.site.register(models.EventItem, VersionAdmin) diff --git a/RIGS/static/imgs/assets.jpg b/RIGS/static/imgs/assets.jpg new file mode 100644 index 00000000..b0e30bd5 Binary files /dev/null and b/RIGS/static/imgs/assets.jpg differ diff --git a/RIGS/static/imgs/rigs.jpg b/RIGS/static/imgs/rigs.jpg new file mode 100644 index 00000000..6c818570 Binary files /dev/null and b/RIGS/static/imgs/rigs.jpg differ diff --git a/RIGS/static/imgs/training.jpg b/RIGS/static/imgs/training.jpg new file mode 100644 index 00000000..671d54e3 Binary files /dev/null and b/RIGS/static/imgs/training.jpg differ diff --git a/templates/index.html b/templates/index.html index bf95f4c4..2dd304ef 100644 --- a/templates/index.html +++ b/templates/index.html @@ -1,5 +1,6 @@ {% extends 'base_rigs.html' %} {% load humanize %} +{% load static %} {% block title %}RIGS{% endblock %} @@ -7,8 +8,9 @@

Rig Information Gathering System

Welcome back {{ user.get_full_name }}, there {%if rig_count == 1 %}is one rig coming up{%else%}are {{ rig_count|apnumber }} rigs coming up.{%endif%}

-
+
+

Rigboard

Rigboard @@ -17,6 +19,11 @@ New Event {% endif %}
+
+
+
+
+

Asset Database

Asset List @@ -28,6 +35,18 @@ New Supplier {% endif %}
+
+
+
+
+ +

Training Database

+
+
+
+
+
+

Quick Links

TEC Forum diff --git a/training/__init__.py b/training/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/training/admin.py b/training/admin.py new file mode 100644 index 00000000..00c93a2c --- /dev/null +++ b/training/admin.py @@ -0,0 +1,9 @@ +from django.contrib import admin +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) diff --git a/training/apps.py b/training/apps.py new file mode 100644 index 00000000..a94e5537 --- /dev/null +++ b/training/apps.py @@ -0,0 +1,5 @@ +from django.apps import AppConfig + + +class TrainingConfig(AppConfig): + name = 'training' diff --git a/training/migrations/0001_initial.py b/training/migrations/0001_initial.py new file mode 100644 index 00000000..efcf3119 --- /dev/null +++ b/training/migrations/0001_initial.py @@ -0,0 +1,106 @@ +# Generated by Django 3.1.5 on 2021-06-29 16:10 + +import RIGS.models +import django.contrib.auth.models +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + initial = True + + dependencies = [ + ('RIGS', '0041_auto_20210302_1204'), + ] + + operations = [ + migrations.CreateModel( + name='Department', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('name', models.CharField(max_length=50)), + ], + ), + migrations.CreateModel( + name='Trainee', + fields=[ + ('profile_ptr', models.OneToOneField(auto_created=True, on_delete=django.db.models.deletion.CASCADE, parent_link=True, primary_key=True, serialize=False, to='RIGS.profile')), + ], + options={ + 'verbose_name': 'user', + 'verbose_name_plural': 'users', + 'abstract': False, + }, + bases=('RIGS.profile',), + managers=[ + ('objects', django.contrib.auth.models.UserManager()), + ], + ), + migrations.CreateModel( + name='TrainingCategory', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('number', models.CharField(max_length=3)), + ('name', models.CharField(max_length=50)), + ], + ), + migrations.CreateModel( + name='TrainingItem', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('number', models.CharField(max_length=3)), + ('name', models.CharField(max_length=50)), + ('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='training.trainingcategory')), + ], + ), + migrations.CreateModel( + name='TrainingItemInstance', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('training_started_on', models.DateField()), + ('training_complete_on', models.DateField()), + ('passed_out_on', models.DateField()), + ('item', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='training.trainingitem')), + ('passed_out_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='passed_out', to='training.trainee')), + ('trainee', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='items', to='training.trainee')), + ('training_complete_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='training_complete', to='training.trainee')), + ('training_started_by', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='training_started', to='training.trainee')), + ], + ), + migrations.CreateModel( + name='Technician', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('department', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='training.department')), + ('requirements', models.ManyToManyField(to='training.TrainingItem')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, RIGS.models.RevisionMixin), + ), + migrations.CreateModel( + name='TechnicalAssistant', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('requirements', models.ManyToManyField(to='training.TrainingItem')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, RIGS.models.RevisionMixin), + ), + migrations.CreateModel( + name='Supervisor', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('department', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='training.department')), + ('requirements', models.ManyToManyField(to='training.TrainingItem')), + ], + options={ + 'abstract': False, + }, + bases=(models.Model, RIGS.models.RevisionMixin), + ), + ] diff --git a/training/migrations/__init__.py b/training/migrations/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/training/models.py b/training/models.py new file mode 100644 index 00000000..cb346452 --- /dev/null +++ b/training/models.py @@ -0,0 +1,61 @@ +from django.db import models + +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 + +# 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): + name = models.CharField(max_length=50) + + +# 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 + + +@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) diff --git a/training/views.py b/training/views.py new file mode 100644 index 00000000..91ea44a2 --- /dev/null +++ b/training/views.py @@ -0,0 +1,3 @@ +from django.shortcuts import render + +# Create your views here.