From 4865ae99fddbe5ca59b5d1f3a11ac0692ca57ff5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 15 Apr 2018 15:39:04 +0200 Subject: [PATCH] time zone magic around virtualevent --- rowers/courses.py | 19 +++++++++++++++++++ rowers/models.py | 2 +- rowers/plannedsessions.py | 24 ++++++++++++++++++++++++ rowers/templates/virtualeventcreate.html | 19 +++++++++++++++---- rowers/views.py | 22 ++++++++++++++++++++++ 5 files changed, 81 insertions(+), 5 deletions(-) diff --git a/rowers/courses.py b/rowers/courses.py index 8a2b07df..58085405 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -16,6 +16,7 @@ import xml.etree.ElementTree as et import pandas as pd import numpy as np +from timezonefinder import TimezoneFinder import dataprep from rowers.utils import geo_distance @@ -38,6 +39,24 @@ class InvalidTrajectoryError(Exception): def __str__(self): return repr(self.value) +def get_course_timezone(course): + polygons = GeoPolygon.objects.filter(course = course) + points = GeoPoint.objects.filter(polygon = polygons[0]) + lat = points[0].latitude + lon = points[0].longitude + + tf = TimezoneFinder() + try: + timezone_str = tf.timezone_at(lng=lon,lat=lat) + except ValueError: + timezone_str = 'UTC' + + if timezone_str is None: + timezone_str = tf.closest_timezone_at(lng=lon,lat=lat) + if timezone_str is None: + timezone_str = 'UTC' + + return timezone_str def polygon_to_path(polygon): points = GeoPoint.objects.filter(polygon=polygon).order_by("order_in_poly") diff --git a/rowers/models.py b/rowers/models.py index 131a4ce7..1a53c612 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1074,7 +1074,7 @@ class VirtualRace(PlannedSession): contact_phone = models.CharField(validators=[phone_regex], max_length=17, blank=True) contact_email = models.EmailField(max_length=254, - validators=[validate_email]) + validators=[validate_email],blank=True) # Date input utility class DateInput(forms.DateInput): diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index da26d0a5..76b4b8ec 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -86,6 +86,30 @@ def timefield_to_seconds_duration(t): return duration + +def get_virtualrace_times(virtualrace): + geocourse = GeoCourse.objects.get(id = virtualrace.course.id) + timezone_str = courses.get_course_timezone(geocourse) + + startdatetime = datetime.datetime.combine( + virtualrace.startdate,virtualrace.start_time) + enddatetime = datetime.datetime.combine( + virtualrace.enddate,virtualrace.end_time) + + startdatetime = pytz.timezone(timezone_str).localize( + startdatetime + ) + enddatetime = pytz.timezone(timezone_str).localize( + enddatetime + ) + + return { + 'startdatetime':startdatetime, + 'enddatetime':enddatetime, + 'evaluation_closure':virtualrace.evaluation_closure, + 'registration_closure':virtualrace.registration_closure, + } + def get_session_metrics(ps): rowers = ps.rower.all() rscore = [] diff --git a/rowers/templates/virtualeventcreate.html b/rowers/templates/virtualeventcreate.html index e325c146..d55afb53 100644 --- a/rowers/templates/virtualeventcreate.html +++ b/rowers/templates/virtualeventcreate.html @@ -8,10 +8,10 @@
+

New Virtual Race

-

New Virtual Race

{% if form.errors %}

@@ -28,10 +28,21 @@

- -
- +
+

+

    +
  • All times are local times in the race course time zone
  • +
  • Adding a contact phone number and email is not mandatory, but we + strongly recommend it.
  • +
  • If your event has a registration closure deadline, participants + have to enter (and can withdraw) before the registration closure time.
  • +
  • Participants can submit results until the evaluation closure time.
  • +
+

+
+ + {% endblock %} {% block scripts %} diff --git a/rowers/views.py b/rowers/views.py index 06600dbd..20cb75ea 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -148,6 +148,7 @@ import matplotlib.pyplot as plt from rowers.emails import send_template_email from pytz import timezone as tz,utc +from timezonefinder import TimezoneFinder import dateutil import mpld3 from mpld3 import plugins @@ -13324,7 +13325,28 @@ def virtualevent_create_view(request): contact_phone = cd['contact_phone'] contact_email = cd['contact_email'] + # correct times + geocourse = GeoCourse.objects.get(id= course.id) + timezone_str = courses.get_course_timezone(geocourse) + + startdatetime = datetime.datetime.combine(startdate,start_time) + enddatetime = datetime.datetime.combine(enddate,end_time) + + startdatetime = pytz.timezone(timezone_str).localize( + startdatetime + ) + enddatetime = pytz.timezone(timezone_str).localize( + enddatetime + ) + evaluation_closure = pytz.timezone(timezone_str).localize( + evaluation_closure.replace(tzinfo=None) + ) + registration_closure = pytz.timezone(timezone_str).localize( + registration_closure.replace(tzinfo=None) + ) + + vs = VirtualRace( name=name,