From e7b3c7df0fa3058253c14d0d294adfa09e74ec5d Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Tue, 5 May 2020 17:58:30 +0200 Subject: [PATCH] prototype history page --- rowers/forms.py | 24 +++++++++++++++++++++++ rowers/interactiveplots.py | 2 ++ rowers/templates/history.html | 15 ++++++++++++-- rowers/views/analysisviews.py | 37 ++++++++++++++++++++++++++++++++++- rowers/views/statements.py | 2 +- 5 files changed, 76 insertions(+), 4 deletions(-) diff --git a/rowers/forms.py b/rowers/forms.py index 3532be60..312c6d65 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -143,6 +143,30 @@ class DisqualificationForm(forms.Form): message = forms.CharField(required=True,widget=forms.Textarea) +class HistorySelectForm(forms.Form): + typeselectchoices = [("All","All")] + for wtype,verbose in mytypes.workouttypes_ordered.items(): + typeselectchoices.append((wtype,verbose)) + startdate = forms.DateField( + initial=timezone.now()-datetime.timedelta(days=15), + # widget=SelectDateWidget(years=range(1990,2050)), + widget=AdminDateWidget(), #format='%Y-%m-%d'), + label='Start Date') + enddate = forms.DateField( + initial=timezone.now(), + widget=AdminDateWidget(), #format='%Y-%m-%d'), + label='End Date') + + workouttype = forms.ChoiceField(initial='All',choices=typeselectchoices) + + class Meta: + fields = ['startdate','enddate'] + input_formats=("%Y-%m-%d") + dateTimeOptions = { + 'format': '%Y-%m-%d', + 'autoclose': True, + } + class MetricsForm(forms.Form): avghr = forms.IntegerField(required=False,label='Average Heart Rate') avgpwr = forms.IntegerField(required=False,label='Average Power') diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index a714f4d5..829b7777 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -172,6 +172,8 @@ from rowers.dataprep import timedeltaconv from math import pi def interactive_hr_piechart(df,rower,title): + if df.empty: + return "","Not enough data to make a chart" df.sort_values(by='hr',inplace=True) qry = 'hr < {ut2}'.format(ut2=rower.ut2) diff --git a/rowers/templates/history.html b/rowers/templates/history.html index 0328be5b..b315eb9f 100644 --- a/rowers/templates/history.html +++ b/rowers/templates/history.html @@ -8,7 +8,16 @@

History

    -
  • +
  • +
    + {% csrf_token %} + + {{ form.as_table }} +
    + +
    +
  • +
  • All workouts

    @@ -39,7 +48,7 @@

  • -
  • +
  • {{ totalscript|safe }}{{ totaldiv|safe }}
  • {% for ddict in typedicts %} @@ -74,12 +83,14 @@

    + {% endfor %}
{% endblock %} + {% block sidebar %} {% include 'menu_analytics.html' %} {% endblock %} diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py index c21ca7b1..aa767ace 100644 --- a/rowers/views/analysisviews.py +++ b/rowers/views/analysisviews.py @@ -4654,12 +4654,33 @@ class AlertDelete(DeleteView): @login_required() def history_view(request,userid=0): r = getrequestrower(request,userid=userid) + + form = HistorySelectForm() + usertimezone = pytz.timezone(r.defaulttimezone) activity_enddate = timezone.now() activity_enddate = activity_enddate.replace(hour=23,minute=59,second=59).astimezone(usertimezone) activity_startdate = activity_enddate-datetime.timedelta(days=15) activity_startdate = activity_startdate.replace(hour=0,minute=0,second=0) + typeselect = 'All' + + if request.method=='POST': + form = HistorySelectForm(request.POST) + if form.is_valid(): + startdate = form.cleaned_data['startdate'] + enddate = form.cleaned_data['enddate'] + typeselect = form.cleaned_data['workouttype'] + activity_startdate = datetime.datetime( + startdate.year,startdate.month,startdate.day + ).replace(hour=0,minute=0,second=0).astimezone(usertimezone) + activity_enddate = datetime.datetime( + enddate.year,enddate.month,enddate.day + ).replace(hour=23,minute=59,second=59).astimezone(usertimezone) + + + + g_workouts = Workout.objects.filter( user=r, @@ -4679,6 +4700,13 @@ def history_view(request,userid=0): # meters, duration per workout type wtypes = list(set([w.workouttype for w in g_workouts])) + + typechoices = [("All","All")] + for wtype in wtypes: + typechoices.append((wtype,mytypes.workouttypes_ordered[wtype])) + + form.fields['workouttype'].choices = typechoices + listofdicts = [] for wtype in wtypes: @@ -4699,8 +4727,14 @@ def history_view(request,userid=0): ddict['nrworkouts'] = a_workouts.count() listofdicts.append(ddict) + # interactive hr pie chart - totalscript,totaldiv = interactive_hr_piechart(df,r,'All Workouts') + if typeselect == 'All': + totalscript,totaldiv = interactive_hr_piechart(df,r,'All Workouts') + else: + a_workouts = g_workouts.filter(workouttype=typeselect) + ddf = getsmallrowdata_db(columns,ids=[w.id for w in a_workouts]) + totalscript, totaldiv = interactive_hr_piechart(ddf,r,mytypes.workouttypes_ordered[typeselect]) # interactive power pie chart @@ -4737,4 +4771,5 @@ def history_view(request,userid=0): 'typedicts':listofdicts, 'totalscript':totalscript, 'totaldiv':totaldiv, + 'form':form, }) diff --git a/rowers/views/statements.py b/rowers/views/statements.py index a999339f..87da8851 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -74,7 +74,7 @@ from rowers.forms import ( MetricsForm,DisqualificationForm,disqualificationreasons, disqualifiers,SearchForm,BillingForm,PlanSelectForm, VideoAnalysisCreateForm,WorkoutSingleSelectForm, - VideoAnalysisMetricsForm,SurveyForm, + VideoAnalysisMetricsForm,SurveyForm,HistorySelectForm, ) from django.urls import reverse, reverse_lazy