+ Adding sensor data from workout {{ workout2.id }} into workout {{ workout1.id2 }}.
+ This will create a new workout. After you submit the form, you will be
+ taken to the newly created workout. If you are happy with the result, you
+ can delete the two original workouts manually.
+
+
+ Workout 1: {{ workout1.name }}
+
+
+ Workout 2: {{ workout2.name }}
+
+
On the right hand side, please select the columns from workout 2 that
+ you want to replace the equivalent columns in workout 1.
+
+
+
+
+
+
+
+
+
+{% endblock %}
diff --git a/rowers/urls.py b/rowers/urls.py
index 24945f8e..b5a8629c 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -189,6 +189,7 @@ urlpatterns = [
url(r'^workout/(\d+)/interactiveplot$',views.workout_biginteractive_view),
url(r'^workout/(\d+)/view$',views.workout_view),
url(r'^workout/(\d+)$',views.workout_view),
+ url(r'^workout/fusion/(?P\d+)/(?P\d+)$',views.workout_fusion_view),
url(r'^physics$',TemplateView.as_view(template_name='physics.html'),name='physics'),
url(r'^workout/(\d+)/$',views.workout_view),
url(r'^workout/(\d+)/addtimeplot$',views.workout_add_timeplot_view),
diff --git a/rowers/views.py b/rowers/views.py
index c5aaa86f..f32974de 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -26,7 +26,8 @@ from rowers.forms import (
StatsOptionsForm,PredictedPieceForm,DateRangeForm,DeltaDaysForm,
EmailForm, RegistrationForm, RegistrationFormTermsOfService,
RegistrationFormUniqueEmail,CNsummaryForm,UpdateWindForm,
- UpdateStreamForm,WorkoutMultipleCompareForm,ChartParamChoiceForm
+ UpdateStreamForm,WorkoutMultipleCompareForm,ChartParamChoiceForm,
+ FusionMetricChoiceForm,
)
from rowers.models import Workout, User, Rower, WorkoutForm,FavoriteChart
from rowers.models import (
@@ -2617,7 +2618,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
# get data
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
# create bearing
@@ -2732,7 +2733,7 @@ def workout_stream_view(request,id=0,message="",successmessage=""):
# create interactive plot
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
rowdata = rdata(f1)
@@ -2892,7 +2893,7 @@ def workout_geeky_view(request,id=0,message="",successmessage=""):
# create interactive plot
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
# create interactive plot
@@ -3209,7 +3210,7 @@ def workout_advanced_view(request,id=0,message="",successmessage=""):
# create interactive plot
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
# create interactive plot
@@ -3527,7 +3528,7 @@ def workout_biginteractive_view(request,id=0,message="",successmessage=""):
# create interactive plot
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
# r = Rower.objects.get(user=u)
promember=0
@@ -3568,7 +3569,7 @@ def workout_otwpowerplot_view(request,id=0,message="",successmessage=""):
# create interactive plot
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
# r = Rower.objects.get(user=u)
promember=0
@@ -3766,6 +3767,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
try:
# check if valid ID exists (workout exists)
row = Workout.objects.get(id=id)
+ form = WorkoutForm(instance=row)
except Workout.DoesNotExist:
raise Http404("Workout doesn't exist")
@@ -3815,12 +3817,11 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
r.write_csv(row.csvfilename,gzip=True)
dataprep.update_strokedata(id,r.df)
successmessage = "Changes saved"
- url = "/rowers/workout/"+str(row.id)+"/edit"
url = reverse(workout_edit_view,
kwargs = {
'id':str(row.id),
'successmessage':str(successmessage),
- })
+ })
response = HttpResponseRedirect(url)
else:
message = "You are not allowed to change this workout"
@@ -3845,7 +3846,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
# create interactive plot
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
rowdata = rdata(f1)
hascoordinates = 1
@@ -3914,7 +3915,7 @@ def workout_add_otw_powerplot_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -3971,7 +3972,7 @@ def workout_add_piechart_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
@@ -4029,7 +4030,7 @@ def workout_add_power_piechart_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
@@ -4085,7 +4086,7 @@ def workout_add_timeplot_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -4142,7 +4143,7 @@ def workout_add_distanceplot_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -4197,7 +4198,7 @@ def workout_add_distanceplot2_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -4254,7 +4255,7 @@ def workout_add_timeplot2_view(request,id):
timestr = strftime("%Y%m%d-%H%M%S")
imagename = f1+timestr+'.png'
fullpathimagename = 'static/plots/'+imagename
- u = request.user
+ u = w.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -4944,7 +4945,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
s = ""
# still here - this is a workout we may edit
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,
@@ -4984,6 +4985,26 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
)
return HttpResponseRedirect(url)
+# Fuse two workouts
+@login_required()
+def workout_fusion_view(request,id1=0,id2=1):
+ try:
+ w1 = Workout.objects.get(id=id1)
+ w2 = Workout.objects.get(id=id2)
+ if (checkworkoutuser(request.user,w1)==False) or \
+ (checkworkoutuser(request.user,w2)==False):
+ raise PermissionDenied("You are not allowed to use these workouts")
+ except Workout.DoesNotExist:
+ raise Http404("One of the workouts doesn't exist")
+
+ form = FusionMetricChoiceForm()
+
+ return render(request, 'fusion.html',
+ {'form':form,
+ 'workout1':w1,
+ 'workout2':w2,
+ })
+
# Edit the splits/summary
@login_required()
@@ -4999,7 +5020,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
s = ""
# still here - this is a workout we may edit
f1 = row.csvfilename
- u = request.user
+ u = row.user.user
r = Rower.objects.get(user=u)
powerperc = 100*np.array([r.pw_ut2,
r.pw_ut1,