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
-Tests at first distro
-| Test | -Value | -||
|---|---|---|---|
| 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)
-| Test | -Point 1 | -Point 2 | -Point 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:'' }} | -
Other (enter text)
+Other (enter text)
+