diff --git a/rowers/dataprep.py b/rowers/dataprep.py index e738b735..4ff0fe18 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -1605,8 +1605,9 @@ def getsmallrowdata_db(columns, ids=[], doclean=True, workstrokesonly=True): data[c] = cdata2 - except KeyError: + except (KeyError, AttributeError): data[c] = 0 + # convert newtons @@ -2216,7 +2217,7 @@ def dataprep(rowdatadf, id=0, bands=True, barchart=True, otwpower=True, def workout_trimp(workout): r = workout.user df,row = getrowdata_db(id=workout.id) - df = clean_df_stats(df) + df = clean_df_stats(df,workstrokesonly=False) if df.empty: df,row = getrowdata_db(id=workout.id) df = clean_df_stats(df,workstrokesonly=False) @@ -2228,7 +2229,7 @@ def workout_trimp(workout): def workout_rscore(w): r = w.user df,row = getrowdata_db(id=w.id) - df = clean_df_stats(df) + df = clean_df_stats(df,workstrokesonly=False) if df.empty: df,row = getrowdata_db(id=w.id) df = clean_df_stats(df,workstrokesonly=False) @@ -2248,4 +2249,4 @@ def workout_rscore(w): else: tss = 0 - return tss + return tss,normp diff --git a/rowers/forms.py b/rowers/forms.py index b6191619..a63d62cb 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -325,12 +325,15 @@ class UpdateWindForm(forms.Form): # Form to select a data range to show workouts from a certain time period class DateRangeForm(forms.Form): - startdate = forms.DateField(initial=timezone.now()-datetime.timedelta(days=365), - widget=SelectDateWidget(years=range(1990,2050)), - label='Start Date') - enddate = forms.DateField(initial=timezone.now(), - widget=SelectDateWidget(years=range(1990,2050)), - label='End Date') + startdate = forms.DateField( + initial=timezone.now()-datetime.timedelta(days=365), + # widget=SelectDateWidget(years=range(1990,2050)), + widget=AdminDateWidget(), + label='Start Date') + enddate = forms.DateField( + initial=timezone.now(), + widget=AdminDateWidget(), + label='End Date') class Meta: fields = ['startdate','enddate'] @@ -393,11 +396,17 @@ class RegistrationFormSex(RegistrationFormUniqueEmail): ('lwt','light-weight'), ) - birthdate = forms.DateTimeField(widget=SelectDateWidget( - years=range(timezone.now().year-100,timezone.now().year-10)), - initial = datetime.date(year=1970, - month=4, - day=15)) + birthdate = forms.DateTimeField( + widget=SelectDateWidget(), + initial = datetime.date(year=1970, + month=4, + day=15)) + + def clean_birthdate(self): + dob = self.cleaned_data['birthdate'] + age = (timezone.now() - dob).days/365 + if age < 16: + raise forms.ValidationError('Must be at least 16 years old to register') sex = forms.ChoiceField(required=True, choices=sexcategories, diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index 7f1b9af3..cbe08d1e 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -2182,7 +2182,14 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, try: datadf['x1'] = datadf.ix[:,xparam] except KeyError: - datadf['x1'] = datadf['distance'] + try: + datadf['x1'] = datadf['distance'] + except KeyError: + try: + datadf['x1'] = datadf['time'] + except KeyError: + return ['','

No non-zero data in selection

','',''] + try: datadf['y1'] = datadf.ix[:,yparam1] except KeyError: @@ -2198,7 +2205,7 @@ def interactive_cum_flex_chart2(theworkouts,promember=0, else: datadf['y2'] = datadf['y1'] - + if xparam=='distance': xaxmax = datadf['x1'].max() xaxmin = datadf['x1'].min() diff --git a/rowers/models.py b/rowers/models.py index 60dbce2e..5b30abb6 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -825,7 +825,8 @@ class PlannedSession(models.Model): manager = models.ForeignKey(User) - name = models.CharField(max_length=150,blank=True) + name = models.CharField(max_length=150,blank=True, + verbose_name='Name') comment = models.TextField(max_length=500,blank=True, ) @@ -913,8 +914,8 @@ class PlannedSessionForm(ModelForm): widgets = { 'comment': forms.Textarea, - 'startdate': DateInput(), - 'enddate': DateInput(), + 'startdate': AdminDateWidget(), + 'enddate': AdminDateWidget(), } @@ -1163,7 +1164,7 @@ class WorkoutForm(ModelForm): model = Workout fields = ['name','date','starttime','timezone','duration','distance','workouttype','notes','privacy','rankingpiece','boattype'] widgets = { - 'date': DateInput(), + 'date': AdminDateWidget(), 'notes': forms.Textarea, 'duration': forms.TimeInput(format='%H:%M:%S.%f'), } diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 6168cb56..3cc15766 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -79,13 +79,16 @@ def get_session_metrics(ps): distance = [] firstname = [] lastname = [] + completedate = [] + status = [] for r in rowers: rscorev = 0 trimpv = 0 durationv = 0 distancev = 0 - + completedatev = '' + statusv = 0 ws = Workout.objects.filter(user=r,plannedsession=ps) if len(ws) != 0: @@ -93,9 +96,10 @@ def get_session_metrics(ps): distancev += w.distance durationv += timefield_to_seconds_duration(w.duration) trimpv += dataprep.workout_trimp(w) - rscorev += dataprep.workout_rscore(w) - - + rscorev += dataprep.workout_rscore(w)[0] + + ratio,statusv = is_session_complete_ws(ws,ps) + completedatev = ws[0].date.strftime('%Y-%b-%d') durationv /= 60. trimp.append(int(trimpv)) @@ -104,6 +108,8 @@ def get_session_metrics(ps): rscore.append(int(rscorev)) firstname.append(r.user.first_name) lastname.append(r.user.last_name) + status.append(statusv) + completedate.append(completedatev) thedict = { 'first_name':firstname, @@ -111,19 +117,14 @@ def get_session_metrics(ps): 'duration':duration, 'distance':distance, 'rscore':rscore, - 'trimp':trimp + 'trimp':trimp, + 'completedate':completedate, + 'status':status, } return thedict -def is_session_complete(r,ps): - status = 'not done' - - if r not in ps.rower.all(): - return 0,'not assigned' - - ws = Workout.objects.filter(user=r,plannedsession=ps) - +def is_session_complete_ws(ws,ps): if len(ws)==0: today = date.today() if today > ps.enddate: @@ -144,7 +145,7 @@ def is_session_complete(r,ps): trimp = dataprep.workout_trimp(w) score += trimp elif ps.sessionmode == 'rScore': - rscore = dataprep.workout_rscore(w) + rscore = dataprep.workout_rscore(w)[0] score += rscore value = ps.sessionvalue @@ -195,6 +196,18 @@ def is_session_complete(r,ps): else: return ratio,status + +def is_session_complete(r,ps): + status = 'not done' + + if r not in ps.rower.all(): + return 0,'not assigned' + + ws = Workout.objects.filter(user=r,plannedsession=ps) + + return is_session_complete_ws(ws,ps) + + def rank_results(ps): return 1 diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index 97cfb0a9..b2d643cd 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -125,3 +125,47 @@ {% endblock %} + +{% block scripts %} + + +{% endblock %} diff --git a/rowers/templates/plannedsessionedit.html b/rowers/templates/plannedsessionedit.html index 306028b8..b01ae7d7 100644 --- a/rowers/templates/plannedsessionedit.html +++ b/rowers/templates/plannedsessionedit.html @@ -11,8 +11,8 @@
-

Edit Session {{ thesession.name }}

-
+

Edit Session

+