diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 2422a9b9..83cf6b15 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -738,7 +738,10 @@ def fetchcp(rower,theworkouts,table='cpdata'): # create a new workout from manually entered data -def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): +def create_row_df(r,distance,duration,startdatetime,workouttype='rower', + avghr=None,avgpwr=None,avgspm=None, + rankingpiece = False, + title='Manual entry',notes='',weightcategory='hwt'): @@ -751,11 +754,14 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): totalseconds += duration.second totalseconds += duration.microsecond/1.e6 - try: - spm = 60.*nr_strokes/totalseconds - except ZeroDivisionError: - spm = 20. - + if not avgspm: + try: + spm = 60.*nr_strokes/totalseconds + except ZeroDivisionError: + spm = 20. + else: + spm = avgspm + step = totalseconds/float(nr_strokes) elapsed = np.arange(nr_strokes)*totalseconds/(float(nr_strokes-1)) @@ -774,9 +780,15 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): except ZeroDivisionError: velo = 2.4 power = 2.8*velo**3 + elif avgpwr is not None: + power = avgpwr else: power = 0 + if avghr is not None: + hr = avghr + else: + hr = 0 df = pd.DataFrame({ 'TimeStamp (sec)': unixtime, @@ -785,6 +797,7 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): ' Stroke500mPace (sec/500m)':pace, ' ElapsedTime (sec)':elapsed, ' Power (watts)':power, + ' HRCur (bpm)':hr, }) timestr = strftime("%Y%m%d-%H%M%S") @@ -797,10 +810,11 @@ def create_row_df(r,distance,duration,startdatetime,workouttype='rower'): row.write_csv(csvfilename, gzip = True) id, message = save_workout_database(csvfilename, r, -# title=title, -# notes=notes, + title=title, + notes=notes, + rankingpiece=rankingpiece, dosmooth=False, -# workouttype=workouttype, + workouttype=workouttype, consistencychecks=False, totaltime=totalseconds) @@ -814,6 +828,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', dosummary=True, title='Workout', workoutsource='unknown', notes='', totaldist=0, totaltime=0, + rankingpiece=False, summary='', makeprivate=False, oarlength=2.89, inboard=0.88, @@ -1000,6 +1015,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', weightcategory=r.weightcategory, starttime=workoutstarttime, workoutsource=workoutsource, + rankingpiece=rankingpiece, forceunit=forceunit, csvfilename=f2, notes=notes, summary=summary, maxhr=maxhr, averagehr=averagehr, @@ -1014,10 +1030,6 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', w.startdatetime = timezone.now() w.save() - if is_ranking_piece(w): - w.rankingpiece = True - w.save() - if privacy == 'visible': ts = Team.objects.filter(rower=r) for t in ts: diff --git a/rowers/forms.py b/rowers/forms.py index 8a07fa23..d470ab2a 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -30,7 +30,11 @@ class EmailForm(forms.Form): botcheck = forms.CharField(max_length=5) message = forms.CharField() - + +class MetricsForm(forms.Form): + avghr = forms.IntegerField(required=False,label='Average Heart Rate') + avgpwr = forms.IntegerField(required=False,label='Average Power') + avgspm = forms.FloatField(required=False,label='Average SPM') # Upload the CrewNerd Summary CSV class CNsummaryForm(forms.Form): diff --git a/rowers/models.py b/rowers/models.py index 93a1e9cd..1db6d745 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2067,7 +2067,7 @@ class Workout(models.Model): user = models.ForeignKey(Rower) team = models.ManyToManyField(Team,blank=True) plannedsession = models.ForeignKey(PlannedSession, blank=True,null=True) - name = models.CharField(max_length=150) + name = models.CharField(max_length=150,blank=True,null=True) date = models.DateField() workouttype = models.CharField(choices=workouttypes,max_length=50, verbose_name='Exercise/Boat Class') diff --git a/rowers/templates/manualadd.html b/rowers/templates/manualadd.html index be698545..f1baf6f2 100644 --- a/rowers/templates/manualadd.html +++ b/rowers/templates/manualadd.html @@ -36,7 +36,7 @@ $('#id_workouttype').change(); {% endblock %} {% block main %} -
diff --git a/rowers/views.py b/rowers/views.py index 7efff095..47b71963 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -49,6 +49,7 @@ from rowers.forms import ( VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm, RaceResultFilterForm,PowerIntervalUpdateForm,FlexAxesForm, FlexOptionsForm,DataFrameColumnsForm,OteWorkoutTypeForm, + MetricsForm, ) from django.core.urlresolvers import reverse, reverse_lazy @@ -3294,12 +3295,26 @@ def histo(request,theuser=0, def addmanual_view(request): r = Rower.objects.get(user=request.user) + breadcrumbs = [ + { + 'url':'/rowers/list-workouts', + 'name':'Workouts' + }, + { + 'url':reverse(addmanual_view), + 'name': 'Add Manual Entry' + }, + ] + if request.method == 'POST': # Form was submitted form = WorkoutForm(request.POST) - if form.is_valid(): + metricsform = MetricsForm(request.POST) + if form.is_valid() and metricsform.is_valid(): # Get values from form name = form.cleaned_data['name'] + if name == '': + name = 'Manual Entry' date = form.cleaned_data['date'] starttime = form.cleaned_data['starttime'] workouttype = form.cleaned_data['workouttype'] @@ -3309,6 +3324,9 @@ def addmanual_view(request): notes = form.cleaned_data['notes'] thetimezone = form.cleaned_data['timezone'] private = form.cleaned_data['private'] + avghr = metricsform.cleaned_data['avghr'] + avgpwr = metricsform.cleaned_data['avgpwr'] + avgspm = metricsform.cleaned_data['avgspm'] try: boattype = request.POST['boattype'] except KeyError: @@ -3336,12 +3354,17 @@ def addmanual_view(request): ) + id,message = dataprep.create_row_df(r, distance, -# weightcategory, duration,startdatetime, -# title = name, -# notes=notes, + weightcategory=weightcategory, + avghr=avghr, + rankingpiece=rankingpiece, + avgpwr=avgpwr, + avgspm=avgspm, + title = name, + notes=notes, workouttype=workouttype) @@ -3351,7 +3374,7 @@ def addmanual_view(request): if id: w = Workout.objects.get(id=id) - w.rankingpiece = rankingpiece or is_ranking_piece(w) + w.rankingpiece = rankingpiece w.privacy = privacy w.weightcategory = weightcategory w.notes = notes @@ -3360,7 +3383,13 @@ def addmanual_view(request): w.boattype = boattype w.save() messages.info(request,'New workout created') - + else: + return render(request,'manualadd.html', + {'form':form, + 'metricsform':metricsform, + 'breadcrumbs':breadcrumbs, + 'active':'nav-workouts', + }) initial = { 'workouttype':'rower', @@ -3372,9 +3401,12 @@ def addmanual_view(request): } form = WorkoutForm(initial=initial) + metricsform = MetricsForm() return render(request,'manualadd.html', {'form':form, + 'metricsform':metricsform, + 'breadcrumbs':breadcrumbs, 'active':'nav-workouts', })