diff --git a/rowers/templates/.#cum_flex.html b/rowers/templates/.#cum_flex.html new file mode 100644 index 00000000..01488739 --- /dev/null +++ b/rowers/templates/.#cum_flex.html @@ -0,0 +1 @@ +E408191@CZ27LT9RCGN72.648792:1509824931 \ No newline at end of file diff --git a/rowers/templates/boxplot.html b/rowers/templates/boxplot.html index 6e287090..346a780e 100644 --- a/rowers/templates/boxplot.html +++ b/rowers/templates/boxplot.html @@ -11,7 +11,8 @@ Bokeh.set_log_level("info"); -{{ interactiveplot |safe }} +
+
+ + + {% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index cf7db081..ce1d4045 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -296,6 +296,7 @@ urlpatterns = [ url(r'^user-boxplot/(?P\d+)$',views.boxplot_view), url(r'^user-boxplot/$',views.boxplot_view), url(r'^user-boxplot$',views.boxplot_view), + url(r'^user-boxplot-data$',views.boxplot_view_data), url(r'^user-multiflex/(?P\d+)$',views.multiflex_view), url(r'^user-multiflex/$',views.multiflex_view), url(r'^user-multiflex$',views.multiflex_view), diff --git a/rowers/views.py b/rowers/views.py index c26c5b3e..acf55c49 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -4861,6 +4861,92 @@ def user_boxplot_select(request, 'teams':get_my_teams(request.user), }) +@user_passes_test(ispromember,login_url="/",redirect_field_name=None) +def boxplot_view_data(request,userid=0, + options={ + 'includereststrokes':False, + 'spmmin':15, + 'spmmax':55, + 'workmin':0, + 'workmax':1500, + 'ids':[], + 'userid':0, + 'plotfield':'spm', + }): + + if 'options' in request.session: + options = request.session['options'] + + includereststrokes = options['includereststrokes'] + spmmin = options['spmmin'] + spmmax = options['spmmax'] + workmin = options['workmin'] + workmax = options['workmax'] + ids = options['ids'] + userid = options['userid'] + plotfield = options['plotfield'] + + workstrokesonly = not includereststrokes + + if userid==0: + userid = request.user.id + + workouts = [Workout.objects.get(id=id) for id in ids] + labeldict = { + int(w.id): w.__unicode__() for w in workouts + } + + + datemapping = { + w.id:w.date for w in workouts + } + + + + fieldlist,fielddict = dataprep.getstatsfields() + fieldlist = [plotfield,'workoutid','spm','driveenergy', + 'workoutstate'] + + # prepare data frame + datadf = dataprep.read_cols_df_sql(ids,fieldlist) + + datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) + + datadf = dataprep.filter_df(datadf,'spm',spmmin, + largerthan=True) + datadf = dataprep.filter_df(datadf,'spm',spmmax, + largerthan=False) + datadf = dataprep.filter_df(datadf,'driveenergy',workmin, + largerthan=True) + datadf = dataprep.filter_df(datadf,'driveneergy',workmax, + largerthan=False) + + datadf.dropna(axis=0,how='any',inplace=True) + + datadf['workoutid'].replace(datemapping,inplace=True) + datadf.rename(columns={"workoutid":"date"},inplace=True) + datadf = datadf.sort_values(['date']) + + if userid == 0: + extratitle = '' + else: + u = User.objects.get(id=userid) + extratitle = ' '+u.first_name+' '+u.last_name + + + + script,div = interactive_boxchart(datadf,plotfield, + extratitle=extratitle) + + scripta = script.split('\n')[2:-1] + script = ''.join(scripta) + + + return JSONResponse({ + "script":script, + "div":div, + }) + @user_passes_test(ispromember,login_url="/",redirect_field_name=None) def boxplot_view(request,userid=0, options={ @@ -4895,60 +4981,6 @@ def boxplot_view(request,userid=0, ids = [int(w.id) for w in workouts] request.session['ids'] = ids - labeldict = { - int(w.id): w.__unicode__() for w in workouts - } - - - datemapping = { - w.id:w.date for w in workouts - } - - - - fieldlist,fielddict = dataprep.getstatsfields() - fieldlist = [plotfield,'workoutid','spm','driveenergy', - 'workoutstate'] - - # prepare data frame - datadf = dataprep.read_cols_df_sql(ids,fieldlist) - - datadf = dataprep.clean_df_stats(datadf,workstrokesonly=workstrokesonly) - - datadf = dataprep.filter_df(datadf,'spm',spmmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'spm',spmmax, - largerthan=False) - datadf = dataprep.filter_df(datadf,'driveenergy',workmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'driveneergy',workmax, - largerthan=False) - - datadf.dropna(axis=0,how='any',inplace=True) - - datadf['workoutid'].replace(datemapping,inplace=True) - datadf.rename(columns={"workoutid":"date"},inplace=True) - datadf = datadf.sort_values(['date']) - - if userid == 0: - extratitle = '' - else: - u = User.objects.get(id=userid) - extratitle = ' '+u.first_name+' '+u.last_name - - - - script,div = interactive_boxchart(datadf,plotfield, - extratitle=extratitle) - - - return render(request,'boxplot.html', - {'interactiveplot':script, - 'the_div':div, - 'chartform':chartform, - 'userid':userid, - 'teams':get_my_teams(request.user), - }) else: return HttpResponse("Form is not valid") elif request.method == 'POST' and 'ids' in request.session: @@ -4964,80 +4996,43 @@ def boxplot_view(request,userid=0, workstrokesonly = not includereststrokes ids = request.session['ids'] request.session['ids'] = ids - workouts = dataprep.get_workouts(ids,userid) - if not workouts: - message = 'Error: Workouts in session storage do not belong to this user.' - messages.error(request,message) - url = reverse(user_boxplot_select, - kwargs={ - 'userid':userid, - } - ) - return HttpResponseRedirect(url) - - # workouts = [Workout.objects.get(id=id) for id in ids] - - labeldict = { - int(w.id): w.__unicode__() for w in workouts - } - - datemapping = { - w.id:w.date for w in workouts - } - - fieldlist,fielddict = dataprep.getstatsfields() - fieldlist = [plotfield,'workoutid','spm','driveenergy', - 'workoutstate'] - - # prepare data frame - datadf = dataprep.read_cols_df_sql(ids,fieldlist) - - # dummy values for drive energy - mask = datadf['driveenergy'] == 0 - datadf.loc[mask,'driveenergy'] = 450 - - datadf = dataprep.clean_df_stats(datadf, - workstrokesonly=workstrokesonly) - datadf = dataprep.filter_df(datadf,'spm',spmmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'spm',spmmax, - largerthan=False) - datadf = dataprep.filter_df(datadf,'driveenergy',workmin, - largerthan=True) - datadf = dataprep.filter_df(datadf,'driveneergy',workmax, - largerthan=False) - - datadf.dropna(axis=0,how='any',inplace=True) - - datadf['workoutid'].replace(datemapping,inplace=True) - datadf.rename(columns={"workoutid":"date"},inplace=True) - datadf = datadf.sort_values(['date']) - - if userid == 0: - extratitle = '' - else: - u = User.objects.get(id=userid) - extratitle = ' '+u.first_name+' '+u.last_name - - script,div = interactive_boxchart(datadf,plotfield, - extratitle=extratitle) - - - return render(request,'boxplot.html', - {'interactiveplot':script, - 'the_div':div, - 'chartform':chartform, - 'userid':userid, - 'teams':get_my_teams(request.user), - }) else: return HttpResponse("invalid form") else: url = reverse(user_boxplot_select) return HttpResponseRedirect(url) + div = """ +
+

+

+ Sit Ready! We're counting strokes and loading data +
+

+
+""" + + options['spmmin'] = spmmin + options['spmmax'] = spmmax + options['workmin'] = workmin + options['workmax'] = workmax + options['ids'] = ids + options['userid'] = userid + options['plotfield'] = plotfield + + request.session['options'] = options + + return render(request,'boxplot.html', + {'interactiveplot':'', + 'the_div':div, + 'chartform':chartform, + 'userid':userid, + 'teams':get_my_teams(request.user), + }) + + # List Workouts @login_required() def workouts_view(request,message='',successmessage='',