does Alternative OTE ranking
added an OTE ranking piece calculator based on manually added ranking instead of automatically detected ranking
This commit is contained in:
224
rowers/views.py
224
rowers/views.py
@@ -3091,6 +3091,228 @@ def otwrankings_view(request,theuser=0,
|
||||
powerdf.drop_duplicates(subset='Delta',keep='first',inplace=True)
|
||||
|
||||
|
||||
# create interactive plot
|
||||
if len(powerdf) !=0 :
|
||||
res = interactive_otwcpchart(powerdf,promember=promember)
|
||||
script = res[0]
|
||||
div = res[1]
|
||||
p1 = res[2]
|
||||
ratio = res[3]
|
||||
r.p0 = p1[0]
|
||||
r.p1 = p1[1]
|
||||
r.p2 = p1[2]
|
||||
r.p3 = p1[3]
|
||||
r.cpratio = ratio
|
||||
r.save()
|
||||
paulslope = 1
|
||||
paulintercept = 1
|
||||
message = res[4]
|
||||
else:
|
||||
script = ''
|
||||
div = '<p>No ranking pieces found.</p>'
|
||||
paulslope = 1
|
||||
paulintercept = 1
|
||||
p1 = [1,1,1,1]
|
||||
message = ""
|
||||
|
||||
|
||||
if request.method == 'POST' and "piece" in request.POST:
|
||||
form = PredictedPieceForm(request.POST)
|
||||
clean = form.is_valid()
|
||||
value = form.cleaned_data['value']
|
||||
hourvalue,value = divmod(value,60)
|
||||
hourvalue = int(hourvalue)
|
||||
minutevalue = int(value)
|
||||
value = int(60*(value-minutevalue))
|
||||
if hourvalue >= 24:
|
||||
hourvalue = 23
|
||||
rankingdurations.append(datetime.time(minute=minutevalue,
|
||||
hour=hourvalue,
|
||||
second=value))
|
||||
else:
|
||||
form = PredictedPieceForm()
|
||||
|
||||
|
||||
cpredictions = []
|
||||
|
||||
for rankingduration in rankingdurations:
|
||||
t = 3600.*rankingduration.hour
|
||||
t += 60.*rankingduration.minute
|
||||
t += rankingduration.second
|
||||
t += rankingduration.microsecond/1.e6
|
||||
|
||||
|
||||
# CP model
|
||||
pwr = p1[0]/(1+t/p1[2])
|
||||
pwr += p1[1]/(1+t/p1[3])
|
||||
|
||||
|
||||
if pwr <= 0:
|
||||
pwr = 50.
|
||||
|
||||
|
||||
if not np.isnan(pwr):
|
||||
try:
|
||||
pwr2 = pwr*ratio
|
||||
except:
|
||||
pwr2 = pwr
|
||||
|
||||
a = {
|
||||
'duration':timedeltaconv(t),
|
||||
'power':int(pwr),
|
||||
'upper':int(pwr2)}
|
||||
cpredictions.append(a)
|
||||
|
||||
|
||||
del form.fields["pieceunit"]
|
||||
|
||||
messages.error(request,message)
|
||||
return render(request, 'otwrankings.html',
|
||||
{'rankingworkouts':theworkouts,
|
||||
'interactiveplot':script,
|
||||
'the_div':div,
|
||||
'cpredictions':cpredictions,
|
||||
'avgpower':avgpower,
|
||||
'form':form,
|
||||
'dateform':dateform,
|
||||
'deltaform':deltaform,
|
||||
'id': theuser,
|
||||
'theuser':uu,
|
||||
'startdate':startdate,
|
||||
'enddate':enddate,
|
||||
'teams':get_my_teams(request.user),
|
||||
})
|
||||
# Show ranking distances including predicted paces
|
||||
@user_passes_test(ispromember,login_url="/",redirect_field_name=None)
|
||||
def oterankings_view(request,theuser=0,
|
||||
startdate=timezone.now()-datetime.timedelta(days=365),
|
||||
enddate=timezone.now(),
|
||||
deltadays=-1,
|
||||
startdatestring="",
|
||||
enddatestring=""):
|
||||
|
||||
if deltadays>0:
|
||||
startdate = enddate-datetime.timedelta(days=int(deltadays))
|
||||
|
||||
if startdatestring != "":
|
||||
startdate = iso8601.parse_date(startdatestring)
|
||||
|
||||
if enddatestring != "":
|
||||
enddate = iso8601.parse_date(enddatestring)
|
||||
|
||||
if enddate < startdate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
|
||||
if theuser == 0:
|
||||
theuser = request.user.id
|
||||
|
||||
promember=0
|
||||
if not request.user.is_anonymous():
|
||||
r = Rower.objects.get(user=request.user)
|
||||
result = request.user.is_authenticated() and ispromember(request.user)
|
||||
if result:
|
||||
promember=1
|
||||
|
||||
# get all OTW rows in date range
|
||||
|
||||
# process form
|
||||
if request.method == 'POST' and "daterange" in request.POST:
|
||||
dateform = DateRangeForm(request.POST)
|
||||
deltaform = DeltaDaysForm(request.POST)
|
||||
if dateform.is_valid():
|
||||
startdate = dateform.cleaned_data['startdate']
|
||||
enddate = dateform.cleaned_data['enddate']
|
||||
if startdate > enddate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
elif request.method == 'POST' and "datedelta" in request.POST:
|
||||
deltaform = DeltaDaysForm(request.POST)
|
||||
if deltaform.is_valid():
|
||||
deltadays = deltaform.cleaned_data['deltadays']
|
||||
if deltadays:
|
||||
enddate = timezone.now()
|
||||
startdate = enddate-datetime.timedelta(days=deltadays)
|
||||
if startdate > enddate:
|
||||
s = enddate
|
||||
enddate = startdate
|
||||
startdate = s
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
else:
|
||||
dateform = DateRangeForm()
|
||||
deltaform = DeltaDaysForm()
|
||||
|
||||
else:
|
||||
dateform = DateRangeForm(initial={
|
||||
'startdate': startdate,
|
||||
'enddate': enddate,
|
||||
})
|
||||
deltaform = DeltaDaysForm()
|
||||
|
||||
# get all 2k (if any) - this rower, in date range
|
||||
try:
|
||||
r = Rower.objects.get(user=theuser)
|
||||
except Rower.DoesNotExist:
|
||||
allergworkouts = []
|
||||
r=0
|
||||
|
||||
|
||||
try:
|
||||
uu = User.objects.get(id=theuser)
|
||||
except User.DoesNotExist:
|
||||
uu = ''
|
||||
|
||||
|
||||
# test to fix bug
|
||||
startdate = datetime.datetime.combine(startdate,datetime.time())
|
||||
enddate = datetime.datetime.combine(enddate,datetime.time(23,59,59))
|
||||
enddate = enddate+datetime.timedelta(days=1)
|
||||
|
||||
|
||||
rankingdurations = []
|
||||
rankingdurations.append(datetime.time(minute=1))
|
||||
rankingdurations.append(datetime.time(minute=4))
|
||||
rankingdurations.append(datetime.time(minute=30))
|
||||
rankingdurations.append(datetime.time(hour=1))
|
||||
rankingdurations.append(datetime.time(hour=1,minute=15))
|
||||
|
||||
thedistances = []
|
||||
theworkouts = []
|
||||
thesecs = []
|
||||
|
||||
theworkouts = Workout.objects.filter(user=r,rankingpiece=True,
|
||||
workouttype__in=[
|
||||
'rower',
|
||||
'dynamic',
|
||||
'slides'
|
||||
],
|
||||
startdatetime__gte=startdate,
|
||||
startdatetime__lte=enddate)
|
||||
|
||||
|
||||
delta,cpvalue,avgpower = dataprep.fetchcp(
|
||||
r,theworkouts,table='cpergdata'
|
||||
)
|
||||
|
||||
powerdf = pd.DataFrame({
|
||||
'Delta':delta,
|
||||
'CP':cpvalue,
|
||||
})
|
||||
|
||||
if powerdf.empty:
|
||||
messages.info(request,'Your calculations are running in the background. Please reload this page.')
|
||||
|
||||
powerdf = powerdf[powerdf['CP']>0]
|
||||
powerdf.dropna(axis=0,inplace=True)
|
||||
powerdf.sort_values(['Delta','CP'],ascending=[1,0],inplace=True)
|
||||
powerdf.drop_duplicates(subset='Delta',keep='first',inplace=True)
|
||||
|
||||
|
||||
# create interactive plot
|
||||
if len(powerdf) !=0 :
|
||||
res = interactive_otwcpchart(powerdf,promember=promember)
|
||||
@@ -6630,7 +6852,7 @@ def workout_edit_view(request,id=0,message="",successmessage=""):
|
||||
successmessage = "Changes saved"
|
||||
|
||||
if rankingpiece:
|
||||
dataprep.runcpupdate(row.user)
|
||||
dataprep.runcpupdate(row.user,type=row.workouttype)
|
||||
|
||||
messages.info(request,successmessage)
|
||||
url = reverse(workout_edit_view,
|
||||
|
||||
Reference in New Issue
Block a user