diff --git a/RIGS/forms.py b/RIGS/forms.py
index 0b4b14de..c97e937a 100644
--- a/RIGS/forms.py
+++ b/RIGS/forms.py
@@ -169,3 +169,9 @@ class EventRiskAssessmentForm(forms.ModelForm):
model = models.RiskAssessment
fields = '__all__'
exclude = ['reviewed_at', 'reviewed_by']
+
+
+class EventChecklistForm(forms.ModelForm):
+ class Meta:
+ model = models.EventChecklist
+ fields = '__all__'
diff --git a/RIGS/hs.py b/RIGS/hs.py
index 9074e50c..9e9752ee 100644
--- a/RIGS/hs.py
+++ b/RIGS/hs.py
@@ -83,3 +83,55 @@ class EventRiskAssessmentReview(generic.View):
ra.reviewed_at = timezone.now()
ra.save()
return HttpResponseRedirect(reverse_lazy('ra_list'))
+
+
+class EventChecklistDetail(generic.DetailView):
+ model = models.EventChecklist
+ template_name = 'event_checklist_detail.html'
+
+class EventChecklistEdit(generic.UpdateView):
+ model = models.EventChecklist
+ template_name = 'event_checklist_form.html'
+ form_class = forms.EventChecklistForm
+
+ def get_context_data(self, **kwargs):
+ context = super(EventChecklistEdit, self).get_context_data(**kwargs)
+ pk = self.kwargs.get('pk')
+ ec = models.EventChecklist.objects.get(pk=pk)
+ context['event'] = ec.event
+ context['edit'] = True
+ return context
+
+class EventChecklistCreate(generic.CreateView):
+ model = models.EventChecklist
+ template_name = 'event_checklist_form.html'
+ form_class = forms.EventChecklistForm
+
+ def get(self, *args, **kwargs):
+ epk = kwargs.get('pk')
+ event = models.Event.objects.get(pk=epk)
+
+ # Check if RA exists
+ ra = models.EventChecklist.objects.filter(event=event).first()
+
+ if ra is not None:
+ return HttpResponseRedirect(reverse_lazy('ec_edit', kwargs={'pk': ra.pk}))
+
+ return super(EventChecklistCreate, self).get(self)
+
+ def get_form(self, **kwargs):
+ form = super(EventChecklistCreate, self).get_form(**kwargs)
+ epk = self.kwargs.get('pk')
+ event = models.Event.objects.get(pk=epk)
+ form.instance.event = event
+ return form
+
+ def get_context_data(self, **kwargs):
+ context = super(EventChecklistCreate, self).get_context_data(**kwargs)
+ epk = self.kwargs.get('pk')
+ event = models.Event.objects.get(pk=epk)
+ context['event'] = event
+ return context
+
+ def get_success_url(self):
+ return reverse_lazy('ec_detail', kwargs={'pk': self.object.pk})
diff --git a/RIGS/migrations/0044_eventchecklist.py b/RIGS/migrations/0044_eventchecklist.py
new file mode 100644
index 00000000..f16ed9b3
--- /dev/null
+++ b/RIGS/migrations/0044_eventchecklist.py
@@ -0,0 +1,38 @@
+# Generated by Django 3.0.7 on 2020-08-14 15:28
+
+import RIGS.models
+from django.conf import settings
+from django.db import migrations, models
+import django.db.models.deletion
+
+
+class Migration(migrations.Migration):
+
+ dependencies = [
+ ('RIGS', '0043_auto_20200805_1606'),
+ ]
+
+ operations = [
+ migrations.CreateModel(
+ name='EventChecklist',
+ fields=[
+ ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
+ ('vehicles', models.TextField(help_text='List vehicles and their drivers')),
+ ('safe_parking', models.BooleanField(help_text='Vehicles parked safely?(does not obstruct venue access)')),
+ ('safe_packing', models.BooleanField(help_text='Equipment packed away safely?(including flightcases)')),
+ ('exits', models.BooleanField(help_text='Emergency exits clear?')),
+ ('trip_hazard', models.BooleanField(help_text='Appropriate barriers around kit and cabling secured?')),
+ ('warning_signs', models.BooleanField(help_text='Warning signs in place?(strobe, smoke, power etc.)')),
+ ('ear_plugs', models.BooleanField(help_text='Ear plugs issued to crew where needed?')),
+ ('hs_location', models.TextField(help_text='Location of Safety Bag/Box')),
+ ('extinguishers_location', models.TextField(help_text='Location of fire extinguishers')),
+ ('rcds', models.BooleanField(help_text='RCDs installed where needed and tested?')),
+ ('supply_test', models.BooleanField(help_text='Electrical supplies tested?(using socket tester)')),
+ ('earthing', models.BooleanField(help_text='Equipment appropriately earthed?(truss, stage, etc)')),
+ ('pat', models.BooleanField(help_text='All equipment in PAT period?')),
+ ('event', models.OneToOneField(on_delete=django.db.models.deletion.CASCADE, to='RIGS.Event')),
+ ('power_mic', models.ForeignKey(blank=True, help_text='Who is the Power MIC?', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checklist', to=settings.AUTH_USER_MODEL, verbose_name='Power MIC')),
+ ],
+ bases=(models.Model, RIGS.models.RevisionMixin),
+ ),
+ ]
diff --git a/RIGS/models.py b/RIGS/models.py
index f0ffe0be..edef1cca 100644
--- a/RIGS/models.py
+++ b/RIGS/models.py
@@ -639,3 +639,41 @@ class RiskAssessment(models.Model, RevisionMixin):
def __str__(self):
return "%i - %s" % (self.pk, self.event)
+
+@reversion.register
+class EventChecklist(models.Model, RevisionMixin):
+ event = models.OneToOneField('Event', on_delete=models.CASCADE)
+
+ # General
+ power_mic = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='checklist', blank=True, null=True,
+ verbose_name="Power MIC", on_delete=models.CASCADE, help_text="Who is the Power MIC?")
+ # TODO Tabular format
+ vehicles = models.TextField(help_text="List vehicles and their drivers")
+
+ # Safety Checks
+ safe_parking = models.BooleanField(help_text="Vehicles parked safely?
(does not obstruct venue access)")
+ safe_packing = models.BooleanField(help_text="Equipment packed away safely?
(including flightcases)")
+ exits = models.BooleanField(help_text="Emergency exits clear?")
+ trip_hazard = models.BooleanField(help_text="Appropriate barriers around kit and cabling secured?")
+ warning_signs = models.BooleanField(help_text="Warning signs in place?
(strobe, smoke, power etc.)")
+ ear_plugs = models.BooleanField(help_text="Ear plugs issued to crew where needed?")
+ hs_location = models.CharField(max_length=255, help_text="Location of Safety Bag/Box")
+ extinguishers_location = models.CharField(max_length=255, help_text="Location of fire extinguishers")
+
+ # Crew Record TODO
+
+ # Small Electrical Checks
+ rcds = models.BooleanField(help_text="RCDs installed where needed and tested?")
+ supply_test = models.BooleanField(help_text="Electrical supplies tested?
(using socket tester)")
+ earthing = models.BooleanField(help_text="Equipment appropriately earthed?
(truss, stage, etc)")
+ pat = models.BooleanField(help_text="All equipment in PAT period?")
+
+ @property
+ def activity_feed_string(self):
+ return str(self.event)
+
+ def get_absolute_url(self):
+ return reverse_lazy('ec_detail', kwargs={'pk': self.pk})
+
+ def __str__(self):
+ return "%i - %s" % (self.pk, self.event)
diff --git a/RIGS/templates/event_checklist_detail.html b/RIGS/templates/event_checklist_detail.html
new file mode 100644
index 00000000..9888a68c
--- /dev/null
+++ b/RIGS/templates/event_checklist_detail.html
@@ -0,0 +1,156 @@
+{% extends request.is_ajax|yesno:"base_ajax.html,base_rigs.html" %}
+{% block title %}Risk Assessment for Event N{{ object.event.pk|stringformat:"05d" }} {{ object.event.name }}{% endblock %}
+{% load help_text from filters %}
+
+{% block content %}
+