diff --git a/rowers/models.py b/rowers/models.py
index 3881e269..acfea0e0 100644
--- a/rowers/models.py
+++ b/rowers/models.py
@@ -4978,3 +4978,9 @@ class InStrokeAnalysis(models.Model):
end_second = models.IntegerField(default=3600)
spm_min = models.IntegerField(default=10)
spm_max = models.IntegerField(default=45)
+
+ def __str__(self):
+ s = 'In-Stroke Analysis {name} ({date})'.format(name = self.name,
+ date = self.date)
+
+ return s
diff --git a/rowers/templates/instroke_analysis.html b/rowers/templates/instroke_analysis.html
index 094145b0..c63273d3 100644
--- a/rowers/templates/instroke_analysis.html
+++ b/rowers/templates/instroke_analysis.html
@@ -44,7 +44,7 @@
-
diff --git a/rowers/templates/instrokeanalysis_delete_confirm.html b/rowers/templates/instrokeanalysis_delete_confirm.html
new file mode 100644
index 00000000..9af367be
--- /dev/null
+++ b/rowers/templates/instrokeanalysis_delete_confirm.html
@@ -0,0 +1,29 @@
+{% extends "newbase.html" %}
+{% load static %}
+
+{% block title %}In-Stroke Analysis{% endblock %}
+
+{% block main %}
+
Confirm Delete
+
This will permanently delete the analysis
+
+
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+{% include 'menu_analytics.html' %}
+{% endblock %}
diff --git a/rowers/urls.py b/rowers/urls.py
index 9b64f117..e73b05a7 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -254,6 +254,8 @@ urlpatterns = [
views.instroke_chart_interactive, name='instroke_chart_interactive'),
re_path(r'^workout/(?P
\b[0-9A-Fa-f]+\b)/instroke/interactive/(?P\d+)/$',
views.instroke_chart_interactive, name='instroke_chart_interactive'),
+ re_path(r'^workout/(?P\b[0-9A-Fa-f]+\b)/instroke/interactive/(?P\d+)/user/(?P\d+)/$',
+ views.instroke_chart_interactive, name='instroke_chart_interactive'),
re_path(r'^exportallworkouts/?/$', views.workouts_summaries_email_view,
name='workouts_summaries_email_view'),
path('failedjobs/', views.failed_queue_view, name='failed_queue_view'),
@@ -832,6 +834,8 @@ urlpatterns = [
re_path(r'^analysis/$', views.analysis_view, name='analysis'),
re_path(r'^analysis/instrokeanalysis/$', views.instrokeanalysis_view,
name='instrokeanalysis_view'),
+ re_path(r'^analysis/instrokeanalysis/(?P\d+)/delete/$',
+ views.InStrokeAnalysisDelete.as_view(), name='instroke_analysis_delete_view'),
re_path(r'^promembership', TemplateView.as_view(
template_name='promembership.html'), name='promembership'),
re_path(r'^checkout/(?P\d+)/$',
diff --git a/rowers/views/analysisviews.py b/rowers/views/analysisviews.py
index 3ae19152..83b496a7 100644
--- a/rowers/views/analysisviews.py
+++ b/rowers/views/analysisviews.py
@@ -1845,7 +1845,10 @@ def agegrouprecordview(request, sex='male', weightcategory='hwt',
})
-@login_required
+@user_passes_test(ispromember, login_url="/rowers/paidplans",
+ message="This functionality requires a Pro plan or higher."
+ " If you are already a Pro user, please log in to access this functionality",
+ redirect_field_name=None)
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
def instrokeanalysis_view(request, userid=0):
r = getrequestrower(request, userid=userid)
@@ -1885,6 +1888,61 @@ def instrokeanalysis_view(request, userid=0):
'the_div': div,
})
+#instroke analysis delete view
+class InStrokeAnalysisDelete(DeleteView):
+ login_required = True
+ model = InStrokeAnalysis
+ template_name = 'instrokeanalysis_delete_confirm.html'
+
+ # extra parameters
+ def get_context_data(self, **kwargs):
+ context = super(InStrokeAnalysisDelete, self).get_context_data(**kwargs)
+
+ if 'userid' in kwargs: # pragma: no cover
+ userid = kwargs['userid']
+ else:
+ userid = 0
+
+ context['rower'] = getrequestrower(self.request, userid=userid)
+ context['alert'] = self.object
+
+ breadcrumbs = [
+ {
+ 'url': '/rowers/analysis',
+ 'name': 'Analysis'
+ },
+ {
+ 'url': reverse('instrokeanalysis_view'),
+ 'name': 'In-Stroke Analysis',
+ },
+ {
+ 'url': reverse('instroke_chart_interactive',
+ kwargs={'userid': userid,
+ 'id': encoder.encode_hex(self.object.workout.id),
+ 'analysis': self.object.pk}),
+ 'name': self.object.name,
+ },
+ {
+ 'url': reverse('instroke_analysis_delete_view', kwargs={'pk': self.object.pk}),
+ 'name': 'Delete'
+ }
+ ]
+
+ context['breadcrumbs'] = breadcrumbs
+
+ return context
+
+ def get_success_url(self):
+ return reverse('instrokeanalysis_view')
+
+ def get_object(self, *args, **kwargs):
+ obj = super(InStrokeAnalysisDelete, self).get_object(*args, **kwargs)
+
+ if obj.rower != self.request.user.rower:
+ raise PermissionDenied("You are not allowed to delete this Analysis")
+
+ return obj
+
@login_required
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
@@ -1918,8 +1976,6 @@ def alerts_view(request, userid=0):
})
# alert create view
-
-
@user_passes_test(ispromember, login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher."
" If you are already a Pro user, please log in to access this functionality",
@@ -2174,8 +2230,6 @@ def alert_edit_view(request, id=0, userid=0):
})
# alert delete view
-
-
class AlertDelete(DeleteView):
login_required = True
model = Alert
diff --git a/rowers/views/workoutviews.py b/rowers/views/workoutviews.py
index b869d391..469a6d4f 100644
--- a/rowers/views/workoutviews.py
+++ b/rowers/views/workoutviews.py
@@ -2915,6 +2915,10 @@ def instroke_chart(request, id=0, metric=''): # pragma: no cover
return HttpResponseRedirect(url)
+@user_passes_test(ispromember, login_url="/rowers/paidplans",
+ message="This functionality requires a Pro plan or higher."
+ " If you are already a Pro user, please log in to access this functionality",
+ redirect_field_name=None)
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
def instroke_chart_interactive(request, id=0, analysis=0, userid=0):