From 80837c3d9a41c5dee9f3f5cacd50827078724c0a Mon Sep 17 00:00:00 2001 From: Arona Jones Date: Sun, 27 Dec 2020 17:49:53 +0000 Subject: [PATCH] Fixing tests for new logic etc --- PyRIGS/urls.py | 1 - RIGS/hs.py | 1 + RIGS/ical.py | 2 +- RIGS/migrations/0048_auto_20201227_1749.py | 24 ++++++++ RIGS/models.py | 23 ++++---- RIGS/templates/risk_assessment_form.html | 18 ++++-- RIGS/templatetags/filters.py | 10 ++-- RIGS/tests/pages.py | 8 +-- RIGS/tests/test_interaction.py | 66 ++++++++++++++-------- RIGS/tests/test_unit.py | 1 - 10 files changed, 104 insertions(+), 50 deletions(-) create mode 100644 RIGS/migrations/0048_auto_20201227_1749.py diff --git a/PyRIGS/urls.py b/PyRIGS/urls.py index 525480b3..b2369f9c 100644 --- a/PyRIGS/urls.py +++ b/PyRIGS/urls.py @@ -7,7 +7,6 @@ from django.conf import settings from django.views.decorators.clickjacking import xframe_options_exempt from django.contrib.auth.views import LoginView from django.views.generic import TemplateView -from registration.backends.default.views import RegistrationView from PyRIGS.decorators import permission_required_with_403 import RIGS import users diff --git a/RIGS/hs.py b/RIGS/hs.py index 0f94a40e..9f04150d 100644 --- a/RIGS/hs.py +++ b/RIGS/hs.py @@ -7,6 +7,7 @@ from reversion import revisions as reversion from django.db.models import AutoField, ManyToOneRel from django.contrib import messages + class EventRiskAssessmentCreate(generic.CreateView): model = models.RiskAssessment template_name = 'risk_assessment_form.html' diff --git a/RIGS/ical.py b/RIGS/ical.py index bd3dfcba..3940390b 100644 --- a/RIGS/ical.py +++ b/RIGS/ical.py @@ -102,7 +102,7 @@ class CalendarICS(ICalFeed): return item.earliest_time 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 diff --git a/RIGS/migrations/0048_auto_20201227_1749.py b/RIGS/migrations/0048_auto_20201227_1749.py new file mode 100644 index 00000000..60703743 --- /dev/null +++ b/RIGS/migrations/0048_auto_20201227_1749.py @@ -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 must 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'), + ), + ] diff --git a/RIGS/models.py b/RIGS/models.py index 6206fdb2..7d7427e6 100644 --- a/RIGS/models.py +++ b/RIGS/models.py @@ -616,7 +616,7 @@ def validate_url(value): if not value: return # Required error is done the field 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') @@ -638,12 +638,12 @@ 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?") # 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?") # 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, verbose_name="Power MIC", on_delete=models.CASCADE, help_text="Who is the Power MIC? (if yes to the above question, this person must be a Power Technician or Power Supervisor)") - outside = models.BooleanField(help_text="Is the event outdoors?") + outside = models.BooleanField(help_text="Is the event outdoors?") generators = models.BooleanField(help_text="Will generators be used?") other_companies_power = models.BooleanField(help_text="Will TEC be supplying power to any other companies?") nonstandard_equipment_power = models.BooleanField(help_text="Does the power plan require the use of any power equipment (distros, dimmers, motor controllers, etc.) that does not belong to TEC?") @@ -704,13 +704,6 @@ class RiskAssessment(models.Model, RevisionMixin): # Check for idiots if not self.outside and self.generators: raise forms.ValidationError("Engage brain, please. No generators indoors!(!)") - # 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: ordering = ['event'] @@ -718,6 +711,16 @@ class RiskAssessment(models.Model, RevisionMixin): ('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 def activity_feed_string(self): return str(self.event) diff --git a/RIGS/templates/risk_assessment_form.html b/RIGS/templates/risk_assessment_form.html index 0d723404..e2936cdd 100644 --- a/RIGS/templates/risk_assessment_form.html +++ b/RIGS/templates/risk_assessment_form.html @@ -41,6 +41,14 @@ $('#{{ form.power_notes.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)); + }); {% endblock %} @@ -110,7 +118,7 @@ {% endif %} -

If the answer is yes to any of the below questions this is a Large Event and you must consult a power supervisor

+

If the answer is yes to ANY of the below questions this is a Large Event and you must consult a power supervisor

{% 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.other_companies_power %} @@ -159,11 +167,11 @@
Structures
{% include 'partials/yes_no_radio.html' with formitem=form.special_structures %} + + {% render_field form.persons_responsible_structures class+="form-control mb-3" hidden="true" %} {% include 'partials/yes_no_radio.html' with formitem=form.suspended_structures %} - - {% render_field form.persons_responsible_structures class+="form-control mb-3" %} - - {% render_field form.rigging_plan class+="form-control" %} + + {% render_field form.rigging_plan class+="form-control" hidden="true" %}
diff --git a/RIGS/templatetags/filters.py b/RIGS/templatetags/filters.py index e4f7d1e9..ba004024 100644 --- a/RIGS/templatetags/filters.py +++ b/RIGS/templatetags/filters.py @@ -179,11 +179,13 @@ def namewithnotes(obj, url, autoescape=True): @register.filter(needs_autoescape=True) -def linkornone(attr, namespace=None, autoescape=True): - if attr is not None: +def linkornone(target, namespace=None, autoescape=True): + if target is not None: if namespace is not None: - attr = namespace + "://" + attr - return mark_safe("{}".format(attr, str(attr))) + link = namespace + "://" + target + else: + link = target + return mark_safe("{}".format(link, str(target))) else: return "None" diff --git a/RIGS/tests/pages.py b/RIGS/tests/pages.py index 89693ae2..4fa8534e 100644 --- a/RIGS/tests/pages.py +++ b/RIGS/tests/pages.py @@ -190,6 +190,7 @@ class CreateRiskAssessment(FormPage): 'crew_fatigue': (regions.RadioSelect, (By.ID, 'id_crew_fatigue')), 'general_notes': (regions.TextBox, (By.ID, 'id_general_notes')), 'big_power': (regions.RadioSelect, (By.ID, 'id_big_power')), + 'outside': (regions.RadioSelect, (By.ID, 'id_outside')), 'generators': (regions.RadioSelect, (By.ID, 'id_generators')), 'other_companies_power': (regions.RadioSelect, (By.ID, 'id_other_companies_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')), 'suspended_structures': (regions.RadioSelect, (By.ID, 'id_suspended_structures')), '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 @@ -248,8 +249,6 @@ class CreateEventChecklist(FormPage): 'supply_test': (regions.CheckBox, (By.ID, 'id_supply_test')), 'earthing': (regions.CheckBox, (By.ID, 'id_earthing')), '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')), 'labelling': (regions.CheckBox, (By.ID, 'id_labelling')), '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')), } - def select_size(self, size): - self.find_element(By.XPATH, '//button[.="{}"]'.format(size)).click() - def add_vehicle(self): self.find_element(*self._add_vehicle_locator).click() diff --git a/RIGS/tests/test_interaction.py b/RIGS/tests/test_interaction.py index b97fb4f9..71574203 100644 --- a/RIGS/tests/test_interaction.py +++ b/RIGS/tests/test_interaction.py @@ -669,7 +669,14 @@ class TestHealthAndSafety(BaseRigboardTest): start_date=date.today() + timedelta(days=6), description="start future no end", 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, nonstandard_use=False, contractors=False, @@ -690,6 +697,26 @@ class TestHealthAndSafety(BaseRigboardTest): special_structures=False, suspended_structures=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() # 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.nonstandard_emergency_procedure = 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 + # TODO Test for this proper + self.page.rigging_plan = "https://nottinghamtec.sharepoint.com/test/" self.page.submit() self.assertFalse(self.page.success) @@ -757,7 +786,7 @@ class TestHealthAndSafety(BaseRigboardTest): self.assertEqual(ra.nonstandard_equipment, nse) 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_packing = True @@ -772,10 +801,9 @@ class TestHealthAndSafety(BaseRigboardTest): self.page.power_mic.toggle() self.assertFalse(self.page.power_mic.is_open) - 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()) + # Gotta scroll to make the button clickable + self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") + self.page.earthing = True self.page.rcds = True self.page.supply_test = True @@ -785,7 +813,7 @@ class TestHealthAndSafety(BaseRigboardTest): self.assertTrue(self.page.success) 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_packing = True @@ -800,12 +828,11 @@ class TestHealthAndSafety(BaseRigboardTest): self.page.power_mic.toggle() self.assertFalse(self.page.power_mic.is_open) - self.page.select_size('Medium') - self.wait.until(animation_is_finished()) - 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_m = True - self.page.pat_m = True + # Gotta scroll to make the button clickable + self.driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") + + self.page.earthing = True + self.page.pat = True self.page.source_rcd = True self.page.labelling = True self.page.fd_voltage_l1 = 240 @@ -819,13 +846,12 @@ class TestHealthAndSafety(BaseRigboardTest): self.page.w1_voltage = 240 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.assertTrue(self.page.success) 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_crew() @@ -859,10 +885,6 @@ class TestHealthAndSafety(BaseRigboardTest): crew_select.search(crew.name) 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.rcds = True self.page.supply_test = True @@ -871,7 +893,7 @@ class TestHealthAndSafety(BaseRigboardTest): self.page.submit() 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) self.assertEqual(vehicle_name, vehicle.vehicle) crew_obj = models.EventChecklistCrew.objects.get(checklist=checklist.pk) diff --git a/RIGS/tests/test_unit.py b/RIGS/tests/test_unit.py index 911e7f1a..c0244d11 100644 --- a/RIGS/tests/test_unit.py +++ b/RIGS/tests/test_unit.py @@ -512,7 +512,6 @@ class TestHSLogic(TestCase): extinguishers_location="Somewhere, I forgot", earthing=False, pat=False, - event_size=0, date=timezone.now(), venue=cls.venue), }