FIX: CI Locale Issues

This commit is contained in:
2020-05-27 18:38:58 -04:00
parent 4081918598
commit 14d211326e
8 changed files with 41 additions and 16 deletions

View File

@@ -5,6 +5,9 @@ cache: pip
addons: addons:
chrome: stable chrome: stable
before_install:
- export LANGUAGE=en_GB.UTF-8
install: install:
- | - |

View File

@@ -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)

View File

@@ -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)

View 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)

View File

@@ -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)

View File

@@ -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">

View File

@@ -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()

View File

@@ -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()