mirror of
https://github.com/nottinghamtec/PyRIGS.git
synced 2026-01-22 16:02:16 +00:00
FIX: CI Locale Issues
This commit is contained in:
@@ -5,6 +5,9 @@ cache: pip
|
|||||||
|
|
||||||
addons:
|
addons:
|
||||||
chrome: stable
|
chrome: stable
|
||||||
|
|
||||||
|
before_install:
|
||||||
|
- export LANGUAGE=en_GB.UTF-8
|
||||||
|
|
||||||
install:
|
install:
|
||||||
- |
|
- |
|
||||||
|
|||||||
@@ -206,6 +206,7 @@ USE_L10N = True
|
|||||||
|
|
||||||
USE_TZ = True
|
USE_TZ = True
|
||||||
|
|
||||||
|
# Need to allow seconds as datetime-local input type spits out a time that has seconds
|
||||||
DATETIME_INPUT_FORMATS = ('%Y-%m-%dT%H:%M', '%Y-%m-%dT%H:%M:%S')
|
DATETIME_INPUT_FORMATS = ('%Y-%m-%dT%H:%M', '%Y-%m-%dT%H:%M:%S')
|
||||||
|
|
||||||
# Static files (CSS, JavaScript, Images)
|
# Static files (CSS, JavaScript, Images)
|
||||||
|
|||||||
@@ -24,6 +24,8 @@ def create_browser():
|
|||||||
# No caching, please and thank you
|
# No caching, please and thank you
|
||||||
options.add_argument("--aggressive-cache-discard")
|
options.add_argument("--aggressive-cache-discard")
|
||||||
options.add_argument("--disk-cache-size=0")
|
options.add_argument("--disk-cache-size=0")
|
||||||
|
# God Save The Queen
|
||||||
|
options.add_argument("--lang=en_GB")
|
||||||
if os.environ.get('CI', False):
|
if os.environ.get('CI', False):
|
||||||
options.add_argument("--headless")
|
options.add_argument("--headless")
|
||||||
options.add_argument("--no-sandbox")
|
options.add_argument("--no-sandbox")
|
||||||
@@ -58,7 +60,7 @@ def screenshot_failure(func):
|
|||||||
func(self, *args, **kwargs)
|
func(self, *args, **kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
screenshot_name = func.__module__ + "." + func.__qualname__
|
screenshot_name = func.__module__ + "." + func.__qualname__
|
||||||
screenshot_file = "screenshots/"+func.__qualname__+".png"
|
screenshot_file = "screenshots/" + func.__qualname__ + ".png"
|
||||||
if not pathlib.Path("screenshots").is_dir():
|
if not pathlib.Path("screenshots").is_dir():
|
||||||
os.mkdir("screenshots")
|
os.mkdir("screenshots")
|
||||||
self.driver.save_screenshot(screenshot_file)
|
self.driver.save_screenshot(screenshot_file)
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
from pypom import Region
|
from pypom import Region
|
||||||
|
from django.utils import timezone
|
||||||
from selenium.webdriver.common.by import By
|
from selenium.webdriver.common.by import By
|
||||||
from selenium.webdriver.support import expected_conditions
|
from selenium.webdriver.support import expected_conditions
|
||||||
from selenium.webdriver.remote.webelement import WebElement
|
from selenium.webdriver.remote.webelement import WebElement
|
||||||
@@ -17,6 +18,17 @@ def parse_bool_from_string(string):
|
|||||||
else:
|
else:
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
# 12-Hour vs 24-Hour Time. Affects widget display
|
||||||
|
|
||||||
|
|
||||||
|
def get_time_format():
|
||||||
|
# Default
|
||||||
|
time_format = "%H:%M"
|
||||||
|
# If system is 12hr
|
||||||
|
if timezone.now().strftime("%p"):
|
||||||
|
time_format = "%I:%M %p"
|
||||||
|
return time_format
|
||||||
|
|
||||||
|
|
||||||
class BootstrapSelectElement(Region):
|
class BootstrapSelectElement(Region):
|
||||||
_main_button_locator = (By.CSS_SELECTOR, 'button.dropdown-toggle')
|
_main_button_locator = (By.CSS_SELECTOR, 'button.dropdown-toggle')
|
||||||
@@ -127,23 +139,23 @@ class DatePicker(Region):
|
|||||||
class TimePicker(Region):
|
class TimePicker(Region):
|
||||||
@property
|
@property
|
||||||
def value(self):
|
def value(self):
|
||||||
return datetime.datetime.strptime(self.root.get_attribute("value"), "%H:%M")
|
return datetime.datetime.strptime(self.root.get_attribute("value"), get_time_format())
|
||||||
|
|
||||||
def set_value(self, value):
|
def set_value(self, value):
|
||||||
self.root.clear()
|
self.root.clear()
|
||||||
self.root.send_keys(value.strftime("%H:%M"))
|
self.root.send_keys(value.strftime(get_time_format()))
|
||||||
|
|
||||||
|
|
||||||
class DateTimePicker(Region):
|
class DateTimePicker(Region):
|
||||||
@property
|
@property
|
||||||
def value(self):
|
def value(self):
|
||||||
return datetime.datetime.strptime(self.root.get_attribute("value"), "%Y-%m-%d %H:%M")
|
return datetime.datetime.strptime(self.root.get_attribute("value"), "%Y-%m-%d " + get_time_format())
|
||||||
|
|
||||||
def set_value(self, value):
|
def set_value(self, value):
|
||||||
self.root.clear()
|
self.root.clear()
|
||||||
|
|
||||||
date = value.date().strftime("%d%m%Y")
|
date = value.date().strftime("%d%m%Y")
|
||||||
time = value.time().strftime("%H%M")
|
time = value.time().strftime(get_time_format())
|
||||||
|
|
||||||
self.root.send_keys(date)
|
self.root.send_keys(date)
|
||||||
self.root.send_keys(Keys.TAB)
|
self.root.send_keys(Keys.TAB)
|
||||||
|
|||||||
@@ -13,13 +13,15 @@ from RIGS import models
|
|||||||
|
|
||||||
# Override the django form defaults to use the HTML date/time/datetime UI elements
|
# Override the django form defaults to use the HTML date/time/datetime UI elements
|
||||||
forms.DateField.widget = forms.DateInput(attrs={'type': 'date'})
|
forms.DateField.widget = forms.DateInput(attrs={'type': 'date'})
|
||||||
forms.TimeField.widget = forms.TextInput(attrs={'type': 'time'})
|
forms.TimeField.widget = forms.TimeInput(attrs={'type': 'time'}, format='%H:%M')
|
||||||
forms.DateTimeField.widget = forms.DateTimeInput(attrs={'type': 'datetime-local'})
|
forms.DateTimeField.widget = forms.DateTimeInput(attrs={'type': 'datetime-local'}, format='%Y-%m-%d %H:%M')
|
||||||
|
|
||||||
|
|
||||||
# Events Shit
|
# Events Shit
|
||||||
|
|
||||||
|
|
||||||
class EventForm(forms.ModelForm):
|
class EventForm(forms.ModelForm):
|
||||||
datetime_input_formats = formats.get_format_lazy("DATETIME_INPUT_FORMATS") + list(settings.DATETIME_INPUT_FORMATS)
|
datetime_input_formats = list(settings.DATETIME_INPUT_FORMATS)
|
||||||
meet_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False)
|
meet_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False)
|
||||||
access_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False)
|
access_at = forms.DateTimeField(input_formats=datetime_input_formats, required=False)
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
{% load widget_tweaks %}
|
{% load widget_tweaks %}
|
||||||
|
{% load l10n %}
|
||||||
|
|
||||||
<div class="col-md-6 my-3">
|
<div class="col-md-6 my-3">
|
||||||
<div class="card card-default form-hws form-non_rig">
|
<div class="card card-default form-hws form-non_rig">
|
||||||
<div class="card-header">Event Details</div>
|
<div class="card-header">Event Details</div>
|
||||||
@@ -49,7 +51,7 @@
|
|||||||
{% render_field form.start_date class+="form-control" %}
|
{% render_field form.start_date class+="form-control" %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-5" data-toggle="tooltip" title="Start time of event, can be left blank">
|
<div class="col-sm-12 col-md-5" data-toggle="tooltip" title="Start time of event, can be left blank">
|
||||||
{% render_field form.start_time class+="form-control" %}
|
{% render_field form.start_time class+="form-control" step="60" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -64,7 +66,7 @@
|
|||||||
{% render_field form.end_date class+="form-control" %}
|
{% render_field form.end_date class+="form-control" %}
|
||||||
</div>
|
</div>
|
||||||
<div class="col-sm-12 col-md-5" data-toggle="tooltip" title="End time of event, leave blank if unknown">
|
<div class="col-sm-12 col-md-5" data-toggle="tooltip" title="End time of event, leave blank if unknown">
|
||||||
{% render_field form.end_time class+="form-control" %}
|
{% render_field form.end_time class+="form-control" step="60" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -77,7 +79,7 @@
|
|||||||
class="col-sm-4 control-label">{{ form.access_at.label }}</label>
|
class="col-sm-4 control-label">{{ form.access_at.label }}</label>
|
||||||
|
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
{% render_field form.access_at class+="form-control" %}
|
{% render_field form.access_at class+="form-control" step="60" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group" data-toggle="tooltip" title="The date/time at which crew should meet for this event">
|
<div class="form-group" data-toggle="tooltip" title="The date/time at which crew should meet for this event">
|
||||||
@@ -85,7 +87,7 @@
|
|||||||
class="col-sm-4 control-label">{{ form.meet_at.label }}</label>
|
class="col-sm-4 control-label">{{ form.meet_at.label }}</label>
|
||||||
|
|
||||||
<div class="col-sm-8">
|
<div class="col-sm-8">
|
||||||
{% render_field form.meet_at class+="form-control" %}
|
{% render_field form.meet_at class+="form-control" step="60" %}
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="form-group">
|
<div class="form-group">
|
||||||
|
|||||||
@@ -119,7 +119,7 @@ class TestEventCreate(BaseRigboardTest):
|
|||||||
|
|
||||||
self.page.name = "Test Rig"
|
self.page.name = "Test Rig"
|
||||||
self.page.start_date = datetime.date(2015, 1, 1)
|
self.page.start_date = datetime.date(2015, 1, 1)
|
||||||
self.page.start_time = datetime.time(10)
|
self.page.start_time = datetime.time(10, 00)
|
||||||
self.page.end_date = datetime.date(2015, 1, 10)
|
self.page.end_date = datetime.date(2015, 1, 10)
|
||||||
self.page.access_at = datetime.datetime(2015, 1, 1, 9)
|
self.page.access_at = datetime.datetime(2015, 1, 1, 9)
|
||||||
self.page.dry_hire = True
|
self.page.dry_hire = True
|
||||||
@@ -210,8 +210,8 @@ class TestEventCreate(BaseRigboardTest):
|
|||||||
self.page.name = "Test Date Validation"
|
self.page.name = "Test Date Validation"
|
||||||
# end time before start
|
# end time before start
|
||||||
self.page.start_date = datetime.date(2020, 1, 1)
|
self.page.start_date = datetime.date(2020, 1, 1)
|
||||||
self.page.start_time = datetime.time(10)
|
self.page.start_time = datetime.time(10, 00)
|
||||||
self.page.end_time = datetime.time(9)
|
self.page.end_time = datetime.time(9, 00)
|
||||||
|
|
||||||
# Expected to fail
|
# Expected to fail
|
||||||
self.page.submit()
|
self.page.submit()
|
||||||
@@ -219,7 +219,7 @@ class TestEventCreate(BaseRigboardTest):
|
|||||||
self.assertIn("can't finish before it has started", self.page.errors["General form errors"][0])
|
self.assertIn("can't finish before it has started", self.page.errors["General form errors"][0])
|
||||||
|
|
||||||
# Fix it
|
# Fix it
|
||||||
self.page.end_time = datetime.time(23)
|
self.page.end_time = datetime.time(23, 00)
|
||||||
|
|
||||||
# Should work
|
# Should work
|
||||||
self.page.submit()
|
self.page.submit()
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ from selenium.webdriver.support.ui import WebDriverWait
|
|||||||
from PyRIGS.tests.base import animation_is_finished
|
from PyRIGS.tests.base import animation_is_finished
|
||||||
import datetime
|
import datetime
|
||||||
from django.utils import timezone
|
from django.utils import timezone
|
||||||
|
from selenium.webdriver.common.action_chains import ActionChains
|
||||||
|
|
||||||
|
|
||||||
@screenshot_failure_cls
|
@screenshot_failure_cls
|
||||||
@@ -134,6 +135,8 @@ class TestAssetForm(AutoLoginTest):
|
|||||||
self.page.purchased_from_selector.set_option(self.supplier.name, True)
|
self.page.purchased_from_selector.set_option(self.supplier.name, True)
|
||||||
self.page.purchase_price = "12.99"
|
self.page.purchase_price = "12.99"
|
||||||
self.page.salvage_value = "99.12"
|
self.page.salvage_value = "99.12"
|
||||||
|
# FIXME Scroll down to make failure screenshot more useful...
|
||||||
|
ActionChains(self.driver).move_to_element(self.driver.find_element_by_class_name('btn-success')).perform()
|
||||||
self.page.date_acquired = acquired = datetime.date(2020, 5, 20)
|
self.page.date_acquired = acquired = datetime.date(2020, 5, 20)
|
||||||
|
|
||||||
self.page.parent_selector.toggle()
|
self.page.parent_selector.toggle()
|
||||||
|
|||||||
Reference in New Issue
Block a user