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 }}

+ +
    +
  • + + + + + + + + + + {% for day in trainingdays %} + + + + + + {% endfor %} + +
    WeekDayWorkouts
    {{ day.week }}{{ day.order }} + {% for workout in day.workouts %} +

    {{ workout.workoutName }}

    + {{ workout|steptostring|safe }} + {% 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'),