Fixing tests for new logic etc

This commit is contained in:
2020-12-27 17:49:53 +00:00
parent c027182962
commit 80837c3d9a
10 changed files with 104 additions and 50 deletions

View File

@@ -7,7 +7,6 @@ from django.conf import settings
from django.views.decorators.clickjacking import xframe_options_exempt from django.views.decorators.clickjacking import xframe_options_exempt
from django.contrib.auth.views import LoginView from django.contrib.auth.views import LoginView
from django.views.generic import TemplateView from django.views.generic import TemplateView
from registration.backends.default.views import RegistrationView
from PyRIGS.decorators import permission_required_with_403 from PyRIGS.decorators import permission_required_with_403
import RIGS import RIGS
import users import users

View File

@@ -7,6 +7,7 @@ from reversion import revisions as reversion
from django.db.models import AutoField, ManyToOneRel from django.db.models import AutoField, ManyToOneRel
from django.contrib import messages from django.contrib import messages
class EventRiskAssessmentCreate(generic.CreateView): class EventRiskAssessmentCreate(generic.CreateView):
model = models.RiskAssessment model = models.RiskAssessment
template_name = 'risk_assessment_form.html' template_name = 'risk_assessment_form.html'

View File

@@ -102,7 +102,7 @@ class CalendarICS(ICalFeed):
return item.earliest_time return item.earliest_time
def item_end_datetime(self, item): def item_end_datetime(self, item):
if type(item.latest_time) == datetime.date: # Ical end_datetime is non-inclusive, so add a day if isinstance(item.latest_time, datetime.date): # Ical end_datetime is non-inclusive, so add a day
return item.latest_time + datetime.timedelta(days=1) return item.latest_time + datetime.timedelta(days=1)
return item.latest_time return item.latest_time

View File

@@ -0,0 +1,24 @@
# Generated by Django 3.1.2 on 2020-12-27 17:49
from django.conf import settings
from django.db import migrations, models
import django.db.models.deletion
class Migration(migrations.Migration):
dependencies = [
('RIGS', '0047_auto_20201213_1642'),
]
operations = [
migrations.RemoveField(
model_name='riskassessment',
name='event_size',
),
migrations.AlterField(
model_name='riskassessment',
name='power_mic',
field=models.ForeignKey(blank=True, help_text='Who is the Power MIC? (if yes to the above question, this person <em>must</em> be a Power Technician or Power Supervisor)', null=True, on_delete=django.db.models.deletion.CASCADE, related_name='power_mic', to=settings.AUTH_USER_MODEL, verbose_name='Power MIC'),
),
]

View File

@@ -616,7 +616,7 @@ def validate_url(value):
if not value: if not value:
return # Required error is done the field return # Required error is done the field
obj = urlparse(value) obj = urlparse(value)
if not obj.hostname in ('nottinghamtec.sharepoint.com'): if obj.hostname not in ('nottinghamtec.sharepoint.com'):
raise ValidationError('URL must point to a location on the TEC Sharepoint') raise ValidationError('URL must point to a location on the TEC Sharepoint')
@@ -638,7 +638,7 @@ class RiskAssessment(models.Model, RevisionMixin):
general_notes = models.TextField(blank=True, null=True, help_text="Did you have to consult a supervisor about any of the above? If so who did you consult and what was the outcome?") general_notes = models.TextField(blank=True, null=True, help_text="Did you have to consult a supervisor about any of the above? If so who did you consult and what was the outcome?")
# Power # Power
event_size = models.IntegerField(blank=True, null=True, choices=SIZES) # event_size = models.IntegerField(blank=True, null=True, choices=SIZES)
big_power = models.BooleanField(help_text="Does the event require larger power supplies than 13A or 16A single phase wall sockets, or draw more than 20A total current?") big_power = models.BooleanField(help_text="Does the event require larger power supplies than 13A or 16A single phase wall sockets, or draw more than 20A total current?")
# If yes to the above two, you must answer... # If yes to the above two, you must answer...
power_mic = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='power_mic', blank=True, null=True, power_mic = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='power_mic', blank=True, null=True,
@@ -704,13 +704,6 @@ class RiskAssessment(models.Model, RevisionMixin):
# Check for idiots # Check for idiots
if not self.outside and self.generators: if not self.outside and self.generators:
raise forms.ValidationError("Engage brain, please. <strong>No generators indoors!(!)</strong>") raise forms.ValidationError("Engage brain, please. <strong>No generators indoors!(!)</strong>")
# Confirm event size. Check all except generators, since generators entails outside
if self.outside or self.other_companies_power or self.nonstandard_equipment_power or self.multiple_electrical_environments:
self.event_size = self.LARGE[0]
elif self.big_power:
self.event_size = self.MEDIUM[0]
else:
self.event_size = self.SMALL[0]
class Meta: class Meta:
ordering = ['event'] ordering = ['event']
@@ -718,6 +711,16 @@ class RiskAssessment(models.Model, RevisionMixin):
('review_riskassessment', 'Can review Risk Assessments') ('review_riskassessment', 'Can review Risk Assessments')
] ]
@property
def event_size(self):
# Confirm event size. Check all except generators, since generators entails outside
if self.outside or self.other_companies_power or self.nonstandard_equipment_power or self.multiple_electrical_environments:
return self.LARGE[0]
elif self.big_power:
return self.MEDIUM[0]
else:
return self.SMALL[0]
@property @property
def activity_feed_string(self): def activity_feed_string(self):
return str(self.event) return str(self.event)

View File

@@ -41,6 +41,14 @@
$('#{{ form.power_notes.id_for_label }}').prop('required', parseBool(this.value)); $('#{{ form.power_notes.id_for_label }}').prop('required', parseBool(this.value));
$('#{{ form.power_plan.id_for_label }}').prop('required', parseBool(this.value)); $('#{{ form.power_plan.id_for_label }}').prop('required', parseBool(this.value));
}); });
$('input[type=radio][name=special_structures]').change(function() {
$('#{{ form.persons_responsible_structures.id_for_label }}').prop('hidden', !parseBool(this.value)).prop('required', parseBool(this.value));
$('label[for={{ form.persons_responsible_structures.id_for_label }}]').prop('hidden', !parseBool(this.value));
});
$('input[type=radio][name=suspended_structures]').change(function() {
$('#{{ form.rigging_plan.id_for_label }}').prop('hidden', !parseBool(this.value)).prop('required', parseBool(this.value));
$('label[for={{ form.rigging_plan.id_for_label }}]').prop('hidden', !parseBool(this.value));
});
</script> </script>
{% endblock %} {% endblock %}
@@ -110,7 +118,7 @@
{% endif %} {% endif %}
</select> </select>
</div> </div>
<p class="pt-4"><strong>If the answer is yes to any of the below questions this is a Large Event and you <em>must</em> consult a power supervisor</strong></p> <p class="pt-4"><strong>If the answer is yes to ANY of the below questions this is a Large Event and you <em>must</em> consult a power supervisor</strong></p>
{% include 'partials/yes_no_radio.html' with formitem=form.outside %} {% include 'partials/yes_no_radio.html' with formitem=form.outside %}
{% include 'partials/yes_no_radio.html' with formitem=form.generators label="Will generators be used?" %} {% include 'partials/yes_no_radio.html' with formitem=form.generators label="Will generators be used?" %}
{% include 'partials/yes_no_radio.html' with formitem=form.other_companies_power %} {% include 'partials/yes_no_radio.html' with formitem=form.other_companies_power %}
@@ -159,11 +167,11 @@
<div class="card-header">Structures</div> <div class="card-header">Structures</div>
<div class="card-body"> <div class="card-body">
{% include 'partials/yes_no_radio.html' with formitem=form.special_structures %} {% include 'partials/yes_no_radio.html' with formitem=form.special_structures %}
<label for="{{ form.persons_responsible_structures.id_for_label }}" class="mt-3" hidden="true">{{ form.persons_responsible_structures.help_text }}</label>
{% render_field form.persons_responsible_structures class+="form-control mb-3" hidden="true" %}
{% include 'partials/yes_no_radio.html' with formitem=form.suspended_structures %} {% include 'partials/yes_no_radio.html' with formitem=form.suspended_structures %}
<label for="{{ form.persons_responsible_structures.id_for_label }}" class="mt-3">{{ form.persons_responsible_structures.help_text }}</label> <label for="{{ form.rigging_plan.id_for_label }}" class="mt-2" hidden="true">{{ form.rigging_plan.help_text|safe }}</label>
{% render_field form.persons_responsible_structures class+="form-control mb-3" %} {% render_field form.rigging_plan class+="form-control" hidden="true" %}
<label for="{{ form.rigging_plan.id_for_label }}" class="mt-2">{{ form.rigging_plan.help_text|safe }}</label>
{% render_field form.rigging_plan class+="form-control" %}
</div> </div>
</div> </div>
</div> </div>

View File

@@ -179,11 +179,13 @@ def namewithnotes(obj, url, autoescape=True):
@register.filter(needs_autoescape=True) @register.filter(needs_autoescape=True)
def linkornone(attr, namespace=None, autoescape=True): def linkornone(target, namespace=None, autoescape=True):
if attr is not None: if target is not None:
if namespace is not None: if namespace is not None:
attr = namespace + "://" + attr link = namespace + "://" + target
return mark_safe("<a href='{}' target='_blank'><span class='overflow-ellipsis'>{}</span></a>".format(attr, str(attr))) else:
link = target
return mark_safe("<a href='{}' target='_blank'><span class='overflow-ellipsis'>{}</span></a>".format(link, str(target)))
else: else:
return "None" return "None"

View File

@@ -190,6 +190,7 @@ class CreateRiskAssessment(FormPage):
'crew_fatigue': (regions.RadioSelect, (By.ID, 'id_crew_fatigue')), 'crew_fatigue': (regions.RadioSelect, (By.ID, 'id_crew_fatigue')),
'general_notes': (regions.TextBox, (By.ID, 'id_general_notes')), 'general_notes': (regions.TextBox, (By.ID, 'id_general_notes')),
'big_power': (regions.RadioSelect, (By.ID, 'id_big_power')), 'big_power': (regions.RadioSelect, (By.ID, 'id_big_power')),
'outside': (regions.RadioSelect, (By.ID, 'id_outside')),
'generators': (regions.RadioSelect, (By.ID, 'id_generators')), 'generators': (regions.RadioSelect, (By.ID, 'id_generators')),
'other_companies_power': (regions.RadioSelect, (By.ID, 'id_other_companies_power')), 'other_companies_power': (regions.RadioSelect, (By.ID, 'id_other_companies_power')),
'nonstandard_equipment_power': (regions.RadioSelect, (By.ID, 'id_nonstandard_equipment_power')), 'nonstandard_equipment_power': (regions.RadioSelect, (By.ID, 'id_nonstandard_equipment_power')),
@@ -207,7 +208,7 @@ class CreateRiskAssessment(FormPage):
'persons_responsible_structures': (regions.TextBox, (By.ID, 'id_persons_responsible_structures')), 'persons_responsible_structures': (regions.TextBox, (By.ID, 'id_persons_responsible_structures')),
'suspended_structures': (regions.RadioSelect, (By.ID, 'id_suspended_structures')), 'suspended_structures': (regions.RadioSelect, (By.ID, 'id_suspended_structures')),
'supervisor_consulted': (regions.CheckBox, (By.ID, 'id_supervisor_consulted')), 'supervisor_consulted': (regions.CheckBox, (By.ID, 'id_supervisor_consulted')),
'outside': (regions.CheckBox, (By.ID, 'id_outside')), 'rigging_plan': (regions.TextBox, (By.ID, 'id_rigging_plan')),
} }
@property @property
@@ -248,8 +249,6 @@ class CreateEventChecklist(FormPage):
'supply_test': (regions.CheckBox, (By.ID, 'id_supply_test')), 'supply_test': (regions.CheckBox, (By.ID, 'id_supply_test')),
'earthing': (regions.CheckBox, (By.ID, 'id_earthing')), 'earthing': (regions.CheckBox, (By.ID, 'id_earthing')),
'pat': (regions.CheckBox, (By.ID, 'id_pat')), 'pat': (regions.CheckBox, (By.ID, 'id_pat')),
'earthing_m': (regions.CheckBox, (By.XPATH, '(//*[@id="id_earthing"])[2]')),
'pat_m': (regions.CheckBox, (By.XPATH, '(//*[@id="id_pat"])[2]')),
'source_rcd': (regions.CheckBox, (By.ID, 'id_source_rcd')), 'source_rcd': (regions.CheckBox, (By.ID, 'id_source_rcd')),
'labelling': (regions.CheckBox, (By.ID, 'id_labelling')), 'labelling': (regions.CheckBox, (By.ID, 'id_labelling')),
'fd_voltage_l1': (regions.TextBox, (By.ID, 'id_fd_voltage_l1')), 'fd_voltage_l1': (regions.TextBox, (By.ID, 'id_fd_voltage_l1')),
@@ -264,9 +263,6 @@ class CreateEventChecklist(FormPage):
'w1_earth_fault': (regions.TextBox, (By.ID, 'id_w1_earth_fault')), 'w1_earth_fault': (regions.TextBox, (By.ID, 'id_w1_earth_fault')),
} }
def select_size(self, size):
self.find_element(By.XPATH, '//button[.="{}"]'.format(size)).click()
def add_vehicle(self): def add_vehicle(self):
self.find_element(*self._add_vehicle_locator).click() self.find_element(*self._add_vehicle_locator).click()

View File

@@ -669,7 +669,14 @@ class TestHealthAndSafety(BaseRigboardTest):
start_date=date.today() + timedelta(days=6), start_date=date.today() + timedelta(days=6),
description="start future no end", description="start future no end",
purchase_order='TESTPO', purchase_order='TESTPO',
person=self.client) person=self.client,
venue=self.venue)
self.testEvent3 = models.Event.objects.create(name="TE E3", status=models.Event.PROVISIONAL,
start_date=date.today() + timedelta(days=6),
description="start future no end",
purchase_order='TESTPO',
person=self.client,
venue=self.venue)
self.testRA = models.RiskAssessment.objects.create(event=self.testEvent2, supervisor_consulted=False, nonstandard_equipment=False, self.testRA = models.RiskAssessment.objects.create(event=self.testEvent2, supervisor_consulted=False, nonstandard_equipment=False,
nonstandard_use=False, nonstandard_use=False,
contractors=False, contractors=False,
@@ -690,6 +697,26 @@ class TestHealthAndSafety(BaseRigboardTest):
special_structures=False, special_structures=False,
suspended_structures=False, suspended_structures=False,
outside=False) outside=False)
self.testRA2 = models.RiskAssessment.objects.create(event=self.testEvent3, supervisor_consulted=False, nonstandard_equipment=False,
nonstandard_use=False,
contractors=False,
other_companies=False,
crew_fatigue=False,
big_power=True,
generators=False,
other_companies_power=False,
nonstandard_equipment_power=False,
multiple_electrical_environments=False,
noise_monitoring=False,
known_venue=True,
safe_loading=True,
safe_storage=True,
area_outside_of_control=False,
barrier_required=False,
nonstandard_emergency_procedure=False,
special_structures=False,
suspended_structures=False,
outside=False)
self.page = pages.EventDetail(self.driver, self.live_server_url, event_id=self.testEvent.pk).open() self.page = pages.EventDetail(self.driver, self.live_server_url, event_id=self.testEvent.pk).open()
# TODO Can I loop through all the boolean fields and test them at once? # TODO Can I loop through all the boolean fields and test them at once?
@@ -728,9 +755,11 @@ class TestHealthAndSafety(BaseRigboardTest):
self.page.barrier_required = False self.page.barrier_required = False
self.page.nonstandard_emergency_procedure = False self.page.nonstandard_emergency_procedure = False
self.page.special_structures = False self.page.special_structures = False
self.page.persons_responsible_structures = "Nobody and her cat, She" # self.page.persons_responsible_structures = "Nobody and her cat, She"
self.page.suspended_structures = True self.page.suspended_structures = True
# TODO Test for this proper
self.page.rigging_plan = "https://nottinghamtec.sharepoint.com/test/"
self.page.submit() self.page.submit()
self.assertFalse(self.page.success) self.assertFalse(self.page.success)
@@ -757,7 +786,7 @@ class TestHealthAndSafety(BaseRigboardTest):
self.assertEqual(ra.nonstandard_equipment, nse) self.assertEqual(ra.nonstandard_equipment, nse)
def test_ec_create_small(self): def test_ec_create_small(self):
self.page = pages.CreateEventChecklist(self.driver, self.live_server_url, event_id=self.testEvent.pk).open() self.page = pages.CreateEventChecklist(self.driver, self.live_server_url, event_id=self.testEvent2.pk).open()
self.page.safe_parking = True self.page.safe_parking = True
self.page.safe_packing = True self.page.safe_packing = True
@@ -772,10 +801,9 @@ class TestHealthAndSafety(BaseRigboardTest):
self.page.power_mic.toggle() self.page.power_mic.toggle()
self.assertFalse(self.page.power_mic.is_open) self.assertFalse(self.page.power_mic.is_open)
self.page.select_size('Small') # Gotta scroll to make the button clickable
self.wait.until(animation_is_finished()) self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
self.assertFalse(self.driver.find_element(By.XPATH, '(//*[@id="id_earthing"])[2]').is_displayed())
self.assertTrue(self.driver.find_element(By.XPATH, '(//*[@id="id_earthing"])[1]').is_displayed())
self.page.earthing = True self.page.earthing = True
self.page.rcds = True self.page.rcds = True
self.page.supply_test = True self.page.supply_test = True
@@ -785,7 +813,7 @@ class TestHealthAndSafety(BaseRigboardTest):
self.assertTrue(self.page.success) self.assertTrue(self.page.success)
def test_ec_create_medium(self): def test_ec_create_medium(self):
self.page = pages.CreateEventChecklist(self.driver, self.live_server_url, event_id=self.testEvent.pk).open() self.page = pages.CreateEventChecklist(self.driver, self.live_server_url, event_id=self.testEvent3.pk).open()
self.page.safe_parking = True self.page.safe_parking = True
self.page.safe_packing = True self.page.safe_packing = True
@@ -800,12 +828,11 @@ class TestHealthAndSafety(BaseRigboardTest):
self.page.power_mic.toggle() self.page.power_mic.toggle()
self.assertFalse(self.page.power_mic.is_open) self.assertFalse(self.page.power_mic.is_open)
self.page.select_size('Medium') # Gotta scroll to make the button clickable
self.wait.until(animation_is_finished()) self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
self.assertFalse(self.driver.find_element(By.XPATH, '(//*[@id="id_earthing"])[1]').is_displayed())
self.assertTrue(self.driver.find_element(By.XPATH, '(//*[@id="id_earthing"])[2]').is_displayed()) self.page.earthing = True
self.page.earthing_m = True self.page.pat = True
self.page.pat_m = True
self.page.source_rcd = True self.page.source_rcd = True
self.page.labelling = True self.page.labelling = True
self.page.fd_voltage_l1 = 240 self.page.fd_voltage_l1 = 240
@@ -819,13 +846,12 @@ class TestHealthAndSafety(BaseRigboardTest):
self.page.w1_voltage = 240 self.page.w1_voltage = 240
self.page.w1_earth_fault = 333 self.page.w1_earth_fault = 333
# Gotta scroll to make the button clickable
self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")
self.page.submit() self.page.submit()
self.assertTrue(self.page.success) self.assertTrue(self.page.success)
def test_ec_create_extras(self): def test_ec_create_extras(self):
self.page = pages.CreateEventChecklist(self.driver, self.live_server_url, event_id=self.testEvent.pk).open() eid = self.testEvent2.pk
self.page = pages.CreateEventChecklist(self.driver, self.live_server_url, event_id=eid).open()
self.page.add_vehicle() self.page.add_vehicle()
self.page.add_crew() self.page.add_crew()
@@ -859,10 +885,6 @@ class TestHealthAndSafety(BaseRigboardTest):
crew_select.search(crew.name) crew_select.search(crew.name)
self.driver.find_element(By.XPATH, '//*[@name="role_-1"]').send_keys(role) self.driver.find_element(By.XPATH, '//*[@name="role_-1"]').send_keys(role)
self.page.select_size('Small')
self.wait.until(animation_is_finished())
self.assertFalse(self.driver.find_element(By.XPATH, '(//*[@id="id_earthing"])[2]').is_displayed())
self.assertTrue(self.driver.find_element(By.XPATH, '(//*[@id="id_earthing"])[1]').is_displayed())
self.page.earthing = True self.page.earthing = True
self.page.rcds = True self.page.rcds = True
self.page.supply_test = True self.page.supply_test = True
@@ -871,7 +893,7 @@ class TestHealthAndSafety(BaseRigboardTest):
self.page.submit() self.page.submit()
self.assertTrue(self.page.success) self.assertTrue(self.page.success)
checklist = models.EventChecklist.objects.get(event=self.testEvent.pk) checklist = models.EventChecklist.objects.get(event=eid)
vehicle = models.EventChecklistVehicle.objects.get(checklist=checklist.pk) vehicle = models.EventChecklistVehicle.objects.get(checklist=checklist.pk)
self.assertEqual(vehicle_name, vehicle.vehicle) self.assertEqual(vehicle_name, vehicle.vehicle)
crew_obj = models.EventChecklistCrew.objects.get(checklist=checklist.pk) crew_obj = models.EventChecklistCrew.objects.get(checklist=checklist.pk)

View File

@@ -512,7 +512,6 @@ class TestHSLogic(TestCase):
extinguishers_location="Somewhere, I forgot", extinguishers_location="Somewhere, I forgot",
earthing=False, earthing=False,
pat=False, pat=False,
event_size=0,
date=timezone.now(), date=timezone.now(),
venue=cls.venue), venue=cls.venue),
} }