Private
Public Access
1
0

verbeteringen

This commit is contained in:
2024-04-13 10:41:22 +02:00
parent cc611f049b
commit 2b90c9bfea
5 changed files with 2 additions and 506 deletions

View File

@@ -2763,348 +2763,6 @@ def workout_downloadmetar_view(request, id=0,
return response
# Show form to update wind data
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
@user_passes_test(ispromember,
login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher."
" If you are already a Pro user, please log in to access this functionality",
redirect_field_name=None)
def workout_wind_view(request, id=0, message="", successmessage=""):
row = get_workoutuser(id, request)
r = getrower(request.user)
breadcrumbs = [
{
'url': '/rowers/list-workouts/',
'name': 'Workouts'
},
{
'url': get_workout_default_page(request, id),
'name': row.name
},
{
'url': reverse('workout_wind_view', kwargs={'id': id}),
'name': 'Wind'
}
]
# get data
f1 = row.csvfilename
u = row.user.user
r = getrower(u)
# create bearing
rowdata = rdata(csvfile=f1)
if row == 0: # pragma: no cover
return HttpResponse("Error: CSV Data File Not Found")
hascoordinates = 1
try:
latitude = rowdata.df.loc[:, ' latitude']
except KeyError:
hascoordinates = 0
if hascoordinates and not latitude.std(): # pragma: no cover
hascoordinates = 0
try:
_ = rowdata.df.loc[:, 'bearing'].values
except KeyError:
rowdata.add_bearing()
rowdata.write_csv(f1, gzip=True)
if hascoordinates:
avglat = rowdata.df[' latitude'].mean()
avglon = rowdata.df[' longitude'].mean()
airportcode, newlat, newlon, airportdistance = get_airport_code(
avglat, avglon)
airportcode = airportcode.upper()
airportdistance = airportdistance[0]
else:
airportcode = 'UNKNOWN'
airportdistance = 0
if request.method == 'POST':
# process form
form = UpdateWindForm(request.POST)
if form.is_valid():
vwind1 = form.cleaned_data['vwind1']
vwind2 = form.cleaned_data['vwind2']
dist1 = form.cleaned_data['dist1']
dist2 = form.cleaned_data['dist2']
winddirection1 = form.cleaned_data['winddirection1']
winddirection2 = form.cleaned_data['winddirection2']
windunit = form.cleaned_data['windunit']
rowdata.update_wind(vwind1, vwind2,
winddirection1,
winddirection2,
dist1, dist2,
units=windunit)
rowdata.write_csv(f1, gzip=True)
else: # pragma: no cover
message = "Invalid Form"
messages.error(request, message)
kwargs = {
'id': id
}
url = reverse('workout_wind_view', kwargs=kwargs)
_ = HttpResponseRedirect(url)
else:
form = UpdateWindForm()
# create interactive plot
res = interactive_windchart(encoder.decode_hex(id), promember=1)
script = res[0]
div = res[1]
if hascoordinates:
gmscript, gmdiv = leaflet_chart(
rowdata.df[' latitude'],
rowdata.df[' longitude'],
row.name)
else:
gmscript = ""
gmdiv = "No GPS data available"
messages.info(request, successmessage)
messages.error(request, message)
return render(request,
'windedit.html',
{'workout': row,
'rower': r,
'breadcrumbs': breadcrumbs,
'active': 'nav-workouts',
'teams': get_my_teams(request.user),
'interactiveplot': script,
'form': form,
'airport': airportcode,
'airportdistance': airportdistance,
'the_div': div,
'gmap': gmscript,
'gmapdiv': gmdiv})
# Show form to update River stream data (for river dwellers)
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
@user_passes_test(ispromember,
login_url="/rowers/paidplans",
message="This functionality requires a Pro plan or higher."
" If you are already a Pro user, please log in to access this functionality",
redirect_field_name=None)
def workout_stream_view(request, id=0, message="", successmessage=""):
row = get_workoutuser(id, request)
r = getrower(request.user)
# create interactive plot
f1 = row.csvfilename
u = row.user.user
r = getrower(u)
rowdata = rdata(csvfile=f1)
if rowdata == 0: # pragma: no cover
messages.info(request, "Error: CSV data file not found")
url = reverse('workout_edit_view', kwargs={
'id': encoder.encode_hex(row.id)})
return HttpResponseRedirect(url)
if request.method == 'POST':
# process form
form = UpdateStreamForm(request.POST)
if form.is_valid():
dist1 = form.cleaned_data['dist1']
dist2 = form.cleaned_data['dist2']
stream1 = form.cleaned_data['stream1']
stream2 = form.cleaned_data['stream2']
streamunit = form.cleaned_data['streamunit']
rowdata.update_stream(stream1, stream2, dist1, dist2,
units=streamunit)
rowdata.write_csv(f1, gzip=True)
else: # pragma: no cover
message = "Invalid Form"
messages.error(request, message)
kwargs = {
'id': id}
url = reverse('workout_wind_view', kwargs=kwargs)
_ = HttpResponseRedirect(url)
else:
form = UpdateStreamForm()
# create interactive plot
res = interactive_streamchart(encoder.decode_hex(id), promember=1)
script = res[0]
div = res[1]
breadcrumbs = [
{
'url': '/rowers/list-workouts/',
'name': 'Workouts'
},
{
'url': get_workout_default_page(request, id),
'name': row.name
},
{
'url': reverse('workout_stream_view', kwargs={'id': id}),
'name': 'Stream'
}
]
messages.info(request, successmessage)
messages.error(request, message)
return render(request,
'streamedit.html',
{'workout': row,
'rower': r,
'breadcrumbs': breadcrumbs,
'active': 'nav-workouts',
'teams': get_my_teams(request.user),
'interactiveplot': script,
'form': form,
'the_div': div})
# Form to set average crew weight and boat type, then run power calcs
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
@user_passes_test(ispromember, login_url="/rowers/paidplans", redirect_field_name=None)
def workout_otwsetpower_view(request, id=0, message="", successmessage=""):
w = get_workoutuser(id, request)
r = getrower(request.user)
mayedit = 1
if request.method == 'POST':
# process form
form = AdvancedWorkoutForm(request.POST)
if form.is_valid():
boattype = form.cleaned_data['boattype']
weightvalue = form.cleaned_data['weightvalue']
coastalbrand = form.cleaned_data['boatbrand']
boatclass = w.workouttype
w.boattype = boattype
w.weightvalue = weightvalue
w.boatbrand = coastalbrand
w.save()
# load row data & create power/wind/bearing columns if not set
f1 = w.csvfilename
rowdata = rdata(csvfile=f1)
if rowdata == 0: # pragma: no cover
return HttpResponse("Error: CSV Data File Not Found")
try:
_ = rowdata.df['vstream']
except KeyError:
rowdata.add_stream(0)
rowdata.write_csv(f1, gzip=True)
try:
_ = rowdata.df['bearing']
except KeyError:
rowdata.add_bearing()
rowdata.write_csv(f1, gzip=True)
try:
_ = rowdata.df['vwind']
except KeyError:
rowdata.add_wind(0, 0)
rowdata.write_csv(f1, gzip=True)
# do power calculation (asynchronous)
r = w.user
u = r.user
first_name = u.first_name
last_name = u.last_name
emailaddress = u.email
job = myqueue(queue,
handle_otwsetpower, f1, boattype, boatclass, coastalbrand,
weightvalue,
first_name, last_name, emailaddress, encoder.decode_hex(
id),
ps=[r.p0, r.p1, r.p2, r.p3],
ratio=r.cpratio,
# quick_calc = quick_calc,
# go_service=go_service,
emailbounced=r.emailbounced
)
try:
request.session['async_tasks'] += [(job.id, 'otwsetpower')]
except KeyError:
request.session['async_tasks'] = [(job.id, 'otwsetpower')]
successmessage = 'Your calculations have been submitted." \
" You will receive an email when they are done." \
" You can check the status of your calculations" \
" <a href="/rowers/jobs-status/" target="_blank">here</a>'
messages.info(request, successmessage)
kwargs = {
'id': id}
try:
url = request.session['referer']
except KeyError:
url = reverse('workout_edit_view', kwargs=kwargs)
response = HttpResponseRedirect(url)
return response
else: # pragma: no cover
message = "Invalid Form"
messages.error(request, message)
kwargs = {
'id': id}
url = reverse('workout_otwsetpower_view', kwargs=kwargs)
response = HttpResponseRedirect(url)
else:
form = AdvancedWorkoutForm(instance=w)
breadcrumbs = [
{
'url': '/rowers/list-workouts/',
'name': 'Workouts'
},
{
'url': get_workout_default_page(request, id),
'name': w.name
},
{
'url': reverse('workout_otwsetpower_view', kwargs={'id': id}),
'name': 'OTW Power'
}
]
messages.error(request, message)
messages.info(request, successmessage)
return render(request,
'otwsetpower.html',
{'workout': w,
'rower': w,
'mayedit': mayedit,
'active': 'nav-workouts',
'breadcrumbs': breadcrumbs,
'teams': get_my_teams(request.user),
'form': form,
})
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
@@ -4501,57 +4159,6 @@ def workout_flexchart_stacked_view(request, *args, **kwargs):
# The interactive plot with wind corrected pace for OTW outings
def workout_otwpowerplot_view(request, id=0, message="", successmessage=""):
w = get_workout(id)
r = getrower(request.user)
breadcrumbs = [
{
'url': '/rowers/list-workouts/',
'name': 'Workouts'
},
{
'url': get_workout_default_page(request, id),
'name': w.name
},
{
'url': reverse('workout_otwpowerplot_view', kwargs={'id': id}),
'name': 'Interactive OTW Power Plot'
}
]
# check if user is owner of this workout
# create interactive plot
promember = 0
mayedit = 0
result = request.user.is_authenticated and ispromember(request.user)
if result:
promember = 1
if request.user == w.user.user:
mayedit = 1
# create interactive plot
res = interactive_otw_advanced_pace_chart(
encoder.decode_hex(id), promember=promember)
script = res[0]
div = res[1]
messages.error(request, message)
messages.info(request, successmessage)
return render(request,
'otwinteractive.html',
{'workout': w,
'rower': r,
'active': 'nav-workouts',
'breadcrumbs': breadcrumbs,
'teams': get_my_teams(request.user),
'interactiveplot': script,
'the_div': div,
'mayedit': mayedit})
#