mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-02-06 07:08:21 +00:00
Whee broken HEAD
This commit is contained in:
@@ -16,6 +16,7 @@ from django.views.decorators.clickjacking import xframe_options_exempt
|
|||||||
|
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
from assets import models as asset_models
|
from assets import models as asset_models
|
||||||
|
from training import models as training_models
|
||||||
|
|
||||||
|
|
||||||
def is_ajax(request):
|
def is_ajax(request):
|
||||||
@@ -38,7 +39,8 @@ class SecureAPIRequest(generic.View):
|
|||||||
'organisation': models.Organisation,
|
'organisation': models.Organisation,
|
||||||
'profile': models.Profile,
|
'profile': models.Profile,
|
||||||
'event': models.Event,
|
'event': models.Event,
|
||||||
'supplier': asset_models.Supplier
|
'supplier': asset_models.Supplier,
|
||||||
|
'training_item': training_models.TrainingItem,
|
||||||
}
|
}
|
||||||
|
|
||||||
perms = {
|
perms = {
|
||||||
@@ -47,7 +49,8 @@ class SecureAPIRequest(generic.View):
|
|||||||
'organisation': 'RIGS.view_organisation',
|
'organisation': 'RIGS.view_organisation',
|
||||||
'profile': 'RIGS.view_profile',
|
'profile': 'RIGS.view_profile',
|
||||||
'event': None,
|
'event': None,
|
||||||
'supplier': None
|
'supplier': None,
|
||||||
|
'training_item': None, # TODO
|
||||||
}
|
}
|
||||||
|
|
||||||
'''
|
'''
|
||||||
|
|||||||
@@ -72,7 +72,7 @@
|
|||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% include 'item_modal.html' %}
|
{% include 'partials/item_modal.html' %}
|
||||||
<form class="itemised_form" role="form" method="POST">
|
<form class="itemised_form" role="form" method="POST">
|
||||||
{% csrf_token %}
|
{% csrf_token %}
|
||||||
<div class="row">
|
<div class="row">
|
||||||
@@ -326,7 +326,7 @@
|
|||||||
|
|
||||||
<div class="form-group" data-toggle="tooltip" title="The purchase order number (for external clients)">
|
<div class="form-group" data-toggle="tooltip" title="The purchase order number (for external clients)">
|
||||||
<label for="{{ form.purchase_order.id_for_label }}"
|
<label for="{{ form.purchase_order.id_for_label }}"
|
||||||
class="col-sm-4 col-form-label">{{ form.purchase_order.label }}</label>
|
class="col-sm-4 col-fitem_tableorm-label">{{ form.purchase_order.label }}</label>
|
||||||
|
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
{% render_field form.purchase_order class+="form-control" %}
|
{% render_field form.purchase_order class+="form-control" %}
|
||||||
@@ -348,7 +348,7 @@
|
|||||||
{% render_field form.notes class+="form-control" %}
|
{% render_field form.notes class+="form-control" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{% include 'item_table.html' %}
|
{% include 'partials/item_table.html' %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -26,7 +26,7 @@
|
|||||||
<div class="col-sm-12">
|
<div class="col-sm-12">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
{% with object=event auth=True %}
|
{% with object=event auth=True %}
|
||||||
{% include 'item_table.html' %}
|
{% include 'partials/item_table.html' %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -78,7 +78,7 @@
|
|||||||
<div class="col-sm-6">
|
<div class="col-sm-6">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
{% with object.event as object %}
|
{% with object.event as object %}
|
||||||
{% include 'item_table.html' %}
|
{% include 'partials/item_table.html' %}
|
||||||
{% endwith %}
|
{% endwith %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ from django.contrib import admin
|
|||||||
from training import models
|
from training import models
|
||||||
from reversion.admin import VersionAdmin
|
from reversion.admin import VersionAdmin
|
||||||
|
|
||||||
admin.site.register(models.Trainee, VersionAdmin)
|
#admin.site.register(models.Trainee, VersionAdmin)
|
||||||
admin.site.register(models.TrainingLevel, VersionAdmin)
|
admin.site.register(models.TrainingLevel, VersionAdmin)
|
||||||
admin.site.register(models.TrainingCategory, VersionAdmin)
|
admin.site.register(models.TrainingCategory, VersionAdmin)
|
||||||
admin.site.register(models.TrainingItem, VersionAdmin)
|
admin.site.register(models.TrainingItem, VersionAdmin)
|
||||||
|
|||||||
@@ -1,4 +1,20 @@
|
|||||||
from django import forms
|
from django import forms
|
||||||
|
|
||||||
|
from training import models
|
||||||
|
from RIGS.models import Profile
|
||||||
|
|
||||||
class SessionLogForm(forms.Form):
|
class SessionLogForm(forms.Form):
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class QualificationForm(forms.ModelForm):
|
||||||
|
class Meta:
|
||||||
|
model = models.TrainingItemQualification
|
||||||
|
fields = '__all__'
|
||||||
|
# exclude = ['trainee']
|
||||||
|
|
||||||
|
def __init__(self, *args, **kwargs):
|
||||||
|
pk = kwargs.pop('pk', None)
|
||||||
|
super(QualificationForm, self).__init__(*args, **kwargs)
|
||||||
|
self.fields['trainee'].initial = Profile.objects.get(pk=pk)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
# Generated by Django 3.1.5 on 2021-06-29 16:10
|
# Generated by Django 3.1.5 on 2021-07-05 22:01
|
||||||
|
|
||||||
import RIGS.models
|
import RIGS.models
|
||||||
import django.contrib.auth.models
|
import django.contrib.auth.models
|
||||||
@@ -15,33 +15,11 @@ class Migration(migrations.Migration):
|
|||||||
]
|
]
|
||||||
|
|
||||||
operations = [
|
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(
|
migrations.CreateModel(
|
||||||
name='TrainingCategory',
|
name='TrainingCategory',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('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)),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
@@ -49,58 +27,54 @@ class Migration(migrations.Migration):
|
|||||||
name='TrainingItem',
|
name='TrainingItem',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('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)),
|
||||||
('category', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='training.trainingcategory')),
|
('category', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='items', to='training.trainingcategory')),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='TrainingItemInstance',
|
name='TrainingLevel',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
||||||
('training_started_on', models.DateField()),
|
('department', models.CharField(max_length=50, null=True)),
|
||||||
('training_complete_on', models.DateField()),
|
('level', models.IntegerField(choices=[(0, 'Technical Assistant'), (1, 'Technician'), (2, 'Supervisor')])),
|
||||||
('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),
|
bases=(models.Model, RIGS.models.RevisionMixin),
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='TechnicalAssistant',
|
name='Trainee',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
|
||||||
('requirements', models.ManyToManyField(to='training.TrainingItem')),
|
|
||||||
],
|
],
|
||||||
options={
|
options={
|
||||||
'abstract': False,
|
'proxy': True,
|
||||||
|
'indexes': [],
|
||||||
|
'constraints': [],
|
||||||
},
|
},
|
||||||
bases=(models.Model, RIGS.models.RevisionMixin),
|
bases=('RIGS.profile',),
|
||||||
|
managers=[
|
||||||
|
('objects', django.contrib.auth.models.UserManager()),
|
||||||
|
],
|
||||||
),
|
),
|
||||||
migrations.CreateModel(
|
migrations.CreateModel(
|
||||||
name='Supervisor',
|
name='TrainingLevelQualification',
|
||||||
fields=[
|
fields=[
|
||||||
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
|
('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')),
|
('confirmed_on', models.DateTimeField()),
|
||||||
('requirements', models.ManyToManyField(to='training.TrainingItem')),
|
('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.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.DateField()),
|
||||||
|
('notes', models.TextField(blank=True)),
|
||||||
|
('item', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, to='training.trainingitem')),
|
||||||
|
('supervisor', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='qualifications_granted', to='training.trainee')),
|
||||||
|
('trainee', models.ForeignKey(on_delete=django.db.models.deletion.RESTRICT, related_name='qualifications_obtained', to='training.trainee')),
|
||||||
],
|
],
|
||||||
options={
|
|
||||||
'abstract': False,
|
|
||||||
},
|
|
||||||
bases=(models.Model, RIGS.models.RevisionMixin),
|
|
||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,118 +0,0 @@
|
|||||||
# 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'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
# 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'),
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
# 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',
|
|
||||||
),
|
|
||||||
]
|
|
||||||
@@ -9,7 +9,7 @@ class Trainee(Profile):
|
|||||||
proxy = True
|
proxy = True
|
||||||
|
|
||||||
def get_records_of_depth(self, depth):
|
def get_records_of_depth(self, depth):
|
||||||
return self.training_items.filter(depth=depth)
|
return self.qualifications_obtained.filter(depth=depth)
|
||||||
|
|
||||||
# Items
|
# Items
|
||||||
class TrainingCategory(models.Model):
|
class TrainingCategory(models.Model):
|
||||||
@@ -37,12 +37,12 @@ class TrainingItemQualification(models.Model):
|
|||||||
(PASSED_OUT, 'Passed Out'),
|
(PASSED_OUT, 'Passed Out'),
|
||||||
)
|
)
|
||||||
item = models.ForeignKey('TrainingItem', on_delete=models.RESTRICT)
|
item = models.ForeignKey('TrainingItem', on_delete=models.RESTRICT)
|
||||||
trainee = models.ForeignKey('Trainee', related_name='training_items', on_delete=models.RESTRICT)
|
trainee = models.ForeignKey('Trainee', related_name='qualifications_obtained', on_delete=models.RESTRICT)
|
||||||
depth = models.IntegerField(choices=CHOICES)
|
depth = models.IntegerField(choices=CHOICES)
|
||||||
date = models.DateTimeField()
|
date = models.DateField()
|
||||||
# TODO Remember that some training is external. Support for making an organisation the trainer?
|
# 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)
|
supervisor = models.ForeignKey('Trainee', related_name='qualifications_granted', on_delete=models.RESTRICT)
|
||||||
notes = models.TextField()
|
notes = models.TextField(blank=True)
|
||||||
|
|
||||||
|
|
||||||
# Levels
|
# Levels
|
||||||
|
|||||||
57
training/templates/edit_training_record.html
Normal file
57
training/templates/edit_training_record.html
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
{% extends 'base_rigs.html' %}
|
||||||
|
|
||||||
|
{% load static %}
|
||||||
|
{% load widget_tweaks %}
|
||||||
|
|
||||||
|
{% block css %}
|
||||||
|
{{ block.super }}
|
||||||
|
<link rel="stylesheet" type="text/css" href="{% static 'css/selects.css' %}"/>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block preload_js %}
|
||||||
|
{{ block.super }}
|
||||||
|
<script src="{% static 'js/selects.js' %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block js %}
|
||||||
|
{{ block.super }}
|
||||||
|
<script src="{% static 'js/autocompleter.js' %}"></script>
|
||||||
|
<script src="{% static 'js/tooltip.js' %}"></script>
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block content %}
|
||||||
|
{% if form.errors %}
|
||||||
|
{% include 'form_errors.html' %}
|
||||||
|
{% endif %}
|
||||||
|
<form id="item-form" action="{{ form.action|default:request.path }}" method="post">{% csrf_token %}
|
||||||
|
{% render_field form.trainee|attr:'hidden' value=form.trainee.initial %}
|
||||||
|
<div class="form-group form-row">
|
||||||
|
<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>
|
||||||
|
</div>
|
||||||
|
<div class="form-group form-row">
|
||||||
|
<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' %}
|
||||||
|
</div>
|
||||||
|
<div class="form-group form-row">
|
||||||
|
<label for="selectpicker" 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>
|
||||||
|
</div>
|
||||||
|
<div class="form-group form-row">
|
||||||
|
<label for="date" class="col-sm-2 col-form-label">Training Date</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
{% render_field form.date|add_class:'form-control'|attr:'type="date"' %}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="form-group form-row">
|
||||||
|
<label for="item_description" class="col-sm-2 col-form-label">Notes</label>
|
||||||
|
<div class="col-sm-10">
|
||||||
|
<textarea type="text" placeholder="Notes" class="form-control"
|
||||||
|
id="notes" rows="3"></textarea>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<input type="submit" class="btn btn-primary">
|
||||||
|
</form>
|
||||||
|
{% endblock %}
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
{% extends 'base_rigs.html' %}
|
{% extends 'base_rigs.html' %}
|
||||||
|
|
||||||
{% load static %}
|
{% load static %}
|
||||||
|
{% load button from filters %}
|
||||||
|
|
||||||
{% block css %}
|
{% block css %}
|
||||||
{{ block.super }}
|
{{ block.super }}
|
||||||
@@ -23,11 +24,30 @@
|
|||||||
<div class="row">
|
<div class="row">
|
||||||
<div class="col">
|
<div class="col">
|
||||||
<form class="form">
|
<form class="form">
|
||||||
|
<h3>People</h3>
|
||||||
|
<div class="form-group">
|
||||||
|
<label for="selectpicker">Select Supervisor</label>
|
||||||
|
<select name="supervisor" id="supervisor_id" class="form-control selectpicker custom-select" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
<label for="selectpicker">Select Attendees</label>
|
<label for="selectpicker">Select Attendees</label>
|
||||||
<select name="attendees" id="attendees_id" class="form-control selectpicker custom-select" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials">
|
<select multiple name="attendees" id="attendees_id" class="form-control selectpicker custom-select" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials">
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
<h3>Training Items</h3>
|
||||||
|
<div class="row">
|
||||||
|
{% for depth in depths %}
|
||||||
|
<div class="col">
|
||||||
|
<h4>{{ depth.1 }}</h4>
|
||||||
|
<select multiple name="{{ depth.0 }}" id="{{ depth.0 }}_id" class="form-control selectpicker custom-select" data-live-search="true" data-sourceurl="{% url 'api_secure' model='training_item' %}">
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
{% endfor %}
|
||||||
|
</div>
|
||||||
|
<div class="col-sm-12 text-right my-3">
|
||||||
|
{% button 'submit' %}
|
||||||
|
</div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
{% extends 'base_rigs.html' %}
|
{% extends 'base_rigs.html' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
|
<button type="button" class="btn btn-success btn-sm item-add"
|
||||||
|
data-toggle="modal"
|
||||||
|
data-target="#record_modal">
|
||||||
|
<i class="fas fa-plus"></i> Add New Training Record
|
||||||
|
</button>
|
||||||
<div class="row mb-3">
|
<div class="row mb-3">
|
||||||
<h2 class="col-12">Training Levels</h2>
|
<h2 class="col-12">Training Levels</h2>
|
||||||
<p>{{ user.name }} is a...<br></p>
|
<p>{{ user.name }} is a...<br></p>
|
||||||
|
|||||||
@@ -12,5 +12,7 @@ urlpatterns = [
|
|||||||
path('trainee/<int:pk>/',
|
path('trainee/<int:pk>/',
|
||||||
permission_required_with_403('RIGS.view_profile')(views.TraineeDetail.as_view()),
|
permission_required_with_403('RIGS.view_profile')(views.TraineeDetail.as_view()),
|
||||||
name='trainee_detail'),
|
name='trainee_detail'),
|
||||||
|
path('trainee/<int:pk>/edit/', views.AddQualification.as_view(),
|
||||||
|
name='edit_record'),
|
||||||
path('session/', views.SessionLog.as_view(), name='session_log'),
|
path('session/', views.SessionLog.as_view(), name='session_log'),
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
|
|
||||||
|
from django.urls import reverse_lazy
|
||||||
from django.views import generic
|
from django.views import generic
|
||||||
|
from PyRIGS.views import OEmbedView, is_ajax
|
||||||
from training import models, forms
|
from training import models, forms
|
||||||
|
|
||||||
from users import views
|
from users import views
|
||||||
@@ -38,4 +40,29 @@ class SessionLog(generic.FormView):
|
|||||||
def get_context_data(self, **kwargs):
|
def get_context_data(self, **kwargs):
|
||||||
context = super(SessionLog, self).get_context_data(**kwargs)
|
context = super(SessionLog, self).get_context_data(**kwargs)
|
||||||
context["page_title"] = "Log New Training Session"
|
context["page_title"] = "Log New Training Session"
|
||||||
|
context["depths"] = models.TrainingItemQualification.CHOICES
|
||||||
|
return context
|
||||||
|
|
||||||
|
|
||||||
|
class AddQualification(generic.CreateView):
|
||||||
|
template_name = "edit_training_record.html"
|
||||||
|
model = models.TrainingItemQualification
|
||||||
|
form_class = forms.QualificationForm
|
||||||
|
|
||||||
|
def get_context_data(self, **kwargs):
|
||||||
|
context = super(AddQualification, self).get_context_data(**kwargs)
|
||||||
|
# context["page_title"] = "Edit {}'s Training Record".format(self.object)
|
||||||
|
context["depths"] = models.TrainingItemQualification.CHOICES
|
||||||
|
if is_ajax(self.request):
|
||||||
|
context['override'] = "base_ajax.html"
|
||||||
|
else:
|
||||||
|
context['override'] = 'base_rigs.html' # TODO
|
||||||
|
return context
|
||||||
|
|
||||||
|
def get_success_url(self):
|
||||||
|
return reverse_lazy('trainee_detail')
|
||||||
|
|
||||||
|
def get_form_kwargs(self):
|
||||||
|
kwargs = super(AddQualification, self).get_form_kwargs()
|
||||||
|
kwargs['pk'] = self.kwargs['pk']
|
||||||
|
return kwargs
|
||||||
|
|||||||
Reference in New Issue
Block a user