diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 07c4be48..900f46aa 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -28,6 +28,7 @@ from rowingdata import ( ) from rowers.models import Team +from rowers.metrics import axes import os import zipfile @@ -363,7 +364,7 @@ def save_workout_database(f2,r,dosmooth=True,workouttype='rower', velo = 500./pace f = row.df['TimeStamp (sec)'].diff().mean() - if f !=0: + if f !=0 and not np.isnan(f): windowsize = 2*(int(10./(f)))+1 else: windowsize = 1 @@ -899,6 +900,13 @@ def prepmultipledata(ids,verbose=False): # Read a set of columns for a set of workout ids, returns data as a # pandas dataframe def read_cols_df_sql(ids,columns): + # drop columns that are not in offical list + axx = [ax[0] for ax in axes] + for c in columns: + if not c in axx: + columns.remove(c) + print c,'aap' + columns = list(columns)+['distance','spm'] columns = [x for x in columns if x != 'None'] columns = list(set(columns)) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 0fe5bfe6..d3eeefdf 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -82,6 +82,7 @@ def interactive_forcecurve(theworkouts,workstrokesonly=False): 'workoutstate','driveenergy'] rowdata = dataprep.getsmallrowdata_db(columns,ids=ids) + rowdata.dropna(axis=1,how='all',inplace=True) rowdata.dropna(axis=0,how='any',inplace=True) @@ -369,6 +370,8 @@ def interactive_histoall(theworkouts): ids = [int(w.id) for w in theworkouts] rowdata = dataprep.getsmallrowdata_db(['power'],ids=ids,doclean=True) + + rowdata.dropna(axis=0,how='any',inplace=True) if rowdata.empty: @@ -802,6 +805,7 @@ def interactive_chart(id=0,promember=0): columns = ['time','pace','hr','fpace','ftime'] datadf = dataprep.getsmallrowdata_db(columns,ids=[id]) + datadf.dropna(axis=0,how='any',inplace=True) row = Workout.objects.get(id=id) if datadf.empty: @@ -883,6 +887,17 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, columns = [xparam,yparam1,yparam2,'spm','driveenergy','distance'] datadf = dataprep.getsmallrowdata_db(columns,ids=ids,doclean=False) + try: + tests = rowdata[yparam2] + except KeyError: + yparam2 = 'None' + + try: + tests = rowdata[yparam1] + except KeyError: + yparam1 = 'None' + + yparamname1 = axlabels[yparam1] if yparam2 != 'None': yparamname2 = axlabels[yparam2] @@ -1167,6 +1182,16 @@ def interactive_flex_chart2(id=0,promember=0, rowdata = dataprep.getsmallrowdata_db(columns,ids=[id],doclean=True, workstrokesonly=workstrokesonly) + try: + tests = rowdata[yparam2] + except KeyError: + yparam2 = 'None' + + try: + tests = rowdata[yparam1] + except KeyError: + yparam1 = 'None' + rowdata.dropna(axis=1,how='all',inplace=True) rowdata.dropna(axis=0,how='any',inplace=True) diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index 5fd018c4..1323f03b 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -14,6 +14,7 @@ import time import math from math import sin,cos,atan2,sqrt import os,sys +import gzip # Django from django.shortcuts import render_to_response @@ -230,6 +231,13 @@ def createstravaworkoutdata(w): row = rowingdata(filename) tcxfilename = filename[:-4]+'.tcx' row.exporttotcx(tcxfilename,notes=w.notes) + gzfilename = tcxfilename+'.gz' + with file(tcxfilename,'rb') as inF: + s = inF.read() + with gzip.GzipFile(gzfilename,'wb') as outF: + outF.write(s) + os.remove(tcxfilename) + return gzfilename except: tcxfilename = 0 @@ -241,7 +249,7 @@ def handle_stravaexport(f2,workoutname,stravatoken,description=''): # w = Workout.objects.get(id=workoutid) client = stravalib.Client(access_token=stravatoken) - act = client.upload_activity(f2,'tcx',name=workoutname) + act = client.upload_activity(f2,'tcx.gz',name=workoutname) try: res = act.wait(poll_interval=5.0,timeout=30) message = 'Workout successfully synchronized to Strava' diff --git a/rowers/templates/400.html b/rowers/templates/400.html index 43d7e090..025dfc60 100644 --- a/rowers/templates/400.html +++ b/rowers/templates/400.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "basenofilters.html" %} {% load staticfiles %} {% load rowerfilters %} diff --git a/rowers/templates/403.html b/rowers/templates/403.html index 316b4872..3a3d7df7 100644 --- a/rowers/templates/403.html +++ b/rowers/templates/403.html @@ -1,4 +1,4 @@ -{% extends "base.html" %} +{% extends "basenofilters.html" %} {% load staticfiles %} {% load rowerfilters %} diff --git a/rowers/templates/404.html b/rowers/templates/404.html index 0116bd84..33fd4812 100644 --- a/rowers/templates/404.html +++ b/rowers/templates/404.html @@ -1,6 +1,5 @@ -{% extends "base.html" %} +{% extends "basenofilters.html" %} {% load staticfiles %} -{% load rowerfilters %} {% block title %}Change Workout {% endblock %} diff --git a/rowers/templates/500.html b/rowers/templates/500.html index 258d606b..d60793eb 100644 --- a/rowers/templates/500.html +++ b/rowers/templates/500.html @@ -1,6 +1,5 @@ -{% extends "base.html" %} +{% extends "basenofilters.html" %} {% load staticfiles %} -{% load rowerfilters %} {% block title %}Change Workout {% endblock %} diff --git a/rowers/templates/base.html b/rowers/templates/base.html index 8e6487a2..77fa6213 100644 --- a/rowers/templates/base.html +++ b/rowers/templates/base.html @@ -1,149 +1,9 @@ -{% load cookielaw_tags %} -{% load analytical %} -{% load rowerfilters %} - - -
- - {% analytical_head_top %} - {% if GOOGLE_ANALYTICS_PROPERTY_ID %} - {% include "ga.html" %} - {% endif %} - - +{% extends "basebase.html" %} +{% block filters %} + {% load rowerfilters %} +{% endblock %} - - - - - - - - 
- {% endif %} -- Import -
- Import workouts from Strava, SportTracks, and C2 logbook - {% else %} -- {% endif %} -
- Workouts -
- See your list of workouts - {% else %} -- {% endif %} -
- Graphs -
- See your most recent charts - {% else %} -- {% endif %} -
- Analysis -
- Analysis of workouts over a period of time - {% else %} -- {% endif %} -
 
+ {% endif %} ++ Import +
+ Import workouts from Strava, SportTracks, and C2 logbook + {% else %} ++ {% endif %} +
+ Workouts +
+ See your list of workouts + {% else %} ++ {% endif %} +
+ Graphs +
+ See your most recent charts + {% else %} ++ {% endif %} +
+ Analysis +
+ Analysis of workouts over a period of time + {% else %} ++ {% endif %} +
 
- {% endif %} -- Import -
- Import workouts from Strava, SportTracks, and C2 logbook - {% else %} -- {% endif %} -
- Workouts -
- See your list of workouts - {% else %} -- {% endif %} -
- Graphs -
- See your most recent charts - {% else %} -- {% endif %} -
- Analysis -
- Analysis of workouts over a period of time - {% else %} -- {% endif %} -
{% endif %} -
+ {% endif %} +{% endblock %} + +{% block content %} + +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 8454c943..219baa58 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -110,6 +110,7 @@ urlpatterns = [ url(r'^api-docs$', views.schema_view), url(r'^api-auth/', include('rest_framework.urls', namespace='rest_framework')), url(r'^api/workouts/(?P
+HTTP Error 400 Bad Request. +
++ Access forbidden. You probably tried to access functionality on a workout + or chart that is not owned by you. +
++We could not find the page on our server. +
++ The site reported an internal server error. The site developer has been + notified automatically with a full error report. You can help the developer + by reporting an issue on Bitbucket using the button below. +
+ ++ {% endif %} +{% endblock %} + +{% block content %} + +{% endblock %} diff --git a/templates/basebase.html b/templates/basebase.html new file mode 100644 index 00000000..a97bbb60 --- /dev/null +++ b/templates/basebase.html @@ -0,0 +1,219 @@ +{% load cookielaw_tags %} +{% load analytical %} +{% block filters %} +{% endblock %} + + + + + {% analytical_head_top %} + {% if GOOGLE_ANALYTICS_PROPERTY_ID %} + {% include "ga.html" %} + {% endif %} + + + + + + + + + + +
 
+ {% endif %} ++ Import +
+ Import workouts from Strava, SportTracks, and C2 logbook + {% else %} ++ {% endif %} +
+ Workouts +
+ See your list of workouts + {% else %} ++ {% endif %} +
+ Graphs +
+ See your most recent charts + {% else %} ++ {% endif %} +
+ Analysis +
+ Analysis of workouts over a period of time + {% else %} ++ {% endif %} +
+ {% endif %} +{% endblock %} + + +{% block body_bottom %} +
+ {% endif %} +{% endblock %} + +{% block content %} + +{% endblock %}