diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 2422a9b9..7d12f7f7 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: @@ -1028,6 +1040,7 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', barchart=True, otwpower=True, empower=True, inboard=inboard) rscore,normp = workout_rscore(w) + trimp,hrtss = workout_trimp(w) isbreakthrough = False ishard = False diff --git a/rowers/dataprepnodjango.py b/rowers/dataprepnodjango.py index b164fbb1..da384fbd 100644 --- a/rowers/dataprepnodjango.py +++ b/rowers/dataprepnodjango.py @@ -853,6 +853,9 @@ def update_agegroup_db(age,sex,weightcategory,wcdurations,wcpower, delete_agegroup_db(age,sex,weightcategory,debug=debug) + wcdurations = [None if type(y) is float and np.isnan(y) else y for y in wcdurations] + wcpower = [None if type(y) is float and np.isnan(y) else y for y in wcpower] + df = pd.DataFrame( { 'duration':wcdurations, 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/middleware.py b/rowers/middleware.py index 9a44b7fe..736af9c0 100644 --- a/rowers/middleware.py +++ b/rowers/middleware.py @@ -1,3 +1,4 @@ + from django.utils import timezone from rowers.models import Workout, PowerTimeFitnessMetric, Rower import datetime 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/plannedsessions.py b/rowers/plannedsessions.py index 561904b5..9704b281 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -30,6 +30,7 @@ import numpy as np import dataprep import courses import iso8601 +from iso8601 import ParseError from rowers.tasks import handle_check_race_course def get_todays_micro(plan,thedate=date.today()): @@ -400,12 +401,22 @@ def remove_rower_session(r,ps): return 1 -def get_dates_timeperiod(timeperiod,startdatestring='',enddatestring=''): +def get_dates_timeperiod(request,startdatestring='',enddatestring=''): # set start end date according timeperiod + timeperiod = request.GET.get('when') + if not timeperiod: timeperiod = 'thisweek' - + + startdatestring = request.GET.get('startdate') + enddatestring = request.GET.get('enddate') + + if startdatestring and enddatestring: + startdate = dt.datetime.strptime(startdatestring,'%Y-%m-%d').date() + enddate = dt.datetime.strptime(enddatestring,'%Y-%m-%d').date() + return startdate,enddate + daterangetester = re.compile('^(\d+-\d+-\d+)\/(\d+-\d+-\d+)') if timeperiod=='today': diff --git a/rowers/templates/.#plannedsessions_multiclone_select.html b/rowers/templates/.#plannedsessions_multiclone_select.html new file mode 100644 index 00000000..1fc71768 --- /dev/null +++ b/rowers/templates/.#plannedsessions_multiclone_select.html @@ -0,0 +1 @@ +E408191@CZ27LT9RCGN72.15176:1541580768 \ No newline at end of file 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 %} -

Add Workout Manually

+

Add Manual Workout Entry