Merge branch 'develop' into feature/decoratordecorator
This commit is contained in:
@@ -7,7 +7,7 @@ from rowers.imports import *
|
||||
import datetime
|
||||
from requests import Request, Session
|
||||
|
||||
from rowers.types import otwtypes
|
||||
from rowers.mytypes import otwtypes
|
||||
from iso8601 import ParseError
|
||||
|
||||
from rowsandall_app.settings import (
|
||||
|
||||
@@ -74,7 +74,7 @@ queuelow = django_rq.get_queue('low')
|
||||
queuehigh = django_rq.get_queue('default')
|
||||
|
||||
from rowsandall_app.settings import SITE_URL
|
||||
from rowers.types import otwtypes
|
||||
from rowers.mytypes import otwtypes
|
||||
|
||||
from rowers.database import *
|
||||
|
||||
|
||||
46
rowers/decorators.py
Normal file
46
rowers/decorators.py
Normal file
@@ -0,0 +1,46 @@
|
||||
from django.contrib.auth.decorators import login_required,user_passes_test
|
||||
|
||||
from django.http import HttpResponseRedirect
|
||||
from django.core.exceptions import PermissionDenied
|
||||
from django.utils.decorators import available_attrs
|
||||
from django.contrib import messages
|
||||
|
||||
try:
|
||||
from functools import wraps
|
||||
except ImportError:
|
||||
from django.utils.functional import wraps
|
||||
|
||||
|
||||
REDIRECT_FIELD_NAME = None
|
||||
|
||||
default_message = "Please log in, in order to see the requested page."
|
||||
|
||||
def user_passes_test(test_func, message=default_message,login_url=None,redirect_field_name=None):
|
||||
"""
|
||||
Decorator for views that checks that the user passes the given test,
|
||||
setting a message in case of no success. The test should be a callable
|
||||
that takes the user object and returns True if the user passes.
|
||||
"""
|
||||
def decorator(view_func):
|
||||
@wraps(view_func, assigned=available_attrs(view_func))
|
||||
def _wrapped_view(request, *args, **kwargs):
|
||||
if not test_func(request.user):
|
||||
messages.error(request, message)
|
||||
return HttpResponseRedirect(login_url)
|
||||
return view_func(request, *args, **kwargs)
|
||||
return _wrapped_view
|
||||
return decorator
|
||||
|
||||
def login_required_message(function=None, message=default_message):
|
||||
"""
|
||||
Decorator for views that checks that the user is logged in, redirecting
|
||||
to the log-in page if necessary.
|
||||
"""
|
||||
actual_decorator = user_passes_test(
|
||||
lambda u: u.is_authenticated(),
|
||||
message=message,
|
||||
)
|
||||
if function:
|
||||
return actual_decorator(function)
|
||||
return actual_decorator
|
||||
|
||||
@@ -9,7 +9,7 @@ from django.forms.extras.widgets import SelectDateWidget
|
||||
from django.utils import timezone,translation
|
||||
from django.forms import ModelForm, Select
|
||||
import dataprep
|
||||
import types
|
||||
import mytypes
|
||||
import datetime
|
||||
from django.forms import formset_factory
|
||||
from utils import landingpages
|
||||
@@ -83,7 +83,7 @@ class DocumentsForm(forms.Form):
|
||||
choices=Workout.workouttypes)
|
||||
|
||||
boattype = forms.ChoiceField(required=True,
|
||||
choices=types.boattypes,
|
||||
choices=mytypes.boattypes,
|
||||
label = "Boat Type")
|
||||
|
||||
|
||||
@@ -589,8 +589,8 @@ class IntervalUpdateForm(forms.Form):
|
||||
self.fields['type_%s' % i].widget.attrs['style'] = 'width:156px; height: 22px;'
|
||||
self.fields['intervald_%s' % i].widget = forms.TimeInput(format='%H:%M:%S.%f')
|
||||
|
||||
boattypes = types.boattypes
|
||||
workouttypes = types.workouttypes
|
||||
boattypes = mytypes.boattypes
|
||||
workouttypes = mytypes.workouttypes
|
||||
ww = list(workouttypes)
|
||||
ww.append(tuple(('all','All')))
|
||||
workouttypes = tuple(ww)
|
||||
@@ -616,7 +616,7 @@ class TrendFlexModalForm(forms.Form):
|
||||
initial='all')
|
||||
waterboattype = forms.MultipleChoiceField(choices=boattypes,
|
||||
label='Water Boat Type',
|
||||
initial = types.waterboattype)
|
||||
initial = mytypes.waterboattype)
|
||||
rankingonly = forms.BooleanField(initial=False,
|
||||
label='Only Ranking Pieces',
|
||||
required=False)
|
||||
@@ -631,14 +631,14 @@ class StatsOptionsForm(forms.Form):
|
||||
waterboattype = forms.MultipleChoiceField(choices=boattypes,
|
||||
label='Water Boat Type',
|
||||
widget=forms.CheckboxSelectMultiple(),
|
||||
initial = types.waterboattype)
|
||||
initial = mytypes.waterboattype)
|
||||
|
||||
|
||||
|
||||
def __init__(self, *args, **kwargs):
|
||||
super(StatsOptionsForm, self).__init__(*args,**kwargs)
|
||||
|
||||
for type in types.checktypes:
|
||||
for type in mytypes.checktypes:
|
||||
self.fields[type] = forms.BooleanField(initial=True,required=False)
|
||||
|
||||
|
||||
@@ -807,8 +807,8 @@ class WorkoutSessionSelectForm(forms.Form):
|
||||
|
||||
|
||||
class RaceResultFilterForm(forms.Form):
|
||||
boatclasses = (type for type in types.workouttypes if type[0] in types.otwtypes)
|
||||
boatclassinitial = [t for t in types.otwtypes]
|
||||
boatclasses = (type for type in mytypes.workouttypes if type[0] in mytypes.otwtypes)
|
||||
boatclassinitial = [t for t in mytypes.otwtypes]
|
||||
sexchoices = (
|
||||
('female','Female'),
|
||||
('male','Male'),
|
||||
@@ -836,7 +836,7 @@ class RaceResultFilterForm(forms.Form):
|
||||
boattype = forms.MultipleChoiceField(
|
||||
choices=boattypes,
|
||||
label='Boat Type',
|
||||
initial=types.waterboattype,
|
||||
initial=mytypes.waterboattype,
|
||||
widget=forms.CheckboxSelectMultiple())
|
||||
|
||||
age_min = forms.IntegerField(label='Min Age',initial=16)
|
||||
|
||||
@@ -38,7 +38,7 @@ from django.contrib.auth.decorators import login_required
|
||||
from rowingdata import rowingdata, make_cumvalues
|
||||
import pandas as pd
|
||||
from rowers.models import Rower,Workout,checkworkoutuser
|
||||
from rowers import types
|
||||
from rowers import mytypes
|
||||
from rowsandall_app.settings import (
|
||||
C2_CLIENT_ID, C2_REDIRECT_URI, C2_CLIENT_SECRET,
|
||||
STRAVA_CLIENT_ID, STRAVA_REDIRECT_URI,
|
||||
|
||||
@@ -5,7 +5,7 @@ from utils import myqueue
|
||||
import django_rq
|
||||
queue = django_rq.get_queue('default')
|
||||
from rowers.tasks import handle_updatefitnessmetric
|
||||
from rowers.types import otwtypes
|
||||
from rowers.mytypes import otwtypes
|
||||
|
||||
def getrower(user):
|
||||
try:
|
||||
|
||||
@@ -34,7 +34,7 @@ from rowers.rows import validate_file_extension
|
||||
from collections import OrderedDict
|
||||
from timezonefinder import TimezoneFinder
|
||||
|
||||
import types
|
||||
import mytypes
|
||||
from matplotlib import path
|
||||
|
||||
from rowsandall_app.settings import (
|
||||
@@ -1990,13 +1990,13 @@ class PlannedSessionFormSmall(ModelForm):
|
||||
'manager': forms.HiddenInput(),
|
||||
}
|
||||
|
||||
boattypes = types.boattypes
|
||||
boattypes = mytypes.boattypes
|
||||
|
||||
# Workout
|
||||
class Workout(models.Model):
|
||||
workouttypes = types.workouttypes
|
||||
workoutsources = types.workoutsources
|
||||
privacychoices = types.privacychoices
|
||||
workouttypes = mytypes.workouttypes
|
||||
workoutsources = mytypes.workoutsources
|
||||
privacychoices = mytypes.privacychoices
|
||||
|
||||
user = models.ForeignKey(Rower)
|
||||
team = models.ManyToManyField(Team,blank=True)
|
||||
@@ -2121,7 +2121,7 @@ def auto_delete_strokedata_on_delete(sender, instance, **kwargs):
|
||||
|
||||
# Virtual Race results (for keeping results when workouts are deleted)
|
||||
class VirtualRaceResult(models.Model):
|
||||
boatclasses = (type for type in types.workouttypes if type[0] in types.otwtypes)
|
||||
boatclasses = (type for type in mytypes.workouttypes if type[0] in mytypes.otwtypes)
|
||||
userid = models.IntegerField(default=0)
|
||||
teamname = models.CharField(max_length=80,verbose_name = 'Team Name',
|
||||
blank=True,null=True)
|
||||
|
||||
@@ -37,11 +37,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Power Histogram</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/histo">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/histogram.png" alt="Power Histogram">
|
||||
</div>
|
||||
@@ -52,11 +48,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Statistics</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/cumstats">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/statistics.PNG" alt="Statistics">
|
||||
</div>
|
||||
@@ -67,11 +59,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Box Chart</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/user-boxplot-select">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/boxplot.png" alt="Box Chart">
|
||||
</div>
|
||||
@@ -83,11 +71,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>OTW Critical Power</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/otw-bests">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/otwcp.png" alt="OTW Critical Power">
|
||||
</div>
|
||||
@@ -98,11 +82,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>OTE Critical Power</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/ote-ranking">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/otecp.png" alt="OTE Critical Power">
|
||||
</div>
|
||||
@@ -114,11 +94,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h2>Trend Flex</h2>
|
||||
{% if user|is_promember %}
|
||||
<a href="/rowers/user-multiflex-select">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/trendflex.png" alt="Trend Flex">
|
||||
</div>
|
||||
@@ -130,11 +106,7 @@
|
||||
</li>
|
||||
<li class="rounder">
|
||||
<h1>Power Progress</h1>
|
||||
{% if user|is_planmember %}
|
||||
<a href="/rowers/fitness-progress/">
|
||||
{% else %}
|
||||
<a href="/rowers/promembership">
|
||||
{% endif %}
|
||||
<div class="vignet">
|
||||
<img src="/static/img/powerprogress.png" alt="Power Progress">
|
||||
</div>
|
||||
|
||||
@@ -20,7 +20,7 @@ from rowers import c2stuff, runkeeperstuff
|
||||
from rowers.c2stuff import c2_open
|
||||
from rowers.runkeeperstuff import runkeeper_open
|
||||
|
||||
from rowers.types import otwtypes
|
||||
from rowers.mytypes import otwtypes
|
||||
from rowers.utils import NoTokenError
|
||||
|
||||
def strfdelta(tdelta):
|
||||
|
||||
@@ -26,7 +26,7 @@ queue = django_rq.get_queue('default')
|
||||
queuelow = django_rq.get_queue('low')
|
||||
queuehigh = django_rq.get_queue('low')
|
||||
|
||||
from types import workouttypes,boattypes,otwtypes
|
||||
from mytypes import workouttypes,boattypes,otwtypes
|
||||
|
||||
try:
|
||||
from cStringIO import StringIO
|
||||
|
||||
@@ -397,6 +397,7 @@ urlpatterns = [
|
||||
url(r'^analysis/$', views.analysis_view,name='analysis'),
|
||||
url(r'^laboratory/$', views.laboratory_view,name='laboratory'),
|
||||
url(r'^promembership', TemplateView.as_view(template_name='promembership.html'),name='promembership'),
|
||||
url(r'^planrequired',views.planrequired_view),
|
||||
url(r'^starttrial$',views.start_trial_view),
|
||||
url(r'^startplantrial$',views.start_plantrial_view),
|
||||
# url(r'^planmembership', TemplateView.as_view(template_name='planmembership.html'),name='planmembership'),
|
||||
|
||||
248
rowers/views.py
248
rowers/views.py
@@ -98,7 +98,8 @@ import rowers.uploads as uploads
|
||||
from django.forms.formsets import formset_factory
|
||||
from django.forms import modelformset_factory
|
||||
import StringIO
|
||||
from django.contrib.auth.decorators import login_required,user_passes_test
|
||||
from django.contrib.auth.decorators import login_required #,user_passes_test
|
||||
from rowers.decorators import user_passes_test
|
||||
from time import strftime,strptime,mktime,time,daylight
|
||||
import os,sys
|
||||
import datetime
|
||||
@@ -161,7 +162,7 @@ from scipy.signal import savgol_filter
|
||||
from django.shortcuts import render_to_response
|
||||
from Cookie import SimpleCookie
|
||||
from shutil import copyfile,move
|
||||
import types
|
||||
import mytypes
|
||||
from rowingdata import rower as rrower
|
||||
from rowingdata import main as rmain
|
||||
from rowingdata import rowingdata as rrdata
|
||||
@@ -630,7 +631,7 @@ def get_thumbnails(request,id):
|
||||
aantalcomments = len(comments)
|
||||
|
||||
workouttype = 'ote'
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
workouttype = 'otw'
|
||||
|
||||
try:
|
||||
@@ -2475,7 +2476,7 @@ def cum_flex_data(
|
||||
'includereststrokes':False,
|
||||
'rankingonly':False,
|
||||
'modality':'all',
|
||||
'waterboattype':types.waterboattype,
|
||||
'waterboattype':mytypes.waterboattype,
|
||||
'theuser':0,
|
||||
'xparam':'spm',
|
||||
'yparam1':'power',
|
||||
@@ -2504,7 +2505,7 @@ def cum_flex_data(
|
||||
enddatestring = keyvalue_get_default('enddatestring',options,def_options)
|
||||
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
@@ -2579,7 +2580,7 @@ def histo_data(
|
||||
'includereststrokes':False,
|
||||
'rankingonly':False,
|
||||
'modality':'all',
|
||||
'waterboattype':types.waterboattype,
|
||||
'waterboattype':mytypes.waterboattype,
|
||||
'theuser':0,
|
||||
'enddatestring':'',
|
||||
'startdatestring':'',
|
||||
@@ -2602,7 +2603,7 @@ def histo_data(
|
||||
enddatestring = keyvalue_get_default('enddatestring',options,def_options)
|
||||
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
@@ -2679,8 +2680,8 @@ def cum_flex(request,theuser=0,
|
||||
enddatestring="",
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
'workouttypes':[i[0] for i in types.workouttypes],
|
||||
'waterboattype':types.waterboattype,
|
||||
'workouttypes':[i[0] for i in mytypes.workouttypes],
|
||||
'waterboattype':mytypes.waterboattype,
|
||||
'rankingonly':False,
|
||||
}):
|
||||
|
||||
@@ -2691,7 +2692,7 @@ def cum_flex(request,theuser=0,
|
||||
if 'waterboattype' in request.session:
|
||||
waterboattype = request.session['waterboattype']
|
||||
else:
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if 'rankingonly' in request.session:
|
||||
@@ -2706,7 +2707,7 @@ def cum_flex(request,theuser=0,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
|
||||
@@ -2723,7 +2724,7 @@ def cum_flex(request,theuser=0,
|
||||
|
||||
workstrokesonly = not includereststrokes
|
||||
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if startdatestring != "":
|
||||
@@ -2757,12 +2758,12 @@ def cum_flex(request,theuser=0,
|
||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||
rankingonly = modalityform.cleaned_data['rankingonly']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
request.session['modalities'] = modalities
|
||||
@@ -2799,7 +2800,7 @@ def cum_flex(request,theuser=0,
|
||||
flexaxesform = FlexAxesForm(request,initial=initial)
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -2861,7 +2862,13 @@ def cum_flex(request,theuser=0,
|
||||
})
|
||||
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/",
|
||||
def planrequired_view(request):
|
||||
messages.info(request,"This functionality requires Coach or Self-Coach membership")
|
||||
|
||||
return render(request,'promembership.html')
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def fitnessmetric_view(request,id=0,mode='rower',
|
||||
startdate=timezone.now()-timezone.timedelta(days=365),
|
||||
@@ -2904,6 +2911,7 @@ def fitnessmetric_view(request,id=0,mode='rower',
|
||||
|
||||
# Show the EMpower Oarlock generated Stroke Profile
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership/",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_forcecurve_view(request,id=0,workstrokesonly=False):
|
||||
row = get_workout(id)
|
||||
@@ -3034,7 +3042,9 @@ def workout_histo_view(request,id=0):
|
||||
|
||||
|
||||
# Histogram for a date/time range
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def histo(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now(),
|
||||
@@ -3043,8 +3053,8 @@ def histo(request,theuser=0,
|
||||
enddatestring="",
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
'workouttypes':[i[0] for i in types.workouttypes],
|
||||
'waterboattype':types.waterboattype,
|
||||
'workouttypes':[i[0] for i in mytypes.workouttypes],
|
||||
'waterboattype':mytypes.waterboattype,
|
||||
'rankingonly': False,
|
||||
}):
|
||||
|
||||
@@ -3054,7 +3064,7 @@ def histo(request,theuser=0,
|
||||
if 'waterboattype' in request.session:
|
||||
waterboattype = request.session['waterboattype']
|
||||
else:
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if 'rankingonly' in request.session:
|
||||
@@ -3069,7 +3079,7 @@ def histo(request,theuser=0,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
|
||||
@@ -3086,7 +3096,7 @@ def histo(request,theuser=0,
|
||||
|
||||
workstrokesonly = not includereststrokes
|
||||
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if startdatestring != "":
|
||||
@@ -3119,12 +3129,12 @@ def histo(request,theuser=0,
|
||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||
rankingonly = modalityform.cleaned_data['rankingonly']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
request.session['modalities'] = modalities
|
||||
@@ -3151,7 +3161,7 @@ def histo(request,theuser=0,
|
||||
)
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -4090,7 +4100,9 @@ def rankings_view2(request,theuser=0,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_update_cp_view(request,id=0):
|
||||
row = get_workout(id)
|
||||
|
||||
@@ -4108,7 +4120,7 @@ def workout_update_cp_view(request,id=0):
|
||||
|
||||
dataprep.runcpupdate(r)
|
||||
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
url = reverse(otwrankings_view)
|
||||
else:
|
||||
url = reverse(oterankings_view)
|
||||
@@ -4116,7 +4128,9 @@ def workout_update_cp_view(request,id=0):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Show ranking distances including predicted paces
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def otwrankings_view(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now(),
|
||||
@@ -4519,7 +4533,9 @@ def otwcp_toadmin_view(request,theuser=0,
|
||||
return response
|
||||
|
||||
# Show ranking distances including predicted paces
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def oterankings_view(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now(),
|
||||
@@ -4950,7 +4966,9 @@ def workout_setprivate_view(request,id,
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Joining workout
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workouts_join_view(request):
|
||||
promember=0
|
||||
if not request.user.is_anonymous():
|
||||
@@ -4994,7 +5012,9 @@ def workouts_join_view(request):
|
||||
url = reverse(workouts_join_select)
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workouts_join_select(request,
|
||||
startdatestring="",
|
||||
enddatestring="",
|
||||
@@ -5013,7 +5033,7 @@ def workouts_join_select(request,
|
||||
if 'waterboattype' in request.session:
|
||||
waterboattype = request.session['waterboattype']
|
||||
else:
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if 'modalities' in request.session:
|
||||
@@ -5023,7 +5043,7 @@ def workouts_join_select(request,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
if request.method == 'POST' and 'daterange' in request.POST:
|
||||
@@ -5048,19 +5068,19 @@ def workouts_join_select(request,
|
||||
modality = modalityform.cleaned_data['modality']
|
||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
request.session['modalities'] = modalities
|
||||
request.session['waterboattype'] = waterboattype
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -5166,7 +5186,7 @@ def team_comparison_select(request,
|
||||
if 'waterboattype' in request.session:
|
||||
waterboattype = request.session['waterboattype']
|
||||
else:
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
if 'rankingonly' in request.session:
|
||||
rankingonly = request.session['rankingonly']
|
||||
@@ -5180,7 +5200,7 @@ def team_comparison_select(request,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
if request.method == 'POST':
|
||||
@@ -5198,12 +5218,12 @@ def team_comparison_select(request,
|
||||
modality = modalityform.cleaned_data['modality']
|
||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
if 'rankingonly' in modalityform.cleaned_data:
|
||||
@@ -5228,7 +5248,7 @@ def team_comparison_select(request,
|
||||
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -5451,7 +5471,9 @@ def multi_compare_view(request):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Multi Flex Chart with Grouping
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def user_multiflex_select(request,
|
||||
startdatestring="",
|
||||
enddatestring="",
|
||||
@@ -5494,7 +5516,7 @@ def user_multiflex_select(request,
|
||||
|
||||
waterboattype = request.session['waterboattype']
|
||||
else:
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
if 'rankingonly' in request.session:
|
||||
rankingonly = request.session['rankingonly']
|
||||
@@ -5509,7 +5531,7 @@ def user_multiflex_select(request,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
if request.method == 'POST':
|
||||
@@ -5527,12 +5549,12 @@ def user_multiflex_select(request,
|
||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||
rankingonly = modalityform.cleaned_data['rankingonly']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
request.session['modalities'] = modalities
|
||||
@@ -5561,7 +5583,7 @@ def user_multiflex_select(request,
|
||||
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -5649,7 +5671,9 @@ def user_multiflex_select(request,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def multiflex_data(request,userid=0,
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
@@ -5880,7 +5904,9 @@ def multiflex_data(request,userid=0,
|
||||
})
|
||||
|
||||
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def multiflex_view(request,userid=0,
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
@@ -6045,7 +6071,9 @@ def multiflex_view(request,userid=0,
|
||||
|
||||
|
||||
# Box plots
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def user_boxplot_select(request,
|
||||
startdatestring="",
|
||||
enddatestring="",
|
||||
@@ -6056,7 +6084,7 @@ def user_boxplot_select(request,
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
'workouttypes':['rower','dynamic','slides'],
|
||||
'waterboattype':types.waterboattype,
|
||||
'waterboattype':mytypes.waterboattype,
|
||||
'rankingonly':False,
|
||||
},
|
||||
userid=0):
|
||||
@@ -6093,7 +6121,7 @@ def user_boxplot_select(request,
|
||||
|
||||
workstrokesonly = not includereststrokes
|
||||
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if startdatestring != "":
|
||||
@@ -6122,11 +6150,11 @@ def user_boxplot_select(request,
|
||||
modality = optionsform.cleaned_data['modality']
|
||||
waterboattype = optionsform.cleaned_data['waterboattype']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
if 'rankingonly' in optionsform.cleaned_data:
|
||||
@@ -6149,14 +6177,14 @@ def user_boxplot_select(request,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
|
||||
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -6176,7 +6204,7 @@ def user_boxplot_select(request,
|
||||
startdate = s
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -6188,7 +6216,7 @@ def user_boxplot_select(request,
|
||||
).order_by(
|
||||
"-date", "-starttime"
|
||||
).exclude(boattype__in=negtypes)
|
||||
# workouttypes = [w for w in workouttypes if w not in types.otwtypes]
|
||||
# workouttypes = [w for w in workouttypes if w not in mytypes.otwtypes]
|
||||
|
||||
if rankingonly:
|
||||
workouts = [w for w in workouts if w.rankingpiece]
|
||||
@@ -6247,7 +6275,9 @@ def user_boxplot_select(request,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def boxplot_view_data(request,userid=0,
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
@@ -6344,7 +6374,9 @@ def boxplot_view_data(request,userid=0,
|
||||
"div":div,
|
||||
})
|
||||
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def boxplot_view(request,userid=0,
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
@@ -6645,7 +6677,9 @@ def workouts_view(request,message='',successmessage='',
|
||||
|
||||
|
||||
# List of workouts to compare a selected workout to
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_comparison_list(request,id=0,message='',successmessage='',
|
||||
startdatestring="",enddatestring="",
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
@@ -6725,7 +6759,9 @@ def workout_comparison_list(request,id=0,message='',successmessage='',
|
||||
|
||||
|
||||
# List of workouts to compare a selected workout to
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_fusion_list(request,id=0,message='',successmessage='',
|
||||
startdatestring="",enddatestring="",
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
@@ -6917,7 +6953,9 @@ def workout_view(request,id=0):
|
||||
|
||||
|
||||
# Resets stroke data to raw data (pace)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_undo_smoothenpace_view(
|
||||
request,id=0,message="",successmessage=""
|
||||
):
|
||||
@@ -6954,7 +6992,9 @@ def workout_undo_smoothenpace_view(
|
||||
|
||||
|
||||
# Data smoothing of pace data
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
||||
row = get_workout(id)
|
||||
|
||||
@@ -7003,7 +7043,9 @@ def workout_smoothenpace_view(request,id=0,message="",successmessage=""):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Process CrewNerd Summary CSV and update summary
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
@@ -7078,7 +7120,9 @@ def workout_crewnerd_summary_view(request,id=0,message="",successmessage=""):
|
||||
'id':row.id})
|
||||
|
||||
# Get weather for given location and date/time
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Pro plan or higher",
|
||||
redirect_field_name=None)
|
||||
def workout_downloadwind_view(request,id=0,
|
||||
airportcode=None,
|
||||
message="",successmessage=""):
|
||||
@@ -7144,7 +7188,7 @@ def workout_downloadwind_view(request,id=0,
|
||||
return response
|
||||
|
||||
# Get weather for given location and date/time
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
|
||||
def workout_downloadmetar_view(request,id=0,
|
||||
airportcode=None,
|
||||
message="",successmessage=""):
|
||||
@@ -7211,7 +7255,7 @@ def workout_downloadmetar_view(request,id=0,
|
||||
|
||||
|
||||
# Show form to update wind data
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
|
||||
def workout_wind_view(request,id=0,message="",successmessage=""):
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
@@ -7347,7 +7391,7 @@ def workout_wind_view(request,id=0,message="",successmessage=""):
|
||||
|
||||
|
||||
# Show form to update River stream data (for river dwellers)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
|
||||
def workout_stream_view(request,id=0,message="",successmessage=""):
|
||||
row = get_workout(id)
|
||||
r = getrower(request.user)
|
||||
@@ -7668,7 +7712,7 @@ def workout_geeky_view(request,id=0,message="",successmessage=""):
|
||||
messages.error(request,message)
|
||||
messages.info(request,successmessage)
|
||||
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
return render(request,
|
||||
'otwgeeky.html',
|
||||
{'workout':row,
|
||||
@@ -7742,7 +7786,7 @@ def instroke_chart(request,id=0,metric=''):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Cumulative stats page
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
|
||||
def cumstats(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=30),
|
||||
enddate=timezone.now(),
|
||||
@@ -7752,7 +7796,7 @@ def cumstats(request,theuser=0,
|
||||
options={
|
||||
'includereststrokes':False,
|
||||
'workouttypes':['rower','dynamic','slides'],
|
||||
'waterboattype':types.waterboattype,
|
||||
'waterboattype':mytypes.waterboattype,
|
||||
'rankingonly':False,
|
||||
}):
|
||||
|
||||
@@ -7762,7 +7806,7 @@ def cumstats(request,theuser=0,
|
||||
if 'waterboattype' in request.session:
|
||||
waterboattype = request.session['waterboattype']
|
||||
else:
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if 'rankingonly' in request.session:
|
||||
@@ -7777,7 +7821,7 @@ def cumstats(request,theuser=0,
|
||||
else:
|
||||
modality = modalities[0]
|
||||
else:
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
modality = 'all'
|
||||
|
||||
|
||||
@@ -7794,7 +7838,7 @@ def cumstats(request,theuser=0,
|
||||
|
||||
workstrokesonly = not includereststrokes
|
||||
|
||||
waterboattype = types.waterboattype
|
||||
waterboattype = mytypes.waterboattype
|
||||
|
||||
|
||||
if startdatestring != "":
|
||||
@@ -7829,12 +7873,12 @@ def cumstats(request,theuser=0,
|
||||
waterboattype = modalityform.cleaned_data['waterboattype']
|
||||
rankingonly = modalityform.cleaned_data['rankingonly']
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
if modality != 'water':
|
||||
waterboattype = [b[0] for b in types.boattypes]
|
||||
waterboattype = [b[0] for b in mytypes.boattypes]
|
||||
|
||||
|
||||
request.session['modalities'] = modalities
|
||||
@@ -7861,7 +7905,7 @@ def cumstats(request,theuser=0,
|
||||
)
|
||||
|
||||
negtypes = []
|
||||
for b in types.boattypes:
|
||||
for b in mytypes.boattypes:
|
||||
if b[0] not in waterboattype:
|
||||
negtypes.append(b[0])
|
||||
|
||||
@@ -7887,7 +7931,7 @@ def cumstats(request,theuser=0,
|
||||
|
||||
|
||||
if modality == 'all':
|
||||
modalities = [m[0] for m in types.workouttypes]
|
||||
modalities = [m[0] for m in mytypes.workouttypes]
|
||||
else:
|
||||
modalities = [modality]
|
||||
|
||||
@@ -8347,7 +8391,7 @@ def workout_advanced_view(request,id=0,message="",successmessage=""):
|
||||
messages.info(request,successmessage)
|
||||
|
||||
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
return render(request,
|
||||
'advancedotw.html',
|
||||
{'workout':row,
|
||||
@@ -8620,7 +8664,7 @@ def workout_workflow_view(request,id):
|
||||
aantalcomments = len(comments)
|
||||
|
||||
workouttype = 'ote'
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
workouttype = 'otw'
|
||||
|
||||
try:
|
||||
@@ -8730,7 +8774,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
|
||||
mayedit=1
|
||||
|
||||
workouttype = 'ote'
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
workouttype = 'otw'
|
||||
|
||||
try:
|
||||
@@ -8904,7 +8948,7 @@ def workout_flexchart3_view(request,*args,**kwargs):
|
||||
noylist = ["time","distance"]
|
||||
axchoicesbasic.pop("cumdist")
|
||||
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
for name,d in rowingmetrics:
|
||||
if d['mode'] == 'erg':
|
||||
axchoicespro.pop(name)
|
||||
@@ -11507,7 +11551,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
|
||||
r.pw_tr,r.pw_an])/r.ftp
|
||||
|
||||
ftp = float(r.ftp)
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
ftp = ftp*(100.-r.otwslack)/100.
|
||||
|
||||
rr = rrower(hrmax=r.max,hrut2=r.ut2,
|
||||
@@ -11542,7 +11586,7 @@ def workout_summary_restore_view(request,id,message="",successmessage=""):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
# Split a workout
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
|
||||
def workout_split_view(request,id=id):
|
||||
row = get_workout_permitted(request.user,id)
|
||||
|
||||
@@ -11633,7 +11677,7 @@ def workout_split_view(request,id=id):
|
||||
|
||||
|
||||
# Fuse two workouts
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",redirect_field_name=None)
|
||||
@user_passes_test(ispromember,login_url="/rowers/promembership",message="This functionality requires a Pro plan or higher",redirect_field_name=None)
|
||||
def workout_fusion_view(request,id1=0,id2=1):
|
||||
|
||||
r = getrower(request.user)
|
||||
@@ -11746,7 +11790,7 @@ def workout_summary_edit_view(request,id,message="",successmessage=""
|
||||
r.pw_tr,r.pw_an])/r.ftp
|
||||
|
||||
ftp = float(r.ftp)
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
ftp = ftp*(100.-r.otwslack)/100.
|
||||
|
||||
rr = rrower(hrmax=r.max,hrut2=r.ut2,
|
||||
@@ -13038,7 +13082,7 @@ def strokedatajson(request,id):
|
||||
r.pw_tr,r.pw_an])/r.ftp
|
||||
|
||||
ftp = float(r.ftp)
|
||||
if row.workouttype in types.otwtypes:
|
||||
if row.workouttype in mytypes.otwtypes:
|
||||
ftp = ftp*(100.-r.otwslack)/100.
|
||||
|
||||
rr = rrower(hrmax=r.max,hrut2=r.ut2,
|
||||
@@ -13755,6 +13799,7 @@ def agegrouprecordview(request,sex='male',weightcategory='hwt',
|
||||
|
||||
# Cloning sessions
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def plannedsession_multiclone_view(
|
||||
request,
|
||||
@@ -13867,6 +13912,7 @@ def plannedsession_multiclone_view(
|
||||
|
||||
# Individual user creates training for himself
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def plannedsession_create_view(request,
|
||||
userid=0):
|
||||
@@ -14000,6 +14046,7 @@ def plannedsession_create_view(request,
|
||||
})
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def plannedsession_multicreate_view(request,
|
||||
teamid=0,userid=0,extrasessions=0):
|
||||
@@ -14709,6 +14756,7 @@ def plannedsessions_manage_view(request,userid=0,
|
||||
# Clone an existing planned session
|
||||
# need clarity on cloning behavior time shift
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def plannedsession_clone_view(request,id=0,userid=0):
|
||||
|
||||
@@ -14772,6 +14820,7 @@ def plannedsession_clone_view(request,id=0,userid=0):
|
||||
|
||||
# Edit an existing planned session
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership/",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def plannedsession_edit_view(request,id=0,userid=0):
|
||||
|
||||
@@ -15281,12 +15330,12 @@ def virtualevent_view(request,id=0):
|
||||
try:
|
||||
boattype = cd['boattype']
|
||||
except KeyError:
|
||||
boattype = types.waterboattype
|
||||
boattype = mytypes.waterboattype
|
||||
|
||||
try:
|
||||
boatclass = cd['boatclass']
|
||||
except KeyError:
|
||||
boatclass = [t for t in types.otwtypes]
|
||||
boatclass = [t for t in mytypes.otwtypes]
|
||||
|
||||
age_min = cd['age_min']
|
||||
age_max = cd['age_max']
|
||||
@@ -15403,7 +15452,7 @@ def virtualevent_addboat_view(request,id=0):
|
||||
|
||||
boattypes = [record.boattype for record in records]
|
||||
boatclasses = [record.boatclass for record in records]
|
||||
allowedboats = tuple([ type for type in types.boattypes if type[0] not in boattypes] )
|
||||
allowedboats = tuple([ type for type in mytypes.boattypes if type[0] not in boattypes] )
|
||||
|
||||
|
||||
# we're still here
|
||||
@@ -15908,7 +15957,9 @@ def virtualevent_submit_result_view(request,id=0):
|
||||
'w_form':w_form,
|
||||
})
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership", redirect_field_name=None)
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def rower_create_trainingplan(request,userid=0):
|
||||
|
||||
therower = getrequestrower(request,userid=userid)
|
||||
@@ -15979,7 +16030,9 @@ def rower_create_trainingplan(request,userid=0):
|
||||
'targetform':targetform,
|
||||
})
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership", redirect_field_name=None)
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def rower_delete_trainingtarget(request,id=0):
|
||||
try:
|
||||
target = TrainingTarget.objects.get(id=id)
|
||||
@@ -15997,7 +16050,9 @@ def rower_delete_trainingtarget(request,id=0):
|
||||
return HttpResponseRedirect(url)
|
||||
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership", redirect_field_name=None)
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def rower_delete_trainingplan(request,id=0):
|
||||
try:
|
||||
plan = TrainingPlan.objects.get(id=id)
|
||||
@@ -16224,6 +16279,7 @@ class WorkoutDelete(DeleteView):
|
||||
]
|
||||
|
||||
mayedit=0
|
||||
promember=0
|
||||
if not self.request.user.is_anonymous():
|
||||
r = getrower(self.request.user)
|
||||
result = self.request.user.is_authenticated() and ispromember(self.request.user)
|
||||
@@ -16306,7 +16362,9 @@ class MacroCycleDelete(DeleteView):
|
||||
return obj
|
||||
|
||||
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership", redirect_field_name=None)
|
||||
@user_passes_test(hasplannedsessions,login_url="/rowers/promembership",
|
||||
message="This functionality requires a Coach or Self-Coach plan",
|
||||
redirect_field_name=None)
|
||||
def rower_trainingplan_view(request,
|
||||
id=0,
|
||||
userid=0,
|
||||
|
||||
Reference in New Issue
Block a user