From 7f3f41dab043a1b3329451beb0dff19de4b11bd3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Fri, 11 May 2018 13:45:17 +0200 Subject: [PATCH] some form checks on race creation --- rowers/.#plannedsessions.py | 1 + rowers/models.py | 84 ++++++++++++++++++++++++++++++++++++- rowers/views.py | 1 - 3 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 rowers/.#plannedsessions.py diff --git a/rowers/.#plannedsessions.py b/rowers/.#plannedsessions.py new file mode 100644 index 00000000..25407209 --- /dev/null +++ b/rowers/.#plannedsessions.py @@ -0,0 +1 @@ +e408191@CZ27LT9RCGN72.63076:1525965015 \ No newline at end of file diff --git a/rowers/models.py b/rowers/models.py index db5795ed..bbcde970 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -29,6 +29,7 @@ import datetime from django.core.exceptions import ValidationError from rowers.rows import validate_file_extension from collections import OrderedDict +from timezonefinder import TimezoneFinder import types @@ -1104,6 +1105,35 @@ class VirtualRace(PlannedSession): return stri + + def save(self, *args, **kwargs): + # test race window logic + + start_time = self.start_time + start_date = self.startdate + startdatetime = datetime.datetime.combine(start_date,start_time) + startdatetime = pytz.timezone(self.timezone).localize( + startdatetime + ) + + end_time = self.end_time + end_date = self.enddate + enddatetime = datetime.datetime.combine(end_date,end_time) + enddatetime = pytz.timezone(self.timezone).localize( + enddatetime + ) + + if startdatetime > enddatetime: + self.start_time = end_time + self.startdate = end_date + self.end_time = start_time + self.enddate = start_date + enddatetime = startdatetime + + if self.evaluation_closure < enddatetime: + self.evaluation_closure = enddatetime + timezone.timedelta(days=1) + + super(VirtualRace,self).save(*args, **kwargs) # Date input utility @@ -1142,7 +1172,27 @@ class PlannedSessionForm(ModelForm): def __init__(self,*args,**kwargs): super(PlannedSessionForm, self).__init__(*args, **kwargs) self.fields['course'].queryset = GeoCourse.objects.all().order_by("country","name") - + +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 + + class VirtualRaceForm(ModelForm): course = forms.ModelChoiceField(queryset = GeoCourse.objects, empty_label=None) registration_closure = forms.SplitDateTimeField(widget=AdminSplitDateTime(),required=False) @@ -1187,6 +1237,38 @@ class VirtualRaceForm(ModelForm): self.fields['course'].queryset = GeoCourse.objects.all().order_by("country","name") + def clean(self): + cd = self.cleaned_data + course = cd['course'] + geocourse = GeoCourse.objects.get(id=course.id) + timezone_str = get_course_timezone(geocourse) + + start_time = cd['start_time'] + start_date = cd['startdate'] + startdatetime = datetime.datetime.combine(start_date,start_time) + startdatetime = pytz.timezone(timezone_str).localize( + startdatetime + ) + + end_time = cd['end_time'] + end_date = cd['enddate'] + enddatetime = datetime.datetime.combine(end_date,end_time) + enddatetime = pytz.timezone(timezone_str).localize( + enddatetime + ) + + + if startdatetime > enddatetime: + raise forms.ValidationError("The Start of the Race Window should be before the End of the Race Window") + + if cd['evaluation_closure'] <= enddatetime: + raise forms.ValidationError("Evaluation closure deadline should be after the Race Window closes") + + if cd['evaluation_closure'] <= timezone.now(): + raise forms.ValidationError("Evaluation closure cannot be in the past") + + + return cleaned_data class PlannedSessionFormSmall(ModelForm): diff --git a/rowers/views.py b/rowers/views.py index 20dba719..69835e92 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -13588,7 +13588,6 @@ def virtualevent_create_view(request): startdatetime = datetime.datetime.combine(startdate,start_time) enddatetime = datetime.datetime.combine(enddate,end_time) - print enddatetime startdatetime = pytz.timezone(timezone_str).localize( startdatetime