diff --git a/RIGS/forms.py b/RIGS/forms.py index 3b40970e..5b5b835b 100644 --- a/RIGS/forms.py +++ b/RIGS/forms.py @@ -203,82 +203,6 @@ class EventChecklistForm(forms.ModelForm): 'power_mic': models.Profile, } - # Two possible formats - def parsedatetime(self, date_string): - try: - return timezone.make_aware(datetime.strptime(date_string, '%Y-%m-%dT%H:%M:%S')) - except ValueError: - return timezone.make_aware(datetime.strptime(date_string, '%Y-%m-%dT%H:%M')) - - # There's probably a thousand better ways to do this, but this one is mine - def clean(self): - vehicles = {key: val for key, val in self.data.items() - if key.startswith('vehicle')} - for key in vehicles: - pk = int(key.split('_')[1]) - driver_key = 'driver_' + str(pk) - if (self.data[driver_key] == ''): - raise forms.ValidationError('Add a driver to vehicle ' + str(pk), code='vehicle_mismatch') - else: - try: - item = models.EventChecklistVehicle.objects.get(pk=pk) - except models.EventChecklistVehicle.DoesNotExist: - item = models.EventChecklistVehicle() - - item.vehicle = vehicles['vehicle_' + str(pk)] - item.driver = models.Profile.objects.get(pk=self.data[driver_key]) - item.full_clean('checklist') - - # item does not have a database pk yet as it isn't saved - self.items['v' + str(pk)] = item - - crewmembers = {key: val for key, val in self.data.items() - if key.startswith('crewmember')} - other_fields = ['start', 'role', 'end'] - for key in crewmembers: - pk = int(key.split('_')[1]) - - for field in other_fields: - value = self.data[f'{field}_{pk}'] - if value == '': - raise forms.ValidationError(f'Add a {field} to crewmember {pk}', code=f'{field}_mismatch') - - try: - item = models.EventChecklistCrew.objects.get(pk=pk) - except models.EventChecklistCrew.DoesNotExist: - item = models.EventChecklistCrew() - - item.crewmember = models.Profile.objects.get(pk=self.data['crewmember_' + str(pk)]) - item.start = self.parsedatetime(self.data['start_' + str(pk)]) - item.role = self.data['role_' + str(pk)] - item.end = self.parsedatetime(self.data['end_' + str(pk)]) - item.full_clean('checklist') - - # item does not have a database pk yet as it isn't saved - self.items['c' + str(pk)] = item - - return super(EventChecklistForm, self).clean() - - def save(self, commit=True): - checklist = super(EventChecklistForm, self).save(commit=False) - if (commit): - # Remove all existing, to be recreated from the form - checklist.vehicles.all().delete() - checklist.crew.all().delete() - checklist.save() - - for key in self.items: - item = self.items[key] - reversion.add_to_revision(item) - # finish and save new database items - item.checklist = checklist - item.full_clean() - item.save() - - self.items.clear() - - return checklist - class Meta: model = models.EventChecklist fields = '__all__' @@ -303,6 +227,7 @@ class EventCheckInForm(forms.ModelForm): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.fields['time'].initial = timezone.now() + self.fields['role'].initial = "Crew" class Meta: model = models.EventCheckIn diff --git a/RIGS/migrations/0047_auto_20230508_1946.py b/RIGS/migrations/0047_auto_20230510_1823.py similarity index 64% rename from RIGS/migrations/0047_auto_20230508_1946.py rename to RIGS/migrations/0047_auto_20230510_1823.py index 555798be..1e3e6892 100644 --- a/RIGS/migrations/0047_auto_20230508_1946.py +++ b/RIGS/migrations/0047_auto_20230510_1823.py @@ -1,6 +1,8 @@ -# Generated by Django 3.2.16 on 2023-05-08 18:46 +# Generated by Django 3.2.16 on 2023-05-10 17:23 -from django.db import migrations +from django.conf import settings +from django.db import migrations, models +import django.db.models.deletion class Migration(migrations.Migration): @@ -10,6 +12,26 @@ class Migration(migrations.Migration): ] operations = [ + migrations.CreateModel( + name='EventCheckIn', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('time', models.DateTimeField()), + ('role', models.CharField(blank=True, max_length=50)), + ('vehicle', models.CharField(blank=True, max_length=100)), + ('end_time', models.DateTimeField(null=True)), + ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='crew', to='RIGS.event')), + ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkins', to=settings.AUTH_USER_MODEL)), + ], + ), + migrations.RemoveField( + model_name='eventchecklistvehicle', + name='checklist', + ), + migrations.RemoveField( + model_name='eventchecklistvehicle', + name='driver', + ), migrations.RemoveField( model_name='eventchecklist', name='all_rcds_tested', @@ -50,6 +72,10 @@ class Migration(migrations.Migration): model_name='eventchecklist', name='pat', ), + migrations.RemoveField( + model_name='eventchecklist', + name='power_mic', + ), migrations.RemoveField( model_name='eventchecklist', name='public_sockets_tested', @@ -114,4 +140,15 @@ class Migration(migrations.Migration): model_name='eventchecklist', name='w3_voltage', ), + migrations.AddField( + model_name='powertestrecord', + 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.DeleteModel( + name='EventChecklistCrew', + ), + migrations.DeleteModel( + name='EventChecklistVehicle', + ), ] diff --git a/RIGS/migrations/0048_auto_20230509_2043.py b/RIGS/migrations/0048_auto_20230509_2043.py deleted file mode 100644 index 85803772..00000000 --- a/RIGS/migrations/0048_auto_20230509_2043.py +++ /dev/null @@ -1,38 +0,0 @@ -# Generated by Django 3.2.18 on 2023-05-09 19:43 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('RIGS', '0047_auto_20230508_1946'), - ] - - operations = [ - migrations.RemoveField( - model_name='eventchecklistvehicle', - name='checklist', - ), - migrations.RemoveField( - model_name='eventchecklistvehicle', - name='driver', - ), - migrations.RemoveField( - model_name='eventchecklist', - name='power_mic', - ), - migrations.AddField( - model_name='powertestrecord', - 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.DeleteModel( - name='EventChecklistCrew', - ), - migrations.DeleteModel( - name='EventChecklistVehicle', - ), - ] diff --git a/RIGS/migrations/0049_eventcheckin_eventcheckout.py b/RIGS/migrations/0049_eventcheckin_eventcheckout.py deleted file mode 100644 index 4b65e10c..00000000 --- a/RIGS/migrations/0049_eventcheckin_eventcheckout.py +++ /dev/null @@ -1,35 +0,0 @@ -# Generated by Django 3.2.18 on 2023-05-09 20:12 - -from django.conf import settings -from django.db import migrations, models -import django.db.models.deletion - - -class Migration(migrations.Migration): - - dependencies = [ - ('RIGS', '0048_auto_20230509_2043'), - ] - - operations = [ - migrations.CreateModel( - name='EventCheckOut', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('time', models.DateTimeField()), - ('vehicle', models.CharField(max_length=100)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='RIGS.event')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkouts', to=settings.AUTH_USER_MODEL)), - ], - ), - migrations.CreateModel( - name='EventCheckIn', - fields=[ - ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), - ('time', models.DateTimeField()), - ('vehicle', models.CharField(max_length=100)), - ('event', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='crew', to='RIGS.event')), - ('person', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='checkins', to=settings.AUTH_USER_MODEL)), - ], - ), - ] diff --git a/RIGS/models.py b/RIGS/models.py index cf1f7303..dc746f17 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -81,6 +81,9 @@ class Profile(AbstractUser): def __str__(self): return self.name + def current_event(self): + return EventCheckIn.objects.filter(person=self).latest('time') or None + class ContactableManager(models.Manager): def search(self, query=None): @@ -815,7 +818,7 @@ class RiskAssessment(ReviewableModel, RevisionMixin): return f"{self.pk} | {self.event}" -@reversion.register(follow=['vehicles', 'crew']) +@reversion.register class EventChecklist(ReviewableModel, RevisionMixin): event = models.ForeignKey('Event', related_name='checklists', on_delete=models.CASCADE) @@ -897,6 +900,10 @@ class PowerTestRecord(ReviewableModel, RevisionMixin): def __str__(self): return f"{self.pk} - {self.event}" + @property + def activity_feed_string(self): + return str(self.event) + class Meta: ordering = ['event'] permissions = [ @@ -908,11 +915,12 @@ class EventCheckIn(models.Model): event = models.ForeignKey('Event', related_name='crew', on_delete=models.CASCADE) person = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='checkins', on_delete=models.CASCADE) time = models.DateTimeField() - vehicle = models.CharField(max_length=100) + role = models.CharField(max_length=50, blank=True) + vehicle = models.CharField(max_length=100, blank=True) + end_time = models.DateTimeField(null=True) + def active(self): + return end_time is not None -class EventCheckOut(models.Model): - event = models.ForeignKey('Event', on_delete=models.CASCADE) - person = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='checkouts', on_delete=models.CASCADE) - time = models.DateTimeField() # TODO Validate may not check in in future - vehicle = models.CharField(max_length=100) + def get_absolute_url(self): + return reverse('event_detail', kwargs={'pk': self.event.pk}) diff --git a/RIGS/templates/hs/event_checklist_detail.html b/RIGS/templates/hs/event_checklist_detail.html index b7403acd..6e4409c8 100644 --- a/RIGS/templates/hs/event_checklist_detail.html +++ b/RIGS/templates/hs/event_checklist_detail.html @@ -31,12 +31,6 @@ {% endif %} -

List vehicles and their drivers

- @@ -81,158 +75,30 @@ Crewmember + Vehicle Start Time Role End Time - {% for crew in object.crew.all %} + {% for crew in object.event.crew.all %} - {{crew.crewmember}} - {{crew.start}} + {{crew.person}} + {{crew.vehicle|default:"None"}} + {{crew.time}} {{crew.role}} - {{crew.end}} + {{crew.end_time}} {% empty %} - Apparently this event happened by magic... + Apparently this event happened by magic... {% endfor %} -
-
Power {% include 'partials/event_size.html' with object=object.event.riskassessment %}
-
- {% if object.event.riskassessment.event_size == 0 %} -
-
{{ object|help_text:'rcds'|safe }}
-
- {{ object.rcds|yesnoi }} -
-
{{ object|help_text:'supply_test'|safe }}
-
- {{ object.supply_test|yesnoi }} -
-
{{ object|help_text:'earthing'|safe }}
-
- {{ object.earthing|yesnoi }} -
-
{{ object|help_text:'pat'|safe }}
-
- {{ object.pat|yesnoi }} -
-
- {% else %} -
-
{{ object|help_text:'source_rcd'|safe }}
-
- {{ object.source_rcd|yesnoi }} -
-
{{ object|help_text:'labelling'|safe }}
-
- {{ object.labelling|yesnoi }} -
-
{{ object|help_text:'earthing'|safe }}
-
- {{ object.earthing|yesnoi }} -
-
{{ object|help_text:'pat'|safe }}
-
- {{ object.pat|yesnoi }} -
-
-
-

Tests at first distro

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TestValue
Voltage
(cube meter)
{{ object|help_text:'fd_voltage_l1' }}{{ object|help_text:'fd_voltage_l2' }}{{ object|help_text:'fd_voltage_l3' }}
{{ object.fd_voltage_l1 }}{{ object.fd_voltage_l2 }}{{ object.fd_voltage_l3 }}
{{ object|help_text:'fd_phase_rotation'|safe }}{{ object.fd_phase_rotation|yesnoi }}
{{ object|help_text:'fd_earth_fault'|safe}}{{ object.fd_earth_fault }}
{{ object|help_text:'fd_pssc'}}{{ object.fd_pssc }}
-
-

Tests at 'Worst Case' points (at least 1 point required)

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
TestPoint 1Point 2Point 3
{{ object|help_text:'w1_description'|safe}}{{ object.w1_description }}{{ object.w2_description|default:'' }}{{ object.w3_description|default:'' }}
{{ object|help_text:'w1_polarity'|safe}}{{ object.w1_polarity|yesnoi }}{{ object.w2_polarity|default:''|yesnoi }}{{ object.w3_polarity|default:''|yesnoi }}
{{ object|help_text:'w1_voltage'|safe}}{{ object.w1_voltage }}{{ object.w2_voltage|default:'' }}{{ object.w3_voltage|default:'' }}
{{ object|help_text:'w1_earth_fault'|safe}}{{ object.w1_earth_fault }}{{ object.w2_earth_fault|default:'' }}{{ object.w3_earth_fault|default:'' }}
-
-
-
{{ object|help_text:'all_rcds_tested'|safe }}
-
- {{ object.all_rcds_tested|yesnoi }} -
-
{{ object|help_text:'public_sockets_tested'|safe }}
-
- {{ object.public_sockets_tested|yesnoi }} -
-
-
- {% include 'partials/ec_power_info.html' %} - {% endif %} -
-
{% button 'edit' url='ec_edit' pk=object.pk %} {% button 'view' url='event_detail' pk=object.pk text="Event" %} diff --git a/RIGS/templates/hs/eventcheckin_form.html b/RIGS/templates/hs/eventcheckin_form.html index 7c0e5f71..a96e8320 100644 --- a/RIGS/templates/hs/eventcheckin_form.html +++ b/RIGS/templates/hs/eventcheckin_form.html @@ -1,30 +1,12 @@ {% extends request.is_ajax|yesno:'base_ajax.html,base_rigs.html' %} {% load widget_tweaks %} {% load static %} -{% load help_text from filters %} -{% load profile_by_index from filters %} {% load button from filters %} -{% block css %} - {{ block.super }} - -{% endblock %} - -{% block preload_js %} - {{ block.super }} - -{% endblock %} - -{% block js %} - {{ block.super }} - - -{% endblock %} - {% block content %}
{% include 'form_errors.html' %} -
+ + class="col-sm-4 col-form-label">Start Time
{% render_field form.time class+="form-control" %}
- -
+ +
+ + + +
+

Other (enter text)

+
+
+ {% render_field form.role class+="form-control" %} +
+
+
+ +
+ -
Other (enter text) +
+

Other (enter text)

+
{% render_field form.vehicle class+="form-control" %}
+ {% if not request.is_ajax %}
{% button 'submit' %}
+ {% endif %}
{% endblock %} + +{% block footer %} +
+ +
+{% endblock %} diff --git a/RIGS/templates/partials/event_detail_buttons.html b/RIGS/templates/partials/event_detail_buttons.html index f7218dd1..f52bd954 100644 --- a/RIGS/templates/partials/event_detail_buttons.html +++ b/RIGS/templates/partials/event_detail_buttons.html @@ -49,6 +49,6 @@ {% endif %} Subhire Insurance Form - Check In + Check In {% endif %} diff --git a/templates/base.html b/templates/base.html index 95075c83..6c40bf1e 100644 --- a/templates/base.html +++ b/templates/base.html @@ -30,6 +30,9 @@ {% block navbar %} +{% if request.user.current_event %} +
You are currently checked in to {{request.user.current_event.event}}Check Out
+{% endif %}