mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-02-28 00:58:23 +00:00
Much better coverage of H&S things
This commit is contained in:
@@ -176,7 +176,7 @@ class EventChecklistList(generic.ListView):
|
|||||||
class EventChecklistReview(generic.View):
|
class EventChecklistReview(generic.View):
|
||||||
def get(self, *args, **kwargs):
|
def get(self, *args, **kwargs):
|
||||||
rpk = kwargs.get('pk')
|
rpk = kwargs.get('pk')
|
||||||
ec = models.RiskAssessment.objects.get(pk=rpk)
|
ec = models.EventChecklist.objects.get(pk=rpk)
|
||||||
with reversion.create_revision():
|
with reversion.create_revision():
|
||||||
reversion.set_user(self.request.user)
|
reversion.set_user(self.request.user)
|
||||||
ec.reviewed_by = self.request.user
|
ec.reviewed_by = self.request.user
|
||||||
|
|||||||
@@ -640,14 +640,14 @@ class RiskAssessment(models.Model, RevisionMixin):
|
|||||||
('review_riskassessment', 'Can review Risk Assessments')
|
('review_riskassessment', 'Can review Risk Assessments')
|
||||||
]
|
]
|
||||||
|
|
||||||
def clean(self):
|
"""def clean(self):
|
||||||
errdict = {}
|
errdict = {}
|
||||||
for field in RiskAssessment._meta.fields:
|
for field in RiskAssessment._meta.fields:
|
||||||
if field.__class__ == forms.BooleanField and self.field is None:
|
if field.__class__ == forms.BooleanField and self.field is None:
|
||||||
errdict[field.name] = ["This field is required"]
|
errdict[field.name] = ["This field is required"]
|
||||||
|
|
||||||
if errdict != {}: # If there was an error when validation
|
if errdict != {}: # If there was an error when validation
|
||||||
raise ValidationError(errdict)
|
raise ValidationError(errdict)"""
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def activity_feed_string(self):
|
def activity_feed_string(self):
|
||||||
|
|||||||
@@ -250,11 +250,31 @@ 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')),
|
||||||
|
'labelling': (regions.CheckBox, (By.ID, 'id_labelling')),
|
||||||
|
'fd_voltage_l1': (regions.TextBox, (By.ID, 'id_fd_voltage_l1')),
|
||||||
|
'fd_voltage_l2': (regions.TextBox, (By.ID, 'id_fd_voltage_l2')),
|
||||||
|
'fd_voltage_l3': (regions.TextBox, (By.ID, 'id_fd_voltage_l3')),
|
||||||
|
'fd_phase_rotation': (regions.CheckBox, (By.ID, 'id_fd_phase_rotation')),
|
||||||
|
'fd_earth_fault': (regions.TextBox, (By.ID, 'id_fd_earth_fault')),
|
||||||
|
'fd_pssc': (regions.TextBox, (By.ID, 'id_fd_pssc')),
|
||||||
|
'w1_description': (regions.TextBox, (By.ID, 'id_w1_description')),
|
||||||
|
'w1_polarity': (regions.CheckBox, (By.ID, 'id_w1_polarity')),
|
||||||
|
'w1_voltage': (regions.TextBox, (By.ID, 'id_w1_voltage')),
|
||||||
|
'w1_earth_fault': (regions.TextBox, (By.ID, 'id_w1_earth_fault')),
|
||||||
}
|
}
|
||||||
|
|
||||||
def select_size(self, size):
|
def select_size(self, size):
|
||||||
self.find_element(By.XPATH, '//button[.="{}"]'.format(size)).click()
|
self.find_element(By.XPATH, '//button[.="{}"]'.format(size)).click()
|
||||||
|
|
||||||
|
def add_vehicle(self):
|
||||||
|
self.find_element(*self._add_vehicle_locator).click()
|
||||||
|
|
||||||
|
def add_crew(self):
|
||||||
|
self.find_element(*self._add_crew_locator).click()
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def power_mic(self):
|
def power_mic(self):
|
||||||
return regions.BootstrapSelectElement(self, self.find_element(*self._power_mic_selector))
|
return regions.BootstrapSelectElement(self, self.find_element(*self._power_mic_selector))
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ from selenium.webdriver.common.keys import Keys
|
|||||||
from selenium.webdriver.support.ui import WebDriverWait
|
from selenium.webdriver.support.ui import WebDriverWait
|
||||||
from PyRIGS.tests.base import animation_is_finished
|
from PyRIGS.tests.base import animation_is_finished
|
||||||
from PyRIGS.tests import base
|
from PyRIGS.tests import base
|
||||||
|
from PyRIGS.tests import regions as base_regions
|
||||||
from RIGS.tests import regions
|
from RIGS.tests import regions
|
||||||
import datetime
|
import datetime
|
||||||
from datetime import date, time, timedelta
|
from datetime import date, time, timedelta
|
||||||
@@ -974,6 +975,8 @@ class TestHealthAndSafety(BaseRigboardTest):
|
|||||||
|
|
||||||
self.page.select_size('Small')
|
self.page.select_size('Small')
|
||||||
self.wait.until(animation_is_finished())
|
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
|
||||||
@@ -981,3 +984,97 @@ class TestHealthAndSafety(BaseRigboardTest):
|
|||||||
|
|
||||||
self.page.submit()
|
self.page.submit()
|
||||||
self.assertTrue(self.page.success)
|
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.safe_parking = True
|
||||||
|
self.page.safe_packing = True
|
||||||
|
self.page.exits = True
|
||||||
|
self.page.trip_hazard = True
|
||||||
|
self.page.warning_signs = True
|
||||||
|
self.page.ear_plugs = True
|
||||||
|
self.page.hs_location = "Death Valley"
|
||||||
|
self.page.extinguishers_location = "With the rest of the fire"
|
||||||
|
# If we do this first the search fails, for ... reasons
|
||||||
|
self.page.power_mic.search(self.profile.name)
|
||||||
|
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
|
||||||
|
self.page.source_rcd = True
|
||||||
|
self.page.labelling = True
|
||||||
|
self.page.fd_voltage_l1 = 240
|
||||||
|
self.page.fd_voltage_l2 = 235
|
||||||
|
self.page.fd_voltage_l3 = 0
|
||||||
|
self.page.fd_phase_rotation = True
|
||||||
|
self.page.fd_earth_fault = 666
|
||||||
|
self.page.fd_pssc = 1984
|
||||||
|
self.page.w1_description = "In the carpark, by the bins"
|
||||||
|
self.page.w1_polarity = True
|
||||||
|
self.page.w1_voltage = 240
|
||||||
|
self.page.w1_earth_fault = 333
|
||||||
|
|
||||||
|
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()
|
||||||
|
self.page.add_vehicle()
|
||||||
|
self.page.add_crew()
|
||||||
|
|
||||||
|
self.page.safe_parking = True
|
||||||
|
self.page.safe_packing = True
|
||||||
|
self.page.exits = True
|
||||||
|
self.page.trip_hazard = True
|
||||||
|
self.page.warning_signs = True
|
||||||
|
self.page.ear_plugs = True
|
||||||
|
self.page.hs_location = "The Moon"
|
||||||
|
self.page.extinguishers_location = "With the rest of the fire"
|
||||||
|
# If we do this first the search fails, for ... reasons
|
||||||
|
self.page.power_mic.search(self.profile.name)
|
||||||
|
self.page.power_mic.toggle()
|
||||||
|
self.assertFalse(self.page.power_mic.is_open)
|
||||||
|
|
||||||
|
vehicle_name = 'Brian'
|
||||||
|
self.driver.find_element(By.XPATH, '//*[@name="vehicle_-1"]').send_keys(vehicle_name)
|
||||||
|
driver = base_regions.BootstrapSelectElement(self.page, self.driver.find_element(By.XPATH, '(//*[contains(@class,"bootstrap-select")])[2]'))
|
||||||
|
driver.search(self.profile.name)
|
||||||
|
driver.toggle()
|
||||||
|
|
||||||
|
crew = self.profile
|
||||||
|
role = "MIC"
|
||||||
|
crew_select = base_regions.BootstrapSelectElement(self.page, self.driver.find_element(By.XPATH, '(//*[contains(@class,"bootstrap-select")])[3]'))
|
||||||
|
start_time = base_regions.DateTimePicker(self.page, self.driver.find_element(By.XPATH, '//*[@name="start_-1"]'))
|
||||||
|
end_time = base_regions.DateTimePicker(self.page, self.driver.find_element(By.XPATH, '//*[@name="end_-1"]'))
|
||||||
|
|
||||||
|
start_time.set_value(datetime.datetime(2015, 1, 1, 9, 0))
|
||||||
|
# TODO Validation of end before start
|
||||||
|
end_time.set_value(datetime.datetime(2015, 1, 1, 10, 30))
|
||||||
|
crew_select.search(crew.name)
|
||||||
|
crew_select.toggle()
|
||||||
|
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
|
||||||
|
self.page.pat = True
|
||||||
|
|
||||||
|
self.page.submit()
|
||||||
|
self.assertTrue(self.page.success)
|
||||||
|
|
||||||
|
checklist = models.EventChecklist.objects.get(event=self.testEvent.pk)
|
||||||
|
vehicle = models.EventChecklistVehicle.objects.get(checklist=checklist.pk)
|
||||||
|
self.assertEqual(vehicle_name, vehicle.vehicle)
|
||||||
|
crew_obj = models.EventChecklistCrew.objects.get(checklist=checklist.pk)
|
||||||
|
self.assertEqual(crew.pk, crew_obj.crewmember.pk)
|
||||||
|
self.assertEqual(role, crew_obj.role)
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ from django.core.management import call_command
|
|||||||
from django.urls import reverse
|
from django.urls import reverse
|
||||||
from django.test import TestCase
|
from django.test import TestCase
|
||||||
from django.test.utils import override_settings
|
from django.test.utils import override_settings
|
||||||
|
from django.utils import timezone
|
||||||
|
|
||||||
from RIGS import models
|
from RIGS import models
|
||||||
from reversion import revisions as reversion
|
from reversion import revisions as reversion
|
||||||
@@ -455,3 +456,105 @@ class TestSearchLogic(TestCase):
|
|||||||
response = self.client.get(request_url, follow=True)
|
response = self.client.get(request_url, follow=True)
|
||||||
self.assertContains(response, self.venues[1].address)
|
self.assertContains(response, self.venues[1].address)
|
||||||
self.assertNotContains(response, self.venues[2].address)
|
self.assertNotContains(response, self.venues[2].address)
|
||||||
|
|
||||||
|
|
||||||
|
class TestHSLogic(TestCase):
|
||||||
|
@classmethod
|
||||||
|
def setUpTestData(cls):
|
||||||
|
cls.profile = models.Profile.objects.create(username="testuser1", email="1@test.com", is_superuser=True,
|
||||||
|
is_active=True, is_staff=True)
|
||||||
|
|
||||||
|
cls.vatrate = models.VatRate.objects.create(start_at='2014-03-05', rate=0.20, comment='test1')
|
||||||
|
|
||||||
|
cls.events = {
|
||||||
|
1: models.Event.objects.create(name="TE E1", start_date=date.today(),
|
||||||
|
description="This is an event description\nthat for a very specific reason spans two lines."),
|
||||||
|
2: models.Event.objects.create(name="TE E2", start_date=date.today()),
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.ras = {
|
||||||
|
1: models.RiskAssessment.objects.create(event=cls.events[1],
|
||||||
|
nonstandard_equipment=False,
|
||||||
|
nonstandard_use=False,
|
||||||
|
contractors=False,
|
||||||
|
other_companies=False,
|
||||||
|
crew_fatigue=False,
|
||||||
|
big_power=False,
|
||||||
|
power_mic=cls.profile,
|
||||||
|
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=True,
|
||||||
|
barrier_required=True,
|
||||||
|
nonstandard_emergency_procedure=True,
|
||||||
|
special_structures=False,
|
||||||
|
suspended_structures=False),
|
||||||
|
}
|
||||||
|
|
||||||
|
cls.checklists = {
|
||||||
|
1: models.EventChecklist.objects.create(event=cls.events[1],
|
||||||
|
power_mic=cls.profile,
|
||||||
|
safe_parking=False,
|
||||||
|
safe_packing=False,
|
||||||
|
exits=False,
|
||||||
|
trip_hazard=False,
|
||||||
|
warning_signs=False,
|
||||||
|
ear_plugs=False,
|
||||||
|
hs_location="Locked away safely",
|
||||||
|
extinguishers_location="Somewhere, I forgot",
|
||||||
|
earthing=False,
|
||||||
|
pat=False,
|
||||||
|
medium_event=False
|
||||||
|
),
|
||||||
|
}
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.profile.set_password('testuser')
|
||||||
|
self.profile.save()
|
||||||
|
self.assertTrue(self.client.login(username=self.profile.username, password='testuser'))
|
||||||
|
|
||||||
|
def test_list(self):
|
||||||
|
request_url = reverse('hs_list')
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertContains(response, self.events[1].name)
|
||||||
|
self.assertContains(response, self.events[2].name)
|
||||||
|
self.assertContains(response, 'Create')
|
||||||
|
|
||||||
|
def test_ra_review(self):
|
||||||
|
request_url = reverse('ra_review', kwargs={'pk': self.ras[1].pk})
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertContains(response, 'Reviewed by')
|
||||||
|
self.assertContains(response, self.profile.name)
|
||||||
|
ra = models.RiskAssessment.objects.get(event=self.events[1])
|
||||||
|
self.assertEqual(timezone.now().date(), ra.reviewed_at.date())
|
||||||
|
self.assertEqual(timezone.now().hour, ra.reviewed_at.hour)
|
||||||
|
self.assertEqual(timezone.now().minute, ra.reviewed_at.minute)
|
||||||
|
|
||||||
|
def test_checklist_review(self):
|
||||||
|
request_url = reverse('ec_review', kwargs={'pk': self.checklists[1].pk})
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertContains(response, 'Reviewed by')
|
||||||
|
self.assertContains(response, self.profile.name)
|
||||||
|
checklist = models.EventChecklist.objects.get(event=self.events[1])
|
||||||
|
self.assertEqual(timezone.now().date(), checklist.reviewed_at.date())
|
||||||
|
self.assertEqual(timezone.now().hour, checklist.reviewed_at.hour)
|
||||||
|
self.assertEqual(timezone.now().minute, checklist.reviewed_at.minute)
|
||||||
|
|
||||||
|
def test_ra_redirect(self):
|
||||||
|
request_url = reverse('event_ra', kwargs={'pk': self.events[1].pk})
|
||||||
|
expected_url = reverse('ra_edit', kwargs={'pk': self.ras[1].pk})
|
||||||
|
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertRedirects(response, expected_url, status_code=302, target_status_code=200)
|
||||||
|
|
||||||
|
def test_checklist_redirect(self):
|
||||||
|
request_url = reverse('event_ec', kwargs={'pk': self.events[1].pk})
|
||||||
|
expected_url = reverse('ec_edit', kwargs={'pk': self.checklists[1].pk})
|
||||||
|
|
||||||
|
response = self.client.get(request_url, follow=True)
|
||||||
|
self.assertRedirects(response, expected_url, status_code=302, target_status_code=200)
|
||||||
|
|||||||
@@ -81,7 +81,8 @@ urlpatterns = [
|
|||||||
name='ra_edit'),
|
name='ra_edit'),
|
||||||
path('event/ra/list', permission_required_with_403('RIGS.view_riskassessment')(hs.EventRiskAssessmentList.as_view()),
|
path('event/ra/list', permission_required_with_403('RIGS.view_riskassessment')(hs.EventRiskAssessmentList.as_view()),
|
||||||
name='ra_list'),
|
name='ra_list'),
|
||||||
path('event/ra/<int:pk>/review/', permission_required_with_403('RIGS.review_riskassessment')(hs.EventRiskAssessmentReview.as_view()), name='ra_review'),
|
path('event/ra/<int:pk>/review/', permission_required_with_403('RIGS.review_riskassessment')(hs.EventRiskAssessmentReview.as_view()),
|
||||||
|
name='ra_review'),
|
||||||
|
|
||||||
path('event/<int:pk>/checklist/', permission_required_with_403('RIGS.add_eventchecklist')(hs.EventChecklistCreate.as_view()),
|
path('event/<int:pk>/checklist/', permission_required_with_403('RIGS.add_eventchecklist')(hs.EventChecklistCreate.as_view()),
|
||||||
name='event_ec'),
|
name='event_ec'),
|
||||||
@@ -91,7 +92,8 @@ urlpatterns = [
|
|||||||
name='ec_edit'),
|
name='ec_edit'),
|
||||||
path('event/checklist/list', permission_required_with_403('RIGS.view_eventchecklist')(hs.EventChecklistList.as_view()),
|
path('event/checklist/list', permission_required_with_403('RIGS.view_eventchecklist')(hs.EventChecklistList.as_view()),
|
||||||
name='ec_list'),
|
name='ec_list'),
|
||||||
path('event/checklist/<int:pk>/review/', permission_required_with_403('RIGS.review_eventchecklist')(hs.EventChecklistReview.as_view()), name='ec_review'),
|
path('event/checklist/<int:pk>/review/', permission_required_with_403('RIGS.review_eventchecklist')(hs.EventChecklistReview.as_view()),
|
||||||
|
name='ec_review'),
|
||||||
|
|
||||||
# Finance
|
# Finance
|
||||||
path('invoice/', permission_required_with_403('RIGS.view_invoice')(finance.InvoiceIndex.as_view()),
|
path('invoice/', permission_required_with_403('RIGS.view_invoice')(finance.InvoiceIndex.as_view()),
|
||||||
|
|||||||
Reference in New Issue
Block a user