From 58ab1f87bbb5a77753f43df62892e3ce82feec77 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 2 Sep 2017 16:54:09 +0200 Subject: [PATCH 1/8] time zone aware rowingdata accepted --- rowers/dataprep.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index b4acbd56..7cd30d33 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -568,7 +568,11 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', workoutdate = row.rowdatetime.strftime('%Y-%m-%d') workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') - workoutstartdatetime = thetimezone.localize(row.rowdatetime).astimezone(utc) + #workoutstartdatetime = row.rowdatetime + try: + workoutstartdatetime = thetimezone.localize(row.rowdatetime).astimezone(utc) + except ValueError: + workoutstartdatetime = row.rowdatetime if makeprivate: privacy = 'hidden' From bd46c5bcd7814caf8616ebc4e062cafdee093952 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 3 Sep 2017 12:11:19 +0200 Subject: [PATCH 2/8] added timezone detection --- rowers/templates/basebase.html | 2 ++ rowers/templates/frontpage.html | 3 +++ rowers/views.py | 2 +- rowsandall_app/settings.py | 8 ++++++-- rowsandall_app/urls.py | 1 + templates/basebase.html | 2 ++ 6 files changed, 15 insertions(+), 3 deletions(-) diff --git a/rowers/templates/basebase.html b/rowers/templates/basebase.html index 199b53d8..1e3cdb3a 100644 --- a/rowers/templates/basebase.html +++ b/rowers/templates/basebase.html @@ -1,5 +1,7 @@ {% load cookielaw_tags %} {% load leaflet_tags %} +{% load tz_detect %} +{% tz_detect %} {% load analytical %} {% block filters %} {% endblock %} diff --git a/rowers/templates/frontpage.html b/rowers/templates/frontpage.html index 3266a21b..99aedc9b 100644 --- a/rowers/templates/frontpage.html +++ b/rowers/templates/frontpage.html @@ -7,6 +7,9 @@ {% block content %}
+

+ Local Time: {% now "jS F Y H:i" %} +

Compatible with: Strava icon diff --git a/rowers/views.py b/rowers/views.py index 4187cbd7..33e5adce 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -143,7 +143,7 @@ from dataprep import timedeltaconv from scipy.interpolate import griddata -LOCALTIMEZONE = tz('Etc/UTC') +#LOCALTIMEZONE = tz('Etc/UTC') USER_LANGUAGE = 'en-US' from interactiveplots import * diff --git a/rowsandall_app/settings.py b/rowsandall_app/settings.py index c6d39160..98d21718 100644 --- a/rowsandall_app/settings.py +++ b/rowsandall_app/settings.py @@ -62,7 +62,8 @@ INSTALLED_APPS = [ 'corsheaders', 'analytical', 'cookielaw', - 'django_extensions' + 'django_extensions', + 'tz_detect' ] AUTHENTICATION_BACKENDS = ( @@ -90,6 +91,7 @@ MIDDLEWARE_CLASSES = [ 'django.contrib.messages.middleware.MessageMiddleware', 'async_messages.middleware.AsyncMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', + 'tz_detect.middleware.TimezoneMiddleware', ] ROOT_URLCONF = 'rowsandall_app.urls' @@ -174,7 +176,7 @@ AUTH_PASSWORD_VALIDATORS = [ # Internationalization # https://docs.djangoproject.com/en/1.9/topics/i18n/ -TIME_ZONE = 'UTC' +#TIME_ZONE = 'UTC' USE_I18N = True @@ -182,6 +184,8 @@ USE_L10N = True USE_TZ = True +TZ_DETECT_COUNTRIES = ('US','DE','GB','CZ','FR','IT') + LOCALE_PATHS = ( os.path.join(BASE_DIR, 'locale'), os.path.join(BASE_DIR, 'cvkbrno/locale'), diff --git a/rowsandall_app/urls.py b/rowsandall_app/urls.py index 1c8750bd..b7c2cb11 100644 --- a/rowsandall_app/urls.py +++ b/rowsandall_app/urls.py @@ -71,6 +71,7 @@ urlpatterns += [ url(r'^tp\_callback',rowersviews.rower_process_tpcallback), url(r'^twitter\_callback',rowersviews.rower_process_twittercallback), url(r'^i18n/', include('django.conf.urls.i18n')), + url(r'^tz_detect/', include('tz_detect.urls')), ] diff --git a/templates/basebase.html b/templates/basebase.html index 4f89aad6..65d611f9 100644 --- a/templates/basebase.html +++ b/templates/basebase.html @@ -1,5 +1,7 @@ {% load leaflet_tags %} {% load cookielaw_tags %} +{% load tz_detect %} +{% tz_detect %} {% load analytical %} {% block filters %} {% endblock %} From df9806a2007b58b6ae7623b7900864c014d33e74 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 3 Sep 2017 14:47:20 +0200 Subject: [PATCH 3/8] added timezone to workout model --- rowers/models.py | 42 +++++++++++++++++++++++++++--- rowers/templates/workout_form.html | 8 +++--- rowers/views.py | 6 +++++ 3 files changed, 49 insertions(+), 7 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index fb82d2e9..047d315c 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -12,7 +12,7 @@ from django.core.validators import validate_email import os import twitter import re - +import pytz from django.conf import settings from sqlalchemy import create_engine import sqlalchemy as sa @@ -21,6 +21,7 @@ from django.utils import timezone import datetime from django.core.exceptions import ValidationError from rowers.rows import validate_file_extension +from collections import OrderedDict import types @@ -388,7 +389,11 @@ def checkworkoutuser(user,workout): except Rower.DoesNotExist: return False - + +timezones = ( + (x,x) for x in pytz.common_timezones +) + # Workout class Workout(models.Model): workouttypes = types.workouttypes @@ -408,6 +413,9 @@ class Workout(models.Model): verbose_name = 'Boat Type') starttime = models.TimeField(blank=True,null=True) startdatetime = models.DateTimeField(blank=True,null=True) + timezone = models.CharField(default='UTC', + choices=timezones, + max_length=100) distance = models.IntegerField(default=0,blank=True) duration = models.TimeField(default=1,blank=True) weightcategory = models.CharField(default="hwt",max_length=10) @@ -574,7 +582,7 @@ class WorkoutForm(ModelForm): duration = forms.TimeInput(format='%H:%M:%S.%f') class Meta: model = Workout - fields = ['name','date','starttime','duration','distance','workouttype','notes','privacy','rankingpiece','boattype'] + fields = ['name','date','starttime','timezone','duration','distance','workouttype','notes','privacy','rankingpiece','boattype'] widgets = { 'date': DateInput(), 'notes': forms.Textarea, @@ -585,9 +593,37 @@ class WorkoutForm(ModelForm): super(WorkoutForm, self).__init__(*args, **kwargs) # this line to be removed del self.fields['privacy'] +# self.fields['timezone'] = forms.ChoiceField(choices=[ +# (x,x) for x in pytz.common_timezones +# ], +# initial='UTC', +# label='Time Zone') if self.instance.workouttype != 'water': del self.fields['boattype'] + + fieldorder = ( + 'name', + 'date', + 'starttime', + 'timezone', + 'duration', + 'distance', + 'workouttype', + 'notes', + 'rankingpiece', + 'boattype' + ) + + fields = OrderedDict() + for key in fieldorder: + try: + fields[key] = self.fields.pop(key) + except KeyError: + pass + for key, valye in self.fields.items(): + fields[key] = value + self.fields = fields # Used for the rowing physics calculations class AdvancedWorkoutForm(ModelForm): diff --git a/rowers/templates/workout_form.html b/rowers/templates/workout_form.html index 3a48dac7..bf47f4c3 100644 --- a/rowers/templates/workout_form.html +++ b/rowers/templates/workout_form.html @@ -2,6 +2,7 @@ {% load staticfiles %} {% load rowerfilters %} {% load tz %} +{% get_current_timezone as TIME_ZONE %} {% block title %}Change Workout {% endblock %} @@ -42,11 +43,11 @@

- - {% localtime on %} - +{% localtime on %} + +{% endlocaltime %} @@ -69,7 +70,6 @@
Date/Time:{{ workout.startdatetime }}Date/Time:{{ workout.startdatetime|localtime}}
Distance:{{ workout.distance }}m
- {% endlocaltime %}
{{ form.as_table }} diff --git a/rowers/views.py b/rowers/views.py index 33e5adce..84fd47b2 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3,6 +3,7 @@ import colorsys import timestring import zipfile import bleach +import pytz import operator import warnings import urllib @@ -6255,6 +6256,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): duration = form.cleaned_data['duration'] distance = form.cleaned_data['distance'] notes = form.cleaned_data['notes'] + thetimezone = form.cleaned_data['timezone'] try: boattype = request.POST['boattype'] except KeyError: @@ -6272,6 +6274,9 @@ def workout_edit_view(request,id=0,message="",successmessage=""): startdatetime = datetime.datetime.strptime(startdatetime, "%Y-%m-%d %H:%M:%S") startdatetime = timezone.make_aware(startdatetime) + startdatetime = startdatetime.astimezone(pytz.timezone(thetimezone)) + print startdatetime + # check if user is owner of this workout if checkworkoutuser(request.user,row): row.name = name @@ -6285,6 +6290,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): row.boattype = boattype row.privacy = privacy row.rankingpiece = rankingpiece + row.timezone = thetimezone try: row.save() except IntegrityError: From 9128a174144f2c82af852f7b08aaba7e9ed8cac5 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sun, 3 Sep 2017 14:55:39 +0200 Subject: [PATCH 4/8] tests for time zones --- rowers/tests.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/rowers/tests.py b/rowers/tests.py index 415154ef..96b2bb91 100644 --- a/rowers/tests.py +++ b/rowers/tests.py @@ -371,6 +371,7 @@ class DataTest(TestCase): 'name':'test', 'date':'2016-05-01', 'starttime':'07:53:00', + 'timezone':'UTC', 'duration':'0:55:00.1', 'distance':8000, 'notes':'Aap noot \n mies', @@ -595,6 +596,7 @@ class ViewTest(TestCase): 'name':'aap', 'date':'2016-11-05', 'starttime':'09:07:14', + 'timezone':'Europe/Berlin', 'duration':'1:00:00.5', 'distance':'15000', 'workouttype':'rower', From b4953509a4289bbf4d274f88a36d155c7299b42f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 4 Sep 2017 12:18:12 +0200 Subject: [PATCH 5/8] improved timezone awareness on upload --- rowers/dataprep.py | 38 ++++++++++++++++++++++++++++++++++---- rowers/views.py | 2 +- 2 files changed, 35 insertions(+), 5 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 7cd30d33..0aa9cb97 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -5,7 +5,7 @@ from rowingdata import rowingdata as rrdata from rowers.tasks import handle_sendemail_unrecognized from rowers.tasks import handle_zip_file - +import pytz from rowingdata import rower as rrower from rowingdata import main as rmain @@ -49,6 +49,8 @@ import datautils from utils import lbstoN from scipy.interpolate import griddata +from timezonefinder import TimezoneFinder + import django_rq queue = django_rq.get_queue('default') queuelow = django_rq.get_queue('low') @@ -566,14 +568,41 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', #summary += '\n' #summary += row.intervalstats() - workoutdate = row.rowdatetime.strftime('%Y-%m-%d') - workoutstarttime = row.rowdatetime.strftime('%H:%M:%S') #workoutstartdatetime = row.rowdatetime + timezone_str = 'UTC' try: - workoutstartdatetime = thetimezone.localize(row.rowdatetime).astimezone(utc) + workoutstartdatetime = timezone.make_aware(row.rowdatetime) except ValueError: workoutstartdatetime = row.rowdatetime + + + try: + latavg = row.df[' latitude'].mean() + lonavg = row.df[' longitude'].mean() + tf = TimezoneFinder() + timezone_str = tf.timezone_at(lng=lonavg,lat=latavg) + if timezone_str == None: + timezone_str = tf.closest_timezone_at(lng=lonavg, + lat=latavg) + workoutstartdatetime = pytz.timezone(timezone_str).localize( + row.rowdatetime + ) + + + except ValueError,KeyError: + workoutstartdatetime = thetimezone.localize( + row.rowdatetime + ).astimezone(utc) + + + workoutdate = workoutstartdatetime.astimezone( + pytz.timezone(timezone_str) + ).strftime('%Y-%m-%d') + workoutstarttime = workoutstartdatetime.astimezone( + pytz.timezone(timezone_str) + ).strftime('%H:%M:%S') + if makeprivate: privacy = 'hidden' else: @@ -604,6 +633,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', maxhr=maxhr,averagehr=averagehr, startdatetime=workoutstartdatetime, inboard=inboard,oarlength=oarlength, + timezone=timezone_str, privacy=privacy) diff --git a/rowers/views.py b/rowers/views.py index 84fd47b2..960e5255 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -6275,7 +6275,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""): "%Y-%m-%d %H:%M:%S") startdatetime = timezone.make_aware(startdatetime) startdatetime = startdatetime.astimezone(pytz.timezone(thetimezone)) - print startdatetime + # check if user is owner of this workout if checkworkoutuser(request.user,row): From a5639e734fa32f4f00550dbdf43686a573095c84 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 4 Sep 2017 12:52:13 +0200 Subject: [PATCH 6/8] timezone aware bug fixes --- rowers/dataprep.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 0aa9cb97..1337e3a6 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -585,15 +585,19 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', if timezone_str == None: timezone_str = tf.closest_timezone_at(lng=lonavg, lat=latavg) + if timezone_str == None: + timezone_str = 'UTC' + try: workoutstartdatetime = pytz.timezone(timezone_str).localize( row.rowdatetime ) - - - except ValueError,KeyError: - workoutstartdatetime = thetimezone.localize( - row.rowdatetime - ).astimezone(utc) + except ValueError: + workoutstartdatetime = workoutstartdatetime.astimezone( + pytz.timezone(timezone_str) + ) + except KeyError: + timezone_str = 'UTC' + workoutdate = workoutstartdatetime.astimezone( From 75a3292b54613163c0fb54427d99152bfef8ad61 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 4 Sep 2017 13:24:06 +0200 Subject: [PATCH 7/8] replaced mktime with arrow.get --- rowers/views.py | 42 +++++++++++++++++++++++++----------------- 1 file changed, 25 insertions(+), 17 deletions(-) diff --git a/rowers/views.py b/rowers/views.py index 960e5255..709e6d54 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -3,6 +3,7 @@ import colorsys import timestring import zipfile import bleach +import arrow import pytz import operator import warnings @@ -464,7 +465,7 @@ def add_workout_from_strokedata(user,importid,data,strokedata, except: title = 'Imported' - starttimeunix = mktime(rowdatetime.utctimetuple()) + starttimeunix = arrow.get(rowdatetime).timestamp res = make_cumvalues(0.1*strokedata['t']) cum_time = res[0] @@ -618,9 +619,10 @@ def add_workout_from_runkeeperdata(user,importid,data): except: rowdatetime = datetime.datetime.strptime(data['date'],"%Y-%m-%d %H:%M:%S") rowdatetime = thetimezone.localize(rowdatetime).astimezone(utc) - starttimeunix = mktime(rowdatetime.utctimetuple()) + starttimeunix = arrow.get(rowdatetime).timestamp + #starttimeunix = mktime(rowdatetime.utctimetuple()) starttimeunix += utcoffset*3600 - + try: title = data['name'] @@ -670,9 +672,17 @@ def add_workout_from_runkeeperdata(user,importid,data): distseries = pd.Series(distance,index=times_distance) distseries = distseries.groupby(distseries.index).first() latseries = pd.Series(latcoord,index=times_location) - latseries = latseries.groupby(latseries.index).first() + try: + latseries = latseries.groupby(latseries.index).first() + except TypeError: + latseries = 0.0*distseries + lonseries = pd.Series(loncoord,index=times_location) - lonseries = lonseries.groupby(lonseries.index).first() + try: + lonseries = lonseries.groupby(lonseries.index).first() + except TypeError: + lonseries = 0.0*distseries + spmseries = pd.Series(spm,index=times_spm) spmseries = spmseries.groupby(spmseries.index).first() hrseries = pd.Series(hr,index=times_hr) @@ -761,12 +771,8 @@ def add_workout_from_stdata(user,importid,data): comments = data['comments'] except: comments = '' - - try: - thetimezone = tz(data['timezone']) - except: - thetimezone = 'UTC' + r = getrower(user) try: rowdatetime = iso8601.parse_date(data['start_time']) @@ -781,9 +787,8 @@ def add_workout_from_stdata(user,importid,data): except: rowdatetime = datetime.datetime.strptime(data['date'],"%Y-%m-%d %H:%M:%S") rowdatetime = thetimezone.localize(rowdatetime).astimezone(utc) - starttimeunix = mktime(rowdatetime.utctimetuple()) - - + starttimeunix = arrow.get(rowdatetime).timestamp + try: title = data['name'] except: @@ -944,7 +949,8 @@ def add_workout_from_underarmourdata(user,importid,data): except: rowdatetime = datetime.datetime.strptime(data['date'],"%Y-%m-%d %H:%M:%S") rowdatetime = thetimezone.localize(rowdatetime).astimezone(utc) - starttimeunix = mktime(rowdatetime.utctimetuple()) + starttimeunix = arrow.get(rowdatetime).timestamp + #starttimeunix = mktime(rowdatetime.utctimetuple()) try: @@ -4782,8 +4788,9 @@ def workout_downloadwind_view(request,id=0, avgtime = int(rowdata.df['TimeStamp (sec)'].mean()-rowdata.df.ix[0,'TimeStamp (sec)']) startdatetime = dateutil.parser.parse("{}, {}".format(row.date, row.starttime)) - - starttimeunix = int(mktime(startdatetime.utctimetuple())) + + starttimeunix = int(arrow.get(startdatetime).timestamp) + #starttimeunix = int(mktime(startdatetime.utctimetuple())) avgtime = starttimeunix+avgtime winddata = get_wind_data(avglat,avglon,avgtime) windspeed = winddata[0] @@ -4852,7 +4859,8 @@ def workout_downloadmetar_view(request,id=0, startdatetime = dateutil.parser.parse("{}, {}".format(row.date, row.starttime)) - starttimeunix = int(mktime(startdatetime.utctimetuple())) + starttimeunix = arrow.get(startdatetime).timestamp + #starttimeunix = int(mktime(startdatetime.utctimetuple())) avgtime = starttimeunix+avgtime winddata = get_metar_data(airportcode,avgtime) windspeed = winddata[0] From e208f23ac9e8682792011ca1ddf17805a9af8e7f Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Mon, 4 Sep 2017 14:52:22 +0200 Subject: [PATCH 8/8] added navionics (needs to be tested on production) --- rowers/interactiveplots.py | 107 +++++++++++++++++++++ rowers/templates/basebase.html | 3 + rowers/urls.py | 1 + rowers/views.py | 169 +++++++++++++++++++++++++++++++++ templates/basebase.html | 4 +- 5 files changed, 283 insertions(+), 1 deletion(-) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 408f6ab2..71674fbb 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -729,6 +729,8 @@ def leaflet_chart(lat,lon,name=""): id: 'mapbox.outdoors' }}); + + var mymap = L.map('map_canvas', {{ center: [{latmean}, {lonmean}], zoom: 13, @@ -777,6 +779,111 @@ def leaflet_chart(lat,lon,name=""): + return script,div + +def leaflet_chart2(lat,lon,name=""): + if lat.empty or lon.empty: + return [0,"invalid coordinate data"] + + latmean = lat.mean() + lonmean = lon.mean() + latbegin = lat[lat.index[0]] + longbegin = lon[lon.index[0]] + latend = lat[lat.index[-1]] + longend = lon[lon.index[-1]] + + coordinates = zip(lat,lon) + + scoordinates = "[" + + for x,y in coordinates: + scoordinates += """[{x},{y}], + """.format( + x=x, + y=y + ) + + scoordinates += "]" + + script = """ + + """.format( + latmean=latmean, + lonmean=lonmean, + latbegin = latbegin, + latend=latend, + longbegin=longbegin, + longend=longend, + scoordinates=scoordinates, + ) + + div = """ +

 

+ """ + + + return script,div def googlemap_chart(lat,lon,name=""): diff --git a/rowers/templates/basebase.html b/rowers/templates/basebase.html index 1e3cdb3a..9b2d9e79 100644 --- a/rowers/templates/basebase.html +++ b/rowers/templates/basebase.html @@ -17,6 +17,9 @@ + + + diff --git a/rowers/urls.py b/rowers/urls.py index 3f6f005d..0bc81cb6 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -187,6 +187,7 @@ urlpatterns = [ url(r'^workout/compare2/(?P\d+)/(?P\d+)/(?P\w+.*)/(?P\w+.*)/$',views.workout_comparison_view), url(r'^workout/compare/(?P\d+)/(?P\d+-\d+-\d+)/(?P\w+.*)$',views.workout_comparison_list), url(r'^workout/(?P\d+)/edit$',views.workout_edit_view), + url(r'^workout/(?P\d+)/navionics$',views.workout_edit_view_navionics), url(r'^workout/(?P\d+)/setprivate$',views.workout_setprivate_view), url(r'^workout/(?P\d+)/updatecp$',views.workout_update_cp_view), url(r'^workout/(?P\d+)/makepublic$',views.workout_makepublic_view), diff --git a/rowers/views.py b/rowers/views.py index 709e6d54..fe3635c0 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -6405,6 +6405,175 @@ def workout_edit_view(request,id=0,message="",successmessage=""): return HttpResponseRedirect(url) +# The basic edit page +@login_required() +def workout_edit_view_navionics(request,id=0,message="",successmessage=""): + request.session[translation.LANGUAGE_SESSION_KEY] = USER_LANGUAGE + request.session['referer'] = absolute(request)['PATH'] + + + try: + # check if valid ID exists (workout exists) + row = Workout.objects.get(id=id) + form = WorkoutForm(instance=row) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + + if request.method == 'POST': + # Form was submitted + form = WorkoutForm(request.POST) + if form.is_valid(): + # Get values from form + name = form.cleaned_data['name'] + date = form.cleaned_data['date'] + starttime = form.cleaned_data['starttime'] + workouttype = form.cleaned_data['workouttype'] + duration = form.cleaned_data['duration'] + distance = form.cleaned_data['distance'] + notes = form.cleaned_data['notes'] + thetimezone = form.cleaned_data['timezone'] + try: + boattype = request.POST['boattype'] + except KeyError: + boattype = Workout.objects.get(id=id).boattype + try: + privacy = request.POST['privacy'] + except KeyError: + privacy = Workout.objects.get(id=id).privacy + try: + rankingpiece = form.cleaned_data['rankingpiece'] + except KeyError: + rankingpiece =- Workout.objects.get(id=id).rankingpiece + + startdatetime = (str(date) + ' ' + str(starttime)) + startdatetime = datetime.datetime.strptime(startdatetime, + "%Y-%m-%d %H:%M:%S") + startdatetime = timezone.make_aware(startdatetime) + startdatetime = startdatetime.astimezone(pytz.timezone(thetimezone)) + + + # check if user is owner of this workout + if checkworkoutuser(request.user,row): + row.name = name + row.date = date + row.starttime = starttime + row.startdatetime = startdatetime + row.workouttype = workouttype + row.notes = notes + row.duration = duration + row.distance = distance + row.boattype = boattype + row.privacy = privacy + row.rankingpiece = rankingpiece + row.timezone = thetimezone + try: + row.save() + except IntegrityError: + pass + # change data in csv file + + r = rdata(row.csvfilename) + if r == 0: + return HttpResponse("Error: CSV Data File Not Found") + r.rowdatetime = startdatetime + r.write_csv(row.csvfilename,gzip=True) + dataprep.update_strokedata(id,r.df) + successmessage = "Changes saved" + messages.info(request,successmessage) + url = reverse(workout_edit_view, + kwargs = { + 'id':str(row.id), + }) + response = HttpResponseRedirect(url) + else: + message = "You are not allowed to change this workout" + messages.error(request,message) + url = reverse(workouts_view) + + response = HttpResponseRedirect(url) + + #else: # form not POSTed + form = WorkoutForm(instance=row) + + + try: + row = Workout.objects.get(id=id) + except Workout.DoesNotExist: + raise Http404("Workout doesn't exist") + + g = GraphImage.objects.filter(workout=row).order_by("-creationdatetime") + # check if user is owner of this workout + + comments = WorkoutComment.objects.filter(workout=row) + + aantalcomments = len(comments) + + if (checkworkoutuser(request.user,row)==False): + raise Http404("You are not allowed to edit this workout") + + # create interactive plot + f1 = row.csvfilename + u = row.user.user + r = getrower(u) + rowdata = rdata(f1) + hascoordinates = 1 + if rowdata != 0: + try: + latitude = rowdata.df[' latitude'] + if not latitude.std(): + hascoordinates = 0 + except KeyError,AttributeError: + hascoordinates = 0 + + else: + hascoordinates = 0 + + + if hascoordinates: + mapscript,mapdiv = leaflet_chart2(rowdata.df[' latitude'], + rowdata.df[' longitude'], + row.name) + + #res = googlemap_chart(rowdata.df[' latitude'], + # rowdata.df[' longitude'], + # row.name) + #gmscript = res[0] + #gmdiv = res[1] + + else: + mapscript = "" + mapdiv = "" + + + # render page + if (len(g)<=3): + return render(request, 'workout_form.html', + {'form':form, + 'workout':row, + 'teams':get_my_teams(request.user), + 'graphs1':g[0:3], + 'mapscript':mapscript, + 'aantalcomments':aantalcomments, + 'mapdiv':mapdiv, + }) + + else: + return render(request, 'workout_form.html', + {'form':form, + 'teams':get_my_teams(request.user), + 'workout':row, + 'graphs1':g[0:3], + 'graphs2':g[3:6], + 'mapscript':mapscript, + 'aantalcomments':aantalcomments, + 'mapdiv':mapdiv, + }) + + + return HttpResponseRedirect(url) + + + # Create the chart image with wind corrected pace (OTW) @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def workout_add_otw_powerplot_view(request,id): diff --git a/templates/basebase.html b/templates/basebase.html index 65d611f9..a627ad15 100644 --- a/templates/basebase.html +++ b/templates/basebase.html @@ -32,9 +32,11 @@ {% block meta %} {% endblock %} {% leaflet_js %} {% leaflet_css %} + + {% analytical_head_bottom %} - + {% analytical_body_top %} {% block body_top %}{% endblock %}