Initial shenanigans on storing my overly fancy EC form

This commit is contained in:
2020-08-24 17:25:25 +01:00
parent da60cad911
commit 8bb08724b6
9 changed files with 183 additions and 110 deletions

View File

@@ -141,3 +141,12 @@ class EventChecklistList(generic.ListView):
paginate_by = 20 paginate_by = 20
model = models.EventChecklist model = models.EventChecklist
template_name = 'event_checklist_list.html' template_name = 'event_checklist_list.html'
class HSList(generic.ListView):
paginate_by = 20
model = models.Event
template_name = 'hs_list.html'
def get_queryset(self):
return models.Event.objects.all().order_by('-start_date')

View File

@@ -0,0 +1,54 @@
# Generated by Django 3.0.7 on 2020-08-24 13:31
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
('RIGS', '0044_eventchecklist'),
]
operations = [
migrations.AddField(
model_name='eventchecklist',
name='medium_event',
field=models.BooleanField(default=False),
preserve_default=False,
),
migrations.AlterField(
model_name='eventchecklist',
name='earthing',
field=models.BooleanField(help_text='Equipment appropriately earthed?<br><small>(truss, stage, etc)</small>'),
),
migrations.AlterField(
model_name='eventchecklist',
name='extinguishers_location',
field=models.CharField(help_text='Location of fire extinguishers', max_length=255),
),
migrations.AlterField(
model_name='eventchecklist',
name='hs_location',
field=models.CharField(help_text='Location of Safety Bag/Box', max_length=255),
),
migrations.AlterField(
model_name='eventchecklist',
name='safe_packing',
field=models.BooleanField(help_text='Equipment packed away safely?<br><small>(including flightcases)</small>'),
),
migrations.AlterField(
model_name='eventchecklist',
name='safe_parking',
field=models.BooleanField(help_text='Vehicles parked safely?<br><small>(does not obstruct venue access)</small>'),
),
migrations.AlterField(
model_name='eventchecklist',
name='supply_test',
field=models.BooleanField(help_text='Electrical supplies tested?<br><small>(using socket tester)</small>'),
),
migrations.AlterField(
model_name='eventchecklist',
name='warning_signs',
field=models.BooleanField(help_text='Warning signs in place?<br><small>(strobe, smoke, power etc.)</small>'),
),
]

View File

@@ -642,13 +642,13 @@ class RiskAssessment(models.Model, RevisionMixin):
@reversion.register @reversion.register
class EventChecklist(models.Model, RevisionMixin): class EventChecklist(models.Model, RevisionMixin):
event = models.OneToOneField('Event', on_delete=models.CASCADE) event = models.OneToOneField('Event', on_delete=models.CASCADE)
# General # General
power_mic = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='checklist', blank=True, null=True, 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?") verbose_name="Power MIC", on_delete=models.CASCADE, help_text="Who is the Power MIC?")
# TODO Tabular format vehicles = models.JSONField(help_text="List vehicles and their drivers", default=dict, null=False)
vehicles = models.TextField(help_text="List vehicles and their drivers")
# Safety Checks # Safety Checks
safe_parking = models.BooleanField(help_text="Vehicles parked safely?<br><small>(does not obstruct venue access)</small>") safe_parking = models.BooleanField(help_text="Vehicles parked safely?<br><small>(does not obstruct venue access)</small>")
@@ -668,6 +668,9 @@ class EventChecklist(models.Model, RevisionMixin):
earthing = models.BooleanField(help_text="Equipment appropriately earthed?<br><small>(truss, stage, etc)</small>") earthing = models.BooleanField(help_text="Equipment appropriately earthed?<br><small>(truss, stage, etc)</small>")
pat = models.BooleanField(help_text="All equipment in PAT period?") pat = models.BooleanField(help_text="All equipment in PAT period?")
medium_event = models.BooleanField()
# Medium Electrical Checks
@property @property
def activity_feed_string(self): def activity_feed_string(self):
return str(self.event) return str(self.event)

View File

@@ -59,8 +59,9 @@
H&S H&S
</a> </a>
<div class="dropdown-menu" aria-labelledby="navbarDropdownHS"> <div class="dropdown-menu" aria-labelledby="navbarDropdownHS">
<a class="dropdown-item" href="{% url 'ra_list' %}">Risk Assessment List</a> <a class="dropdown-item" href="{% url 'hs_list' %}">Overview</a>
<a class="dropdown-item" href="{% url 'ec_list' %}">Event Checklist List</a> <a class="dropdown-item" href="{% url 'ra_list' %}">Risk Assessments</a>
<a class="dropdown-item" href="{% url 'ec_list' %}">Event Checklists</a>
</div> </div>
</li> </li>
{% endif %} {% endif %}

View File

@@ -16,30 +16,6 @@
<div class="card-header">General</div> <div class="card-header">General</div>
<div class="card-body"> <div class="card-body">
<dl class="row"> <dl class="row">
<dt class="col-10">{{ object|help_text:'nonstandard_equipment' }}</dt>
<dd class="col-2">
{{ object.nonstandard_equipment|yesno|title }}
</dd>
<dt class="col-10">{{ object|help_text:'nonstandard_use'|safe }}</dt>
<dd class="col-2">
{{ object.nonstandard_use|yesno|title }}
</dd>
<dt class="col-10">{{ object|help_text:'contractors' }}</dt>
<dd class="col-2">
{{ object.contractors|yesno|title }}
</dd>
<dt class="col-10">{{ object|help_text:'other_companies' }}</dt>
<dd class="col-2">
{{ object.othercompanies|yesno|title }}
</dd>
<dt class="col-10">{{ object|help_text:'crew_fatigue' }}</dt>
<dd class="col-2">
{{ object.crewfatigue|yesno|title }}
</dd>
<dt class="col-12">{{ object|help_text:'general_notes' }}</dt>
<dd class="col-12">
{{ object.general_notes|default:'N/A'|linebreaks }}
</dd>
</dl> </dl>
</div> </div>
</div> </div>
@@ -47,34 +23,6 @@
<div class="card-header">Power</div> <div class="card-header">Power</div>
<div class="card-body"> <div class="card-body">
<dl class="row"> <dl class="row">
<dt class="col-sm-6">{{ object|help_text:'big_power' }}</dt>
<dd class="col-sm-6">
{{ object.big_power|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'power_mic' }}</dt>
<dd class="col-sm-6">
{{ object.power_mic.name|default:'None' }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'generators' }}</dt>
<dd class="col-sm-6">
{{ object.generators|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'other_companies_power' }}</dt>
<dd class="col-sm-6">
{{ object.other_companies_power|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'nonstandard_equipment_power' }}</dt>
<dd class="col-sm-6">
{{ object.nonstandard_equipment_power|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'multiple_electrical_environments' }}</dt>
<dd class="col-sm-6">
{{ object.multiple_electrical_environments|yesno|title }}
</dd>
<dt class="col-12">{{ object|help_text:'power_notes' }}</dt>
<dd class="col-12">
{{ object.power_notes|default:'N/A'|linebreaks }}
</dd>
</dl> </dl>
</div> </div>
</div> </div>
@@ -82,14 +30,6 @@
<div class="card-header">Sound</div> <div class="card-header">Sound</div>
<div class="card-body"> <div class="card-body">
<dl class="row"> <dl class="row">
<dt class="col-sm-6">{{ object|help_text:'noise_monitoring' }}</dt>
<dd class="col-sm-6">
{{ object.noise_monitoring|yesno|title }}
</dd>
<dt class="col-12">{{ object|help_text:'sound_notes' }}</dt>
<dd class="col-12">
{{ object.sound_notes|default:'N/A'|linebreaks }}
</dd>
</dl> </dl>
</div> </div>
</div> </div>
@@ -97,50 +37,12 @@
<div class="card-header">Site Details</div> <div class="card-header">Site Details</div>
<div class="card-body"> <div class="card-body">
<dl class="row"> <dl class="row">
<dt class="col-sm-6">{{ object|help_text:'known_venue' }}</dt>
<dd class="col-sm-6">
{{ object.known_venue|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'safe_loading'|safe }}</dt>
<dd class="col-sm-6">
{{ object.safe_loading.name|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'safe_storage' }}</dt>
<dd class="col-sm-6">
{{ object.safe_storage|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'area_outside_of_control' }}</dt>
<dd class="col-sm-6">
{{ object.area_outside_of_control|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'barrier_required' }}</dt>
<dd class="col-sm-6">
{{ object.barrier_required|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'nonstandard_emergency_procedure' }}</dt>
<dd class="col-sm-6">
{{ object.nonstandard_emergency_procedure|yesno|title }}
</dd>
</dl> </dl>
</div> </div>
</div> </div>
<div class="card card-default mb-3"> <div class="card card-default mb-3">
<div class="card-header">Structures</div> <div class="card-header">Structures</div>
<div class="card-body"> <div class="card-body">
<dl class="row">
<dt class="col-sm-6">{{ object|help_text:'special_structures' }}</dt>
<dd class="col-sm-6">
{{ object.special_structures|yesno|title }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'persons_responsible_structures' }}</dt>
<dd class="col-sm-6">
{{ object.persons_responsible_structures.name|default:'N/A'|linebreaks }}
</dd>
<dt class="col-sm-6">{{ object|help_text:'suspended_structures' }}</dt>
<dd class="col-sm-6">
{{ object.suspended_structures|yesno|title }}
</dd>
</dl>
</div> </div>
</div> </div>
</div> </div>

View File

@@ -25,6 +25,38 @@
<script src="{% static 'js/tooltip.js' %}"></script> <script src="{% static 'js/tooltip.js' %}"></script>
<script src="{% static 'js/autocompleter.js' %}"></script> <script src="{% static 'js/autocompleter.js' %}"></script>
<script>
$(document).ready(function () {
{% if not object.pk %}
$('.form-hide').slideUp();
{% else %}
{% if object.medium_event %}
$('#small-event').slideUp();
$('#medium-event').slideDown();
{% else %}
$('#small-event').slideDown();
$('#medium-event').slideUp();
{% endif%}
{% endif %}
$('#size-selector button').on('click', function () {
$(this).toggleClass('active');
$('#size-selector button').not(this).removeClass('active');
if ($(this).data('event-size') == 1) {
$('#{{form.medium_event.auto_id}}').prop('checked', true);
$('#small-event').slideUp();
$('#medium-event').slideDown();
} else {
$('#{{form.medium_event.auto_id}}').prop('checked', false);
$('#small-event').slideDown();
$('#medium-event').slideUp();
}
});
$("form").submit(function( event ) {
$({{form.vehicles.id_for_label}}).val(JSON.stringify($('*[data-serialize]').serializeArray()));
});
});
</script>
{% endblock %} {% endblock %}
{% block content %} {% block content %}
@@ -64,6 +96,8 @@
</select> </select>
</div> </div>
<label class="col-12 pt-3" for="{{ form.vehicles.id_for_label }}">{{ form.vehicles.help_text }}</label> <label class="col-12 pt-3" for="{{ form.vehicles.id_for_label }}">{{ form.vehicles.help_text }}</label>
<input name="{{ form.vehicles.name }}" id="{{ form.vehicles.id_for_label }}"
value="{{ form.vehicles.value }}"/>
<table class="table"> <table class="table">
<thead> <thead>
<tr> <tr>
@@ -73,13 +107,10 @@
</thead> </thead>
<tbody> <tbody>
{% for i in '012'|make_list %} {% for i in '012'|make_list %}
<tr> <tr id="vehicles">
<td><input type="text" class="form-control"/></td> <td><input name="vehicle_{{i}}" type="text" class="form-control" data-serialize="true"/></td>
<th scope="row"> <th scope="row">
<select id="{{ form.power_mic.id_for_label }}" name="{{ form.power_mic.name }}" class="form-control selectpicker" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials"> <select name="driver_{{i}}" class="form-control selectpicker" data-live-search="true" data-sourceurl="{% url 'api_secure' model='profile' %}?fields=first_name,last_name,initials" data-serialize="true">
{% if object.power_mic %}
<option value="{{object.power_mic.pk}}" selected="selected">{{ object.power_mic.name }}</option>
{% endif %}
</select> </select>
</th> </th>
</tr> </tr>
@@ -152,6 +183,18 @@
</div> </div>
</div> </div>
<div class="row my-3"> <div class="row my-3">
<div class="col-12">
<div class="card">
<div class="card-header">Event Size</div>
<div class="card-body" id="size-selector">
{% render_field form.medium_event style="display: none" %}
<button type="button" class="btn btn-success" data-event-size="0" style="width: 10rem;">Small</button>
<button type="button" class="btn btn-warning" data-event-size="1" style="width: 10rem;">Medium</button>
</div>
</div>
</div>
</div>
<div class="row my-3 form-hide" id="small-event">
<div class="col-12"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-header">Electrical Checks <small>for Small TEC Events <6kVA (aprox. 26A)</small></div> <div class="card-header">Electrical Checks <small>for Small TEC Events <6kVA (aprox. 26A)</small></div>
@@ -164,7 +207,7 @@
</div> </div>
</div> </div>
</div> </div>
<div class="row my-3"> <div class="row my-3 form-hide" id="medium-event">
<div class="col-12"> <div class="col-12">
<div class="card"> <div class="card">
<div class="card-header">Electrical Checks <small>for Medium TEC Events </small></div> <div class="card-header">Electrical Checks <small>for Medium TEC Events </small></div>

View File

@@ -0,0 +1,59 @@
{% extends 'base_rigs.html' %}
{% load paginator from filters %}
{% block title %}H&S Overview{% endblock %}
{% block content %}
<div class="table-responsive">
<table class="table mb-0">
<thead>
<tr>
<th scope="col">Event</th>
<th scope="col">Dates</th>
<th scope="col">RA</th>
<th scope="col">Checklist</th>
</tr>
</thead>
<tbody>
{% for event in object_list %}
<tr id="event_row">
<th scope="row" id="event_number">{{ event.pk }} | {{ event.name }}</th>
<!--Dates-->
<td id="event_dates">
<div><strong>{{ event.start_date|date:"D d/m/Y" }}</strong></div>
{% if event.end_date and event.end_date != event.start_date %}
<div><strong>{{ event.end_date|date:"D d/m/Y" }}</strong></div>
{% endif %}
</td>
<td>
{% if event.riskassessment %}
<a class="btn btn-primary" href="{% url 'ra_detail' event.riskassessment.pk %}">View</a>
{% if event.riskassessment.reviewed_by %}
Reviewed by <a href="{% url 'profile_detail' event.riskassessment.reviewed_by.pk %}">{{ event.riskassessment.reviewed_by }}</a> at {{ event.riskassessment.reviewed_at }}
{% else %}
<a class="btn btn-success my-2" href="{% url 'ra_review' event.riskassessment.pk %}">Mark Reviewed</a>
{% endif %}
{% else %}
<a href="{% url 'event_ra' event.pk %}" class="btn btn-success"><span class="fas fa-paperclip"></span> <span
class="hidden-xs">Create Risk Assessment</span></a>
{% endif %}
</td>
<td>
<a href="{% url 'event_ec' event.pk %}" class="btn btn-success"><span class="fas fa-paperclip"></span> <span
class="hidden-xs">Create Event Checklist</span></a>
</td>
</tr>
{% empty %}
<tr class="bg-warning text-dark">
<td colspan="6">No events found</td>
</tr>
{% endfor %}
</tbody>
</table>
{% if is_paginated %}
<div class="row justify-content-center">
{% paginator %}
</div>
{% endif %}
</div>
{% endblock %}

View File

@@ -91,6 +91,8 @@ urlpatterns = [
name='event_history', kwargs={'model': models.Event}), name='event_history', kwargs={'model': models.Event}),
# Event H&S # Event H&S
path('event/hs/', permission_required_with_403('RIGS.change_event')(hs.HSList.as_view()), name='hs_list'),
path('event/<int:pk>/ra/', permission_required_with_403('RIGS.change_event')(hs.EventRiskAssessmentCreate.as_view()), path('event/<int:pk>/ra/', permission_required_with_403('RIGS.change_event')(hs.EventRiskAssessmentCreate.as_view()),
name='event_ra'), name='event_ra'),
path('event/ra/<int:pk>/', permission_required_with_403('RIGS.change_event')(hs.EventRiskAssessmentDetail.as_view()), path('event/ra/<int:pk>/', permission_required_with_403('RIGS.change_event')(hs.EventRiskAssessmentDetail.as_view()),

View File

@@ -14,7 +14,7 @@ cssutils==1.0.2
diff-match-patch==20181111 diff-match-patch==20181111
dj-database-url==0.5.0 dj-database-url==0.5.0
dj-static==0.0.6 dj-static==0.0.6
Django==3.0.7 Django==3.1
django-debug-toolbar==2.2 django-debug-toolbar==2.2
django-filter==2.3.0 django-filter==2.3.0
django-gulp==4.1.0 django-gulp==4.1.0