diff --git a/rowers/templates/menu_workout.html b/rowers/templates/menu_workout.html
index ea138baf..a503805f 100644
--- a/rowers/templates/menu_workout.html
+++ b/rowers/templates/menu_workout.html
@@ -260,6 +260,11 @@
TCX
+
+
+ FIT
+
+
diff --git a/rowers/urls.py b/rowers/urls.py
index b6e01143..14e77eb0 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -494,6 +494,8 @@ urlpatterns = [
name='workout_comment_view'),
re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/emailtcx/$', views.workout_tcxemail_view,
name='workout_tcxemail_view'),
+ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/emailfit/$', views.workout_fitemail_view,
+ name='workout_fitemail_view'),
re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/emailgpx/$', views.workout_gpxemail_view,
name='workout_gpxemail_view'),
re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/emailcsv/$', views.workout_csvemail_view,
diff --git a/rowers/views/exportviews.py b/rowers/views/exportviews.py
index e2aa4a00..0b62bdc2 100644
--- a/rowers/views/exportviews.py
+++ b/rowers/views/exportviews.py
@@ -22,6 +22,27 @@ def workout_tcxemail_view(request, id=0):
os.remove(tcxfilename)
return response
+@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
+def workout_fitemail_view(request, id=0):
+ w = get_workout(id)
+
+ row = rdata(csvfile=w.csvfilename)
+
+ code = str(uuid4())
+ fitfilename = code+'.fit'
+
+ workouttype = mytypes.fitmapping.get(w.workouttype, 'generic')
+
+ row.exporttofit(fitfilename, sport=workouttype, notes=w.name)
+
+ with open(fitfilename, 'rb') as f:
+ response = HttpResponse(f)
+ response['Content-Disposition'] = 'attachment; filename="%s"' % fitfilename
+ response['Content-Type'] = 'application/octet-stream'
+
+ os.remove(fitfilename)
+ return response
+
@login_required()
def plannedsessions_icsemail_view(request, userid=0):