diff --git a/rowers/templates/instantplan.html b/rowers/templates/instantplan.html
new file mode 100644
index 00000000..897d8174
--- /dev/null
+++ b/rowers/templates/instantplan.html
@@ -0,0 +1,43 @@
+{% extends "newbase.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+
+{% block title %}{{ plan.name }}{% endblock %}
+
+
+{% block main %}
+
{{ plan.name }}
+
+
+ -
+
+
+
+ | Week |
+ Day |
+ Workouts |
+
+
+
+ {% for day in trainingdays %}
+
+ | {{ day.week }} |
+ {{ day.order }} |
+
+ {% for workout in day.workouts %}
+ {{ workout.workoutName }}
+ {{ workout|steptostring|safe }}
+ {% endfor %}
+ |
+
+ {% endfor %}
+
+
+
+
+
+{% endblock %}
+
+{% block sidebar %}
+{% include 'menu_plan.html' %}
+{% endblock %}
diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py
index 7cc4d99c..412e2427 100644
--- a/rowers/templatetags/rowerfilters.py
+++ b/rowers/templatetags/rowerfilters.py
@@ -26,12 +26,13 @@ from rowers.rower_rules import is_coach_user, is_workout_user, isplanmember,ispr
from rowers.mytypes import (
otwtypes,adaptivetypes,sexcategories,weightcategories,workouttypes,
)
-from rowers.utils import NoTokenError
+from rowers.utils import NoTokenError, step_to_string
import rowers.payments as payments
from rowers.opaque import encoder
+from rowers.plannedsessions import ps_dict_get_description_html
import arrow
@@ -70,6 +71,11 @@ favanalysisicons = {
'cp':'fa-user-chart',
}
+@register.filter
+def steptostring(steps):
+ res = ps_dict_get_description_html(steps)
+ return res
+
# for verbose version of fav analysis
@register.filter
def verbose(s):
diff --git a/rowers/urls.py b/rowers/urls.py
index 9bb36e53..89ee2771 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -741,6 +741,8 @@ urlpatterns = [
re_path(r'^createplan/$',views.rower_create_trainingplan,name='rower_create_trainingplan'),
re_path(r'^createplan/user/(?P\d+)/$',views.rower_create_trainingplan,name='rower_create_trainingplan'),
re_path(r'^plans/$', views.rower_select_instantplan, name='rower_select_instantplan'),
+ re_path(r'^plans/(?P[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12})/$',
+ views.rower_view_instantplan, name='rower_view_instantplan'),
re_path(r'^deleteplan/(?P\d+)/$',login_required(
views.TrainingPlanDelete.as_view()),name='trainingplan_delete_view'),
re_path(r'^deletemicrocycle/(?P\d+)/$',login_required(
diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py
index 3b2bc520..bf925e49 100644
--- a/rowers/views/planviews.py
+++ b/rowers/views/planviews.py
@@ -2425,6 +2425,78 @@ class PlannedSessionDelete(DeleteView):
return obj
+@user_passes_test(can_plan,login_url="/rowers/paidplans",
+ message="This functionality requires a Coach or Self-Coach plan",
+ redirect_field_name=None)
+def rower_view_instantplan(request,id='',userid=0):
+ r = getrequestrower(request,userid=userid)
+ if not id:
+ raise Http404("Plan does not exist")
+
+ authorizationstring = 'Bearer '+settings.WORKOUTS_FIT_TOKEN
+ url = settings.WORKOUTS_FIT_URL+"/trainingplan/"+id
+ headers = {'Authorization':authorizationstring}
+
+ response = requests.get(url=url,headers=headers)
+ if response.status_code != 200:
+ messages.error(request,"Could not connect to the training plan server")
+ return HttpResponseRedirect(reverse('rower_select_instantplan'))
+
+ plan = response.json()
+ trainingdays = plan['plan']['trainingDays']
+
+
+ trainingdays2 = []
+ nextday = trainingdays.pop(0)
+ for i in range(plan['plan']['duration']):
+ if nextday['order'] == i+1:
+ nextday['week'] = (divmod(i,7)[0])+1
+ trainingdays2.append(nextday)
+ try:
+ nextday = trainingdays.pop(0)
+ except IndexError:
+ continue
+ else:
+ trainingdays2.append(
+ {
+ 'order':i+1,
+ 'week': (divmod(i,7)[0])+1,
+ 'workouts':[]
+ }
+ )
+
+ breadcrumbs = [
+ {
+ 'url':reverse('plannedsessions_view'),
+ 'name': 'Sessions'
+ },
+ {
+ 'url':reverse(rower_create_trainingplan,
+ kwargs={'id':userid}),
+ 'name': 'Manage Plans and Targets'
+ },
+ {
+ 'url':reverse('rower_select_instantplan'),
+ 'name': 'Select Existing Plans'
+ },
+ {
+ 'url':reverse('rower_view_instantplan',kwargs={
+ 'id':id,
+# 'userid':userid,
+ }),
+ 'name':plan['name']
+ }
+ ]
+
+ return render(request,
+ 'instantplan.html',
+ {
+ 'rower':r,
+ 'active':'nav-plan',
+ 'plan':plan,
+ 'trainingdays':trainingdays2,
+ })
+
@user_passes_test(can_plan,login_url="/rowers/paidplans",
message="This functionality requires a Coach or Self-Coach plan",
redirect_field_name=None)
@@ -2445,9 +2517,6 @@ def rower_select_instantplan(request,id=0):
else:
trainingdict = response.json()['plans']
- for plan in trainingdict:
- print(plan['ID'],plan['name'],plan['plan']['duration'])
-
breadcrumbs = [
{
'url':reverse('plannedsessions_view'),