diff --git a/rowers/models.py b/rowers/models.py
index 04896767..78b95e1b 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -280,6 +280,7 @@ class Workout(models.Model):
('slides','Indoor Rower on Slides'),
('paddle','Paddle Adapter'),
('snow','On-snow'),
+ ('other','Other'),
)
boattypes = (
diff --git a/rowers/templates/workoutstats.html b/rowers/templates/workoutstats.html
index 360c0071..aebd71a4 100644
--- a/rowers/templates/workoutstats.html
+++ b/rowers/templates/workoutstats.html
@@ -6,7 +6,7 @@
{% block content %}
-
Workout Statistics
+
Workout Statistics for {{ workout.name }}
-
Stroke Rate
+{% if stats %}
+{% for key, value in stats.items %}
+
{{ key }}
@@ -48,80 +50,24 @@
- | Mean | {{ stats.spm.mean|floatformat:-2 }} |
+ Mean | {{ value.mean|floatformat:-2 }} |
- | Minimum | {{ stats.spm.min|floatformat:-2 }} |
+ Minimum | {{ value.min|floatformat:-2 }} |
- | 25% | {{ stats.spm.firstq|floatformat:-2 }} |
+ 25% | {{ value.firstq|floatformat:-2 }} |
- | Median | {{ stats.spm.median|floatformat:-2 }} |
+ Median | {{ value.median|floatformat:-2 }} |
- | 75% | {{ stats.spm.thirdq|floatformat:-2 }} |
+ 75% | {{ value.thirdq|floatformat:-2 }} |
- | Maximum | {{ stats.spm.max|floatformat:-2 }} |
+ Maximum | {{ value.max|floatformat:-2 }} |
- | Standard Deviation | {{ stats.spm.std|floatformat:-2 }} |
+ Standard Deviation | {{ value.std|floatformat:-2 }} |
-
-
-
-
Heart Rate
-
-
-
- | Metric |
- Value |
-
-
-
-
- | Mean | {{ stats.hr.mean|floatformat:-2 }} |
-
- | Minimum | {{ stats.hr.min|floatformat:-2 }} |
-
- | 25% | {{ stats.hr.firstq|floatformat:-2 }} |
-
- | Median | {{ stats.hr.median|floatformat:-2 }} |
-
- | 75% | {{ stats.hr.thirdq|floatformat:-2 }} |
-
- | Maximum | {{ stats.hr.max|floatformat:-2 }} |
-
- | Standard Deviation | {{ stats.hr.std|floatformat:-2 }} |
-
-
-
-
-
-
-
Power
-
-
-
- | Metric |
- Value |
-
-
-
-
- | Mean | {{ stats.power.mean|floatformat:-2 }} |
-
- | Minimum | {{ stats.power.min|floatformat:-2 }} |
-
- | 25% | {{ stats.power.firstq|floatformat:-2 }} |
-
- | Median | {{ stats.power.median|floatformat:-2 }} |
-
- | 75% | {{ stats.power.thirdq|floatformat:-2 }} |
-
- | Maximum | {{ stats.power.max|floatformat:-2 }} |
-
- | Standard Deviation | {{ stats.power.std|floatformat:-2 }} |
-
-
-
-
+
+{% endfor %}
+{% endif %}
{% endblock %}
diff --git a/rowers/views.py b/rowers/views.py
index 6cf816ea..e6a1b021 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -26,7 +26,7 @@ from rowers.forms import SummaryStringForm,IntervalUpdateForm,StrokeDataForm
from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
from rowers.models import (
RowerPowerForm,RowerForm,GraphImage,AdvancedWorkoutForm,
- RowerPowerZonesForm,AccountRowerForm,UserForm,
+ RowerPowerZonesForm,AccountRowerForm,UserForm,StrokeData,
)
from rowers.models import FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement
from django.forms.formsets import formset_factory
@@ -2611,15 +2611,15 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
if request.method == 'POST' and 'workstrokesonly' in request.POST:
workstrokesonly = request.POST['workstrokesonly']
- row = Workout.objects.get(id=id)
+
+ # prepare data frame
+ datadf,row = dataprep.getrowdata_db(id=id)
if (checkworkoutuser(request.user,row)==False):
message = "You are not allowed to see the stats of this workout"
url = reverse(workouts_view,args=[str(message)])
return HttpResponseRedirect(url)
- columns = ['hr','spm','power','workoutstate']
- datadf = dataprep.getsmallrowdata_db(columns,ids=[id])
-
+
if datadf.empty:
return HttpResponse("CSV data file not found")
@@ -2634,45 +2634,45 @@ def workout_stats_view(request,id=0,message="",successmessage=""):
pass
workstrokesonly = True
+ # Create stats
stats = {}
- # SPM
- spmdict = {
- 'mean':datadf['spm'].mean(),
- 'max': datadf['spm'].max(),
- 'min': datadf['spm'].min(),
- 'std': datadf['spm'].std(),
- 'median': datadf['spm'].median(),
- 'firstq':datadf['spm'].quantile(q=0.25),
- 'thirdq':datadf['spm'].quantile(q=0.75),
- }
- stats['spm'] = spmdict
+ # Get field names and remove those that are not useful in stats
+ fieldnames = StrokeData._meta.get_all_field_names()
+ fieldnames.remove('workoutid')
+ fieldnames.remove('ergpace')
+ fieldnames.remove('hr_an')
+ fieldnames.remove('hr_tr')
+ fieldnames.remove('hr_at')
+ fieldnames.remove('hr_ut2')
+ fieldnames.remove('hr_ut1')
+ fieldnames.remove('time')
+ fieldnames.remove('distance')
+ fieldnames.remove('nowindpace')
+ fieldnames.remove('fnowindpace')
+ fieldnames.remove('fergpace')
+ fieldnames.remove('equivergpower')
+ fieldnames.remove('workoutstate')
+ fieldnames.remove('fpace')
+ fieldnames.remove('id')
+ fieldnames.remove('ftime')
+ fieldnames.remove('x_right')
+ fieldnames.remove('hr_max')
+ fieldnames.remove('hr_bottom')
+ fieldnames.remove('cumdist')
- # HR
- hrdict = {
- 'mean':datadf['hr'].mean(),
- 'max': datadf['hr'].max(),
- 'min': datadf['hr'].min(),
- 'std': datadf['hr'].std(),
- 'median': datadf['hr'].median(),
- 'firstq':datadf['hr'].quantile(q=0.25),
- 'thirdq':datadf['hr'].quantile(q=0.75),
- }
-
- stats['hr'] = hrdict
-
- # Power
- powerdict = {
- 'mean':datadf['power'].mean(),
- 'max': datadf['power'].max(),
- 'min': datadf['power'].min(),
- 'std': datadf['power'].std(),
- 'median': datadf['power'].median(),
- 'firstq':datadf['power'].quantile(q=0.25),
- 'thirdq':datadf['power'].quantile(q=0.75),
- }
-
- stats['power'] = powerdict
+ for field in fieldnames:
+ thedict = {
+ 'mean':datadf[field].mean(),
+ 'min': datadf[field].min(),
+ 'std': datadf[field].std(),
+ 'max': datadf[field].max(),
+ 'median': datadf[field].median(),
+ 'firstq':datadf[field].quantile(q=0.25),
+ 'thirdq':datadf[field].quantile(q=0.75),
+ }
+ stats[field] = thedict
+
return render(request,
'workoutstats.html',