instant plans proto page
attached workout notification using encoded workout id
This commit is contained in:
@@ -184,7 +184,7 @@ ratelim==0.1.6
|
|||||||
redis==3.5.3
|
redis==3.5.3
|
||||||
requests==2.23.0
|
requests==2.23.0
|
||||||
requests-oauthlib==1.2.0
|
requests-oauthlib==1.2.0
|
||||||
rowingdata==3.1.8
|
rowingdata==3.2.7
|
||||||
rowingphysics==0.5.0
|
rowingphysics==0.5.0
|
||||||
rq==0.13.0
|
rq==0.13.0
|
||||||
rules==2.1
|
rules==2.1
|
||||||
|
|||||||
@@ -30,6 +30,8 @@ import pandas as pd
|
|||||||
from rowingdata import rowingdata as rrdata
|
from rowingdata import rowingdata as rrdata
|
||||||
from rowingdata import rower as rrower
|
from rowingdata import rower as rrower
|
||||||
|
|
||||||
|
from rowers.opaque import encoder
|
||||||
|
|
||||||
def to_pace(pace):
|
def to_pace(pace):
|
||||||
minutes, seconds = divmod(pace,60)
|
minutes, seconds = divmod(pace,60)
|
||||||
seconds, rest = divmod(seconds, 1)
|
seconds, rest = divmod(seconds, 1)
|
||||||
@@ -455,7 +457,7 @@ def add_workouts_plannedsession(ws,ps,r):
|
|||||||
w.plannedsession = ps
|
w.plannedsession = ps
|
||||||
w.save()
|
w.save()
|
||||||
result += 1
|
result += 1
|
||||||
comments.append('Attached workout %i to session' % w.id)
|
comments.append('Attached workout %s to session' % encoder.encode_hex(w.id))
|
||||||
if ps.sessiontype == 'coursetest':
|
if ps.sessiontype == 'coursetest':
|
||||||
record = CourseTestResult(
|
record = CourseTestResult(
|
||||||
userid=w.user.id,
|
userid=w.user.id,
|
||||||
|
|||||||
24
rowers/templates/instantplans.html
Normal file
24
rowers/templates/instantplans.html
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
{% extends "newbase.html" %}
|
||||||
|
{% load staticfiles %}
|
||||||
|
{% load rowerfilters %}
|
||||||
|
|
||||||
|
{% block title %}Rowsandall Training Plans{% endblock %}
|
||||||
|
|
||||||
|
|
||||||
|
{% block main %}
|
||||||
|
<h1>Training Plans</h1>
|
||||||
|
|
||||||
|
<ul class="main-content">
|
||||||
|
{% for plan in trainingdict %}
|
||||||
|
<li>
|
||||||
|
<p><a href="/rowers/plans/{{ plan.ID }}">{{ plan.name }}</a></p>
|
||||||
|
<p>{{ plan.plan|lookup:"duration"}}</p>
|
||||||
|
</li>
|
||||||
|
{% endfor %}
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
{% endblock %}
|
||||||
|
|
||||||
|
{% block sidebar %}
|
||||||
|
{% include 'menu_plan.html' %}
|
||||||
|
{% endblock %}
|
||||||
@@ -740,6 +740,7 @@ urlpatterns = [
|
|||||||
re_path(r'^test\_callback',views.rower_process_testcallback,name='rower_process_testcallback'),
|
re_path(r'^test\_callback',views.rower_process_testcallback,name='rower_process_testcallback'),
|
||||||
re_path(r'^createplan/$',views.rower_create_trainingplan,name='rower_create_trainingplan'),
|
re_path(r'^createplan/$',views.rower_create_trainingplan,name='rower_create_trainingplan'),
|
||||||
re_path(r'^createplan/user/(?P<id>\d+)/$',views.rower_create_trainingplan,name='rower_create_trainingplan'),
|
re_path(r'^createplan/user/(?P<id>\d+)/$',views.rower_create_trainingplan,name='rower_create_trainingplan'),
|
||||||
|
re_path(r'^plans/$', views.rower_select_instantplan, name='rower_select_instantplan'),
|
||||||
re_path(r'^deleteplan/(?P<pk>\d+)/$',login_required(
|
re_path(r'^deleteplan/(?P<pk>\d+)/$',login_required(
|
||||||
views.TrainingPlanDelete.as_view()),name='trainingplan_delete_view'),
|
views.TrainingPlanDelete.as_view()),name='trainingplan_delete_view'),
|
||||||
re_path(r'^deletemicrocycle/(?P<pk>\d+)/$',login_required(
|
re_path(r'^deletemicrocycle/(?P<pk>\d+)/$',login_required(
|
||||||
|
|||||||
@@ -2425,6 +2425,54 @@ class PlannedSessionDelete(DeleteView):
|
|||||||
|
|
||||||
return obj
|
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_select_instantplan(request,id=0):
|
||||||
|
r = getrequestrower(request,userid=id)
|
||||||
|
themanager = getrower(request.user)
|
||||||
|
|
||||||
|
# get and present available plans
|
||||||
|
authorizationstring = 'Bearer '+settings.WORKOUTS_FIT_TOKEN
|
||||||
|
|
||||||
|
url = settings.WORKOUTS_FIT_URL+"/trainingplan/"
|
||||||
|
headers = {'Authorization':authorizationstring}
|
||||||
|
|
||||||
|
trainingdict = {}
|
||||||
|
response = requests.get(url=url, headers=headers)
|
||||||
|
if response.status_code != 200:
|
||||||
|
messages.error(request,"Could not connect to the training plan server")
|
||||||
|
else:
|
||||||
|
trainingdict = response.json()['plans']
|
||||||
|
|
||||||
|
for plan in trainingdict:
|
||||||
|
print(plan['ID'],plan['name'],plan['plan']['duration'])
|
||||||
|
|
||||||
|
breadcrumbs = [
|
||||||
|
{
|
||||||
|
'url':reverse('plannedsessions_view'),
|
||||||
|
'name': 'Sessions'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url':reverse(rower_create_trainingplan,
|
||||||
|
kwargs={'id':id}),
|
||||||
|
'name': 'Manage Plans and Targets'
|
||||||
|
},
|
||||||
|
{
|
||||||
|
'url':reverse('rower_select_instantplan'),
|
||||||
|
'name': 'Select Existing Plans'
|
||||||
|
}
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
return render(request,
|
||||||
|
'instantplans.html',
|
||||||
|
{
|
||||||
|
'rower':r,
|
||||||
|
'active':'nav-plan',
|
||||||
|
'trainingdict':trainingdict,
|
||||||
|
|
||||||
|
})
|
||||||
|
|
||||||
@user_passes_test(can_plan,login_url="/rowers/paidplans",
|
@user_passes_test(can_plan,login_url="/rowers/paidplans",
|
||||||
message="This functionality requires a Coach or Self-Coach plan",
|
message="This functionality requires a Coach or Self-Coach plan",
|
||||||
|
|||||||
Reference in New Issue
Block a user