diff --git a/rowers/forms.py b/rowers/forms.py index 04034c38..d27030bd 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -27,6 +27,10 @@ class CNsummaryForm(forms.Form): class SummaryStringForm(forms.Form): intervalstring = forms.CharField(max_length=255,label='Workout Description') +class StrokeDataForm(forms.Form): + strokedata = forms.CharField(label='payload', + widget=forms.Textarea) + class DocumentsForm(forms.Form): filetypechoices = ( ('csv' , 'Painsled iOS CSV'), diff --git a/rowers/templates/strokedata_form.html b/rowers/templates/strokedata_form.html new file mode 100644 index 00000000..34cabb57 --- /dev/null +++ b/rowers/templates/strokedata_form.html @@ -0,0 +1,25 @@ +{% extends "base.html" %} + +{% block title %}Change Rower {% endblock %} + +{% block content %} + {% if form.errors %} +

+ Please correct the error{{ form.errors|pluralize }} below. +

+ {% endif %} +
+

Stroke Data for workout {{ id }}

+ +
+ + {{ form.as_table }} +
+ {% csrf_token %} +
+ + +
+
+ +{% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 0b740ab7..46c0f9b3 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -164,7 +164,7 @@ urlpatterns = [ url(r'^workout/compare/(?P\d+)/(?P\d+)/(?P\w+.*)/(?P\w+.*)/(?P\w+.*)$',views.workout_comparison_view2), url(r'^workout/compare/(?P\d+)/(?P\d+)/(?P\w+.*)/(?P\w+.*)/$',views.workout_comparison_view2), url(r'^test\_callback',views.rower_process_testcallback), - + url(r'^workout/(\d+)/test\_strokedata$',views.strokedataform), ] if settings.DEBUG: diff --git a/rowers/views.py b/rowers/views.py index 2450589d..5ad543ee 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -15,7 +15,7 @@ from django.utils import timezone,translation from django.core.mail import send_mail, BadHeaderError from rowers.forms import EmailForm, RegistrationForm, RegistrationFormTermsOfService,RegistrationFormUniqueEmail,CNsummaryForm,UpdateWindForm,UpdateStreamForm from rowers.forms import PredictedPieceForm,DateRangeForm,DeltaDaysForm -from rowers.forms import SummaryStringForm,IntervalUpdateForm +from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm from rowers.models import Workout, User, Rower, WorkoutForm from rowers.models import RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm import StringIO @@ -51,7 +51,7 @@ from rowingdata import MysteryParser from rowingdata import painsledDesktopParser,speedcoachParser,ErgStickParser from rowingdata import SpeedCoach2Parser,FITParser,fitsummarydata from rowingdata import make_cumvalues -from rowingdata import summarydata,get_file_type,totimestamp +from rowingdata import summarydata,get_file_type import pandas as pd import numpy as np import matplotlib.pyplot as plt @@ -4479,6 +4479,11 @@ class JSONResponse(HttpResponse): kwargs['content_type'] = 'application/json' super(JSONResponse, self).__init__(content, **kwargs) +def totimestamp(dt, epoch=datetime.datetime(1970,1,1,tzinfo=tz('UTC'))): + td = dt - epoch + # return td.total_seconds() + return (td.microseconds + (td.seconds + td.days * 86400) * 10**6) / 10**6 + def trydf(df,aantal,column): try: s = df[column] @@ -4491,6 +4496,25 @@ def trydf(df,aantal,column): return s +@login_required() +def strokedataform(request,id=0): + if request.method == 'GET': + form = StrokeDataForm() + return render(request, 'strokedata_form.html', + { + 'form':form, + 'id':id, + }) + elif request.method == 'POST': + form = StrokeDataForm() + + return render(request, 'strokedata_form.html', + { + 'form':form, + 'id':id, + }) + + from django.views.decorators.csrf import csrf_exempt @csrf_exempt @login_required() @@ -4515,75 +4539,83 @@ def strokedatajson(request,id): if request.method == 'POST': checkdata,r = dataprep.getrowdata_db(id=row.id) if not checkdata.empty: - return "Not OK" - strokedata = request.POST['strokedata'] + return "Not OK 1" + # strokedata = request.POST['strokedata'] + print request.body + received_json_data = json.loads(request.body) # checking/validating and cleaning try: - strokedata = json.loads(strokedata) + strokedata = json.loads(received_json_data['strokedata']) except: - return HttpResponse("Not OK") + return HttpResponse("Not OK 2") - try: - df = pd.DataFrame(strokedata) - # time, hr, pace, spm, power, drivelength, distance, drivespeed, dragfactor, strokerecoverytime, averagedriveforce, peakdriveforce, lapidx - time = df['time'] - aantal = len(time) - pace = df['pace'] - if len(pace) != aantal: - return "Not OK" - distance = df['distance'] - if len(distance) != aantal: - return "Not OK" + df = pd.DataFrame(strokedata) + df.index = df.index.astype(int) + df.sort_index(inplace=True) + # time, hr, pace, spm, power, drivelength, distance, drivespeed, dragfactor, strokerecoverytime, averagedriveforce, peakdriveforce, lapidx + time = df['timesecs'] + aantal = len(time) + pace = df['pseconds'] + if len(pace) != aantal: + return "Not OK" + distance = df['distance'] + if len(distance) != aantal: + return "Not OK 3" + + spm = df['spm'] + if len(spm) != aantal: + return "Not OK 4" - spm = df['spm'] - if len(spm) != aantal: - return "Not OK" - - res = dataprep.testdata(time,distance,pace,spm) - if not res: - return HttpResponse("Not OK") + res = dataprep.testdata(time,distance,pace,spm) + if not res: + return HttpResponse("Not OK 5") - power = trydf(df,aantal,'power') - drivelength = trydf(df,aantal,'drivelength') - drivespeed = trydf(df,aantal,'drivespeed') - dragfactor = trydf(df,aantal,'dragfactor') - drivetime = trydf(df,aantal,'drivetime') - strokerecoverytime = trydf(df,aantal,'strokerecoverytime') - averagedriveforce = trydf(df,aantal,'averagedriveforce') - peakdriveforce = trydf(df,aantal,'peakdriveforce') - lapidx = trydf(df,aantal,'lapidx') - hr = trydf(df,aantal,'hr') + power = trydf(df,aantal,'power') + drivelength = trydf(df,aantal,'drivelength') + drivespeed = trydf(df,aantal,'drivespeed') + dragfactor = trydf(df,aantal,'dragfactor') + drivetime = trydf(df,aantal,'drivetime') + strokerecoverytime = trydf(df,aantal,'strokerecoverytime') + averagedriveforce = trydf(df,aantal,'averagedriveforce') + peakdriveforce = trydf(df,aantal,'peakdriveforce') + lapidx = trydf(df,aantal,'lapidx') + hr = trydf(df,aantal,'hr') - starttime = totimestamp(row.startdatetime)+time - unixtime = starttime+time + starttime = totimestamp(row.startdatetime)+time + unixtime = starttime+time - data = DataFrame({'TimeStamp (sec)':unixtime, - ' Horizontal (meters)': distance, - ' Cadence (stokes/min)':spm, - ' HRCur (bpm)':hr, - ' DragFactor':dragfactor, - ' Stroke500mPace (sec/500m)':pace, - ' Power (watts)':power, - ' DriveLength (meters)':drivelength, - ' StrokeDistance (meters)':strokedistance, - ' DriveTime (ms)':drivetime, - ' StrokeRecoveryTime (ms)':strokerecoverytime, - ' AverageDriveForce (lbs)':averagedriveforce, - ' PeakDriveForce (lbs)':peakdriveforce, - ' lapIdx':lapidx, - ' ElapsedTime (sec)':time, - }) + data = pd.DataFrame({'TimeStamp (sec)':unixtime, + ' Horizontal (meters)': distance, + ' Cadence (stokes/min)':spm, + ' HRCur (bpm)':hr, + ' DragFactor':dragfactor, + ' Stroke500mPace (sec/500m)':pace, + ' Power (watts)':power, + ' DriveLength (meters)':drivelength, + ' DriveTime (ms)':drivetime, + ' StrokeRecoveryTime (ms)':strokerecoverytime, + ' AverageDriveForce (lbs)':averagedriveforce, + ' PeakDriveForce (lbs)':peakdriveforce, + ' lapIdx':lapidx, + ' ElapsedTime (sec)':time, + }) - timestr = time.strftime("%Y%m%d-%H%M%S") - csvfilename ='media/Import_'+timestr+'.csv' + timestr = row.startdatetime.strftime("%Y%m%d-%H%M%S") + csvfilename ='media/Import_'+timestr+'.csv' + + res = data.to_csv(csvfilename,index_label='index') + row.csvfilename = csvfilename + row.save() - res = df.to_csv(csvfilename,index_label='index') - row.csvfilename = csvfilename - row.save() - datadf = dataprep.dataprep(data,id=row.id,bands=True,barchart=True,otwpower=True) - except: - return HttpResponse("Not OK") + r = Rower.objects.get(user=request.user) + + rr = rrower(hrmax=r.max,hrut2=r.ut2, + hrut1=r.ut1,hrat=r.at, + hrtr=r.tr,hran=r.an,ftp=r.ftp) + rowdata = rdata(row.csvfilename,rower=rr).df + + datadf = dataprep.dataprep(rowdata,id=row.id,bands=True,barchart=True,otwpower=True) # mangling #