From 813b1dac859d6c0304a1285cfaf876351454943c Mon Sep 17 00:00:00 2001 From: FreneticScribbler Date: Tue, 29 Sep 2020 17:59:03 +0100 Subject: [PATCH] Allow multiple event checklists per event TODO: Status chip now needs rethinking --- RIGS/hs.py | 4 +- RIGS/migrations/0041_auto_20200929_1749.py | 80 ++++++++++++++++++++++ RIGS/models.py | 34 +++++---- RIGS/templates/hs_list.html | 12 +++- RIGS/templates/partials/event_status.html | 5 +- RIGS/templates/partials/hs_details.html | 11 ++- RIGS/templates/partials/hs_status.html | 5 +- RIGS/templatetags/filters.py | 4 ++ 8 files changed, 129 insertions(+), 26 deletions(-) create mode 100644 RIGS/migrations/0041_auto_20200929_1749.py diff --git a/RIGS/hs.py b/RIGS/hs.py index e3eff98d..230a43ca 100644 --- a/RIGS/hs.py +++ b/RIGS/hs.py @@ -127,7 +127,7 @@ class EventChecklistCreate(generic.CreateView): template_name = 'event_checklist_form.html' form_class = forms.EventChecklistForm - def get(self, *args, **kwargs): + """def get(self, *args, **kwargs): epk = kwargs.get('pk') event = models.Event.objects.get(pk=epk) @@ -137,7 +137,7 @@ class EventChecklistCreate(generic.CreateView): if ra is not None: return HttpResponseRedirect(reverse_lazy('ec_edit', kwargs={'pk': ra.pk})) - return super(EventChecklistCreate, self).get(self) + return super(EventChecklistCreate, self).get(self)""" def get_form(self, **kwargs): form = super(EventChecklistCreate, self).get_form(**kwargs) diff --git a/RIGS/migrations/0041_auto_20200929_1749.py b/RIGS/migrations/0041_auto_20200929_1749.py new file mode 100644 index 00000000..acdc90da --- /dev/null +++ b/RIGS/migrations/0041_auto_20200929_1749.py @@ -0,0 +1,80 @@ +# Generated by Django 3.1 on 2020-09-29 16:49 + +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion + + +class Migration(migrations.Migration): + + dependencies = [ + ('RIGS', '0040_auto_20200925_2141'), + ] + + operations = [ + migrations.AlterField( + model_name='eventchecklist', + name='ear_plugs', + field=models.BooleanField(blank=True, help_text='Ear plugs issued to crew where needed?', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='earthing', + field=models.BooleanField(blank=True, help_text='Equipment appropriately earthed?
(truss, stage, generators etc)', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='event', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checklists', to='RIGS.event'), + ), + migrations.AlterField( + model_name='eventchecklist', + name='event_size', + field=models.IntegerField(blank=True, choices=[(0, 'Small'), (1, 'Medium'), (2, 'Large')], null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='exits', + field=models.BooleanField(blank=True, help_text='Emergency exits clear?', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='extinguishers_location', + field=models.CharField(blank=True, help_text='Location of fire extinguishers', max_length=255, null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='hs_location', + field=models.CharField(blank=True, help_text='Location of Safety Bag/Box', max_length=255, null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='pat', + field=models.BooleanField(blank=True, help_text='All equipment in PAT period?', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='power_mic', + field=models.ForeignKey(blank=True, help_text='Who is the Power MIC?', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='checklists', to=settings.AUTH_USER_MODEL, verbose_name='Power MIC'), + ), + migrations.AlterField( + model_name='eventchecklist', + name='safe_packing', + field=models.BooleanField(blank=True, help_text='Equipment packed away safely?
(including flightcases)', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='safe_parking', + field=models.BooleanField(blank=True, help_text='Vehicles parked safely?
(does not obstruct venue access)', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='trip_hazard', + field=models.BooleanField(blank=True, help_text='Appropriate barriers around kit and cabling secured?', null=True), + ), + migrations.AlterField( + model_name='eventchecklist', + name='warning_signs', + field=models.BooleanField(blank=True, help_text='Warning signs in place?
(strobe, smoke, power etc.)'), + ), + ] diff --git a/RIGS/models.py b/RIGS/models.py index 29da69b5..1a4f77eb 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -383,6 +383,10 @@ class Event(models.Model, RevisionMixin): else: return bool(self.purchase_order) + @property + def hs_done(self): + return self.riskassessment is not None and len(self.checklists.all()) > 0 + @property def has_start_time(self): return self.start_time is not None @@ -684,31 +688,31 @@ class EventChecklist(models.Model, RevisionMixin): MEDIUM = (1, 'Medium') LARGE = (2, 'Large') SIZES = (SMALL, MEDIUM, LARGE) - event = models.OneToOneField('Event', on_delete=models.CASCADE) + event = models.ForeignKey('Event', related_name='checklists', on_delete=models.CASCADE) # General - power_mic = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='checklists', null=True, + power_mic = models.ForeignKey(settings.AUTH_USER_MODEL, blank=True, null=True, related_name='checklists', verbose_name="Power MIC", on_delete=models.CASCADE, help_text="Who is the Power MIC?") # 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") + safe_parking = models.BooleanField(blank=True, null=True, help_text="Vehicles parked safely?
(does not obstruct venue access)") + safe_packing = models.BooleanField(blank=True, null=True, help_text="Equipment packed away safely?
(including flightcases)") + exits = models.BooleanField(blank=True, null=True, help_text="Emergency exits clear?") + trip_hazard = models.BooleanField(blank=True, null=True, help_text="Appropriate barriers around kit and cabling secured?") + warning_signs = models.BooleanField(blank=True, help_text="Warning signs in place?
(strobe, smoke, power etc.)") + ear_plugs = models.BooleanField(blank=True, null=True, help_text="Ear plugs issued to crew where needed?") + hs_location = models.CharField(blank=True, null=True, max_length=255, help_text="Location of Safety Bag/Box") + extinguishers_location = models.CharField(blank=True, null=True, max_length=255, help_text="Location of fire extinguishers") # Small Electrical Checks rcds = models.BooleanField(blank=True, null=True, help_text="RCDs installed where needed and tested?") supply_test = models.BooleanField(blank=True, null=True, help_text="Electrical supplies tested?
(using socket tester)") # Shared electrical checks - earthing = models.BooleanField(help_text="Equipment appropriately earthed?
(truss, stage, generators etc)") - pat = models.BooleanField(help_text="All equipment in PAT period?") + earthing = models.BooleanField(blank=True, null=True, help_text="Equipment appropriately earthed?
(truss, stage, generators etc)") + pat = models.BooleanField(blank=True, null=True, help_text="All equipment in PAT period?") - event_size = models.IntegerField(choices=SIZES) + event_size = models.IntegerField(blank=True, null=True, choices=SIZES) # Medium Electrical Checks source_rcd = models.BooleanField(blank=True, null=True, help_text="Source RCD protected?
(if cable is more than 3m long) ") labelling = models.BooleanField(blank=True, null=True, help_text="Appropriate and clear labelling on distribution and cabling?") @@ -748,7 +752,7 @@ class EventChecklist(models.Model, RevisionMixin): ('review_eventchecklist', 'Can review Event Checklists') ] - def clean(self): + """def clean(self): errdict = {} if self.power_mic is None: @@ -768,7 +772,7 @@ class EventChecklist(models.Model, RevisionMixin): errdict['w1_description'] = 'Fully complete at least the first worst case point' if errdict != {}: # If there was an error when validation - raise ValidationError(errdict) + raise ValidationError(errdict)""" @property def activity_feed_string(self): diff --git a/RIGS/templates/hs_list.html b/RIGS/templates/hs_list.html index 96172fae..cb3755e0 100644 --- a/RIGS/templates/hs_list.html +++ b/RIGS/templates/hs_list.html @@ -1,5 +1,6 @@ {% extends 'base_rigs.html' %} {% load paginator from filters %} +{% load button from filters %} {% block title %}H&S Overview{% endblock %} @@ -11,7 +12,7 @@ Event Dates RA - Checklist + Checklists @@ -26,7 +27,14 @@ {% endif %} {% include 'partials/hs_status.html' with event=event object=event.riskassessment view='ra_detail' edit='ra_edit' create='event_ra' review='ra_review' perm=perms.RIGS.review_riskassessment %} - {% include 'partials/hs_status.html' with event=event object=event.eventchecklist view='ec_detail' edit='ec_edit' create='event_ec' review='ec_review' perm=perms.RIGS.review_eventchecklist %} + + {% for checklist in event.checklists.all %} + {% include 'partials/hs_status.html' with event=event object=checklist view='ec_detail' edit='ec_edit' create='event_ec' review='ec_review' perm=perms.RIGS.review_eventchecklist %} +
+ {% endfor %} + + {% empty %} diff --git a/RIGS/templates/partials/event_status.html b/RIGS/templates/partials/event_status.html index 3d53d114..2736e0e2 100644 --- a/RIGS/templates/partials/event_status.html +++ b/RIGS/templates/partials/event_status.html @@ -19,8 +19,9 @@ {% endif %}
{% if not event.dry_hire %} - {% if event.eventchecklist %} - Checklist: {%if event.eventchecklist.reviewed_by%}{%endif%} + {% if event.hs_done %} + {# TODO Display status of all checklists #} + Checklist: {% else %} Checklist: {% endif %} diff --git a/RIGS/templates/partials/hs_details.html b/RIGS/templates/partials/hs_details.html index 3896dd92..cd7918be 100644 --- a/RIGS/templates/partials/hs_details.html +++ b/RIGS/templates/partials/hs_details.html @@ -1,4 +1,4 @@ -
Risk Assessment: {% include 'partials/hs_status.html' with event=event object=event.riskassessment view='ra_detail' edit='ra_edit' create='event_ra' %}
-
Event Checklist:
- {% include 'partials/hs_status.html' with event=event object=event.eventchecklist view='ec_detail' edit='ec_edit' create='event_ec' %} +
Event Checklists:
+ {% for checklist in event.checklists.all %} + {% include 'partials/hs_status.html' with event=event object=checklist view='ec_detail' edit='ec_edit' create='event_ec' review='ec_review' perm=perms.RIGS.review_eventchecklist %} +
+ {% endfor %} +
diff --git a/RIGS/templates/partials/hs_status.html b/RIGS/templates/partials/hs_status.html index b763ef11..d384c6f3 100644 --- a/RIGS/templates/partials/hs_status.html +++ b/RIGS/templates/partials/hs_status.html @@ -1,7 +1,8 @@ +{% load button from filters %} {% if object.pk != None %}
- - + {% button view object.pk 'view' %} + {% button edit object.pk 'edit' %}
{% if object.reviewed_by %} Reviewed by {{object.reviewed_by}} at {{object.reviewed_at}} diff --git a/RIGS/templatetags/filters.py b/RIGS/templatetags/filters.py index bda7a346..429da50a 100644 --- a/RIGS/templatetags/filters.py +++ b/RIGS/templatetags/filters.py @@ -202,4 +202,8 @@ def button(url, pk, type, clazz=None, icon=None, text=None): clazz = "btn-info" icon = "fa-copy" text = "Duplicate" + elif type == 'view': + clazz = "btn-primary" + icon = "fa-eye" + text = "View" return {'target': url, 'id': pk, 'class': clazz, 'icon': icon, 'text': text}