Private
Public Access
1
0
This commit is contained in:
Sander Roosendaal
2022-02-15 14:06:45 +01:00
parent 3d0d7c6e7e
commit 38a10a4a90
4 changed files with 179 additions and 273 deletions

View File

@@ -1,45 +1,30 @@
from rowers.views.statements import *
from django.core.exceptions import PermissionDenied
from django.http import HttpResponse
from django.test import SimpleTestCase, override_settings
from django.urls import path
def servererror_view(request): # pragma: no cover
raise ValueError
# Custom error pages with Rowsandall headers
def error500_view(request):
response = render(request, '500.html', {}, status=500)
# context_instance = RequestContext(request))
response.status_code = 500
return response
def error404_view(request, exception):
response = render(request, '404.html', {}, status=404)
# context_instance = RequestContext(request))
response.status_code = 404
return response
def error400_view(request, exception):
response = render(request, '400.html', {}, status=400)
# context_instance = RequestContext(request))
response.status_code = 400
return response
def error403_view(request, *args, **kwargs): # pragma: no cover
response = render(request, '403.html', {}, status=403)
# context_instance = RequestContext(request))
response.status_code = 403
return response

View File

@@ -138,8 +138,6 @@ def course_map_view(request, id=0):
def course_delete_view(request, id=0):
course = get_object_or_404(GeoCourse, pk=id)
r = getrower(request.user)
ps = PlannedSession.objects.filter(course=course)
nosessions = len(ps) == 0
@@ -590,7 +588,7 @@ def course_update_confirm(request, id=0, newid=0):
if form.is_valid():
doupdate = form.cleaned_data['doupdate']
if doupdate:
res = courses.replacecourse(course, course2)
_ = courses.replacecourse(course, course2)
messages.info(
request, 'All challenges with this course are updated')
url = reverse(course_view,
@@ -711,10 +709,6 @@ def course_upload_view(request):
@login_required()
def standard_deactivate_view(request, id=0):
is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
r = getrower(request.user)
try:
collection = StandardCollection.objects.get(id=id)
except StandardCollection.DoesNotExist: # pragma: no cover
@@ -758,7 +752,6 @@ def standards_download_view(request, id=0):
@login_required()
def standards_upload_view(request, id=0):
is_ajax = request.META.get('HTTP_X_REQUESTED_WITH') == 'XMLHttpRequest'
r = getrower(request.user)
if id != 0: # pragma: no cover
collection = StandardCollection.objects.get(id=id)
@@ -984,9 +977,9 @@ def virtualevent_disqualify_view(request, id=0, recordid=0):
r = Rower.objects.get(id=record.userid)
name = record.username
job = myqueue(queue, handle_send_disqualification_email,
r.user.email, name,
disqualifier, message, race.name)
_ = myqueue(queue, handle_send_disqualification_email,
r.user.email, name,
disqualifier, message, race.name)
messages.info(
request, "We have invalidated the result for: "+str(record))
@@ -1098,6 +1091,7 @@ def virtualevent_disqualify_view(request, id=0, recordid=0):
'mapdiv': mapdiv,
'form': form,
'race': race,
'breadcrumbs': breadcrumbs,
'record': record,
})
@@ -1140,9 +1134,9 @@ def virtualevent_withdrawresult_view(request, id=0, recordid=0):
r = Rower.objects.get(id=record.userid)
name = record.username
job = myqueue(queue, handle_send_withdraw_email,
r.user.email, name,
disqualifier, message, race.name)
_ = myqueue(queue, handle_send_withdraw_email,
r.user.email, name,
disqualifier, message, race.name)
messages.info(
request, "We have invalidated the result for: "+str(record))
@@ -1252,6 +1246,7 @@ def virtualevent_withdrawresult_view(request, id=0, recordid=0):
'mapdiv': mapdiv,
'form': form,
'race': race,
'breadcrumbs': breadcrumbs,
'record': record,
})
@@ -1473,8 +1468,6 @@ def do_encode(x):
@login_required()
@permission_required('virtualevent.change_race', fn=get_virtualevent_by_pk, raise_exception=True)
def virtualevent_results_download_view(request, id=0):
r = getrower(request.user)
try:
race = VirtualRace.objects.get(id=id)
except VirtualRace.DoesNotExist: # pragma: no cover
@@ -1538,12 +1531,6 @@ def virtualevent_ranking_view(request, id=0):
workoutid__isnull=True,
)
dnf = resultobj.objects.filter(
race=race,
workoutid__isnull=False,
coursecompleted=False,
)
if not request.user.is_anonymous:
if race_can_register(r, race): # pragma: no cover
buttons += ['registerbutton']
@@ -1745,8 +1732,6 @@ 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 mytypes.boattypes if type[0] not in boattypes])
# we're still here
if request.method == 'POST':
@@ -1821,7 +1806,6 @@ def virtualevent_addboat_view(request, id=0):
boatclass = coursestandard.boatclass
weightcategory = coursestandard.weightclass
adaptiveclass = coursestandard.adaptiveclass
skillclass = coursestandard.skillclass
returnurl = reverse(virtualevent_register_view,
kwargs={'id': race.id})
@@ -1873,7 +1857,7 @@ def virtualevent_addboat_view(request, id=0):
# send email about opt out
if not acceptsocialmedia:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_optout,
race.manager.email, race.manager.first_name,
@@ -1895,7 +1879,7 @@ def virtualevent_addboat_view(request, id=0):
othername = otheruser.user.first_name+' '+otheruser.user.last_name
registeredname = r.user.first_name+' '+r.user.last_name
if otherrecord.emailnotifications:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_raceregistration,
otheruser.user.email, othername,
@@ -1915,7 +1899,7 @@ def virtualevent_addboat_view(request, id=0):
registeredname = r.user.first_name+' '+r.user.last_name
email = follower.emailaddress
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_raceregistration,
email, othername,
@@ -2074,7 +2058,6 @@ def virtualevent_register_view(request, id=0):
boatclass = coursestandard.boatclass
weightcategory = coursestandard.weightclass
adaptiveclass = coursestandard.adaptiveclass
skillclass = coursestandard.skillclass
returnurl = reverse(virtualevent_register_view,
kwargs={'id': race.id})
@@ -2125,7 +2108,7 @@ def virtualevent_register_view(request, id=0):
add_rower_race(r, race)
# send email about opt out
if not acceptsocialmedia:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_optout,
race.manager.email, race.manager.first_name,
@@ -2148,7 +2131,7 @@ def virtualevent_register_view(request, id=0):
othername = otheruser.user.first_name+' '+otheruser.user.last_name
registeredname = r.user.first_name+' '+r.user.last_name
if otherrecord.emailnotifications:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_raceregistration,
otheruser.user.email, othername,
@@ -2168,7 +2151,7 @@ def virtualevent_register_view(request, id=0):
registeredname = r.user.first_name+' '+r.user.last_name
email = follower.emailaddress
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_raceregistration,
email, othername,
@@ -2361,7 +2344,6 @@ def indoorvirtualevent_register_view(request, id=0):
boatclass = coursestandard.boatclass
weightcategory = coursestandard.weightclass
adaptiveclass = coursestandard.adaptiveclass
skillclass = coursestandard.skillclass
returnurl = reverse(virtualevent_register_view,
kwargs={'id': race.id})
@@ -2412,7 +2394,7 @@ def indoorvirtualevent_register_view(request, id=0):
# send email about opt out
if not acceptsocialmedia:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_optout,
race.manager.email, race.manager.first_name,
@@ -2435,7 +2417,7 @@ def indoorvirtualevent_register_view(request, id=0):
othername = otheruser.user.first_name+' '+otheruser.user.last_name
registeredname = r.user.first_name+' '+r.user.last_name
if otherrecord.emailnotifications:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_raceregistration,
otheruser.user.email, othername,
@@ -2455,7 +2437,7 @@ def indoorvirtualevent_register_view(request, id=0):
registeredname = r.user.first_name+' '+r.user.last_name
email = follower.emailaddress
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_raceregistration,
email, othername,
@@ -3197,8 +3179,15 @@ def virtualevent_submit_result_view(request, id=0, workoutid=0):
)
if records.count() == 0: # pragma: no cover
hasinitial, boattype, boatclass, adaptiveclass, weightclass, sex, referencespeed, initialcategory = default_class(
r, None, race)
(
hasinitial,
boattype,
boatclass,
adaptiveclass,
weightclass,
sex,
referencespeed,
initialcategory) = default_class(r, None, race)
if not hasinitial:
messages.error(request, "Sorry, you have to register first")
url = reverse('virtualevent_view',
@@ -3314,7 +3303,9 @@ def virtualevent_submit_result_view(request, id=0, workoutid=0):
request.session['async_tasks'] = [(jobid, 'submit_race')]
messages.info(
request, "We are evaluating your result. The page will reload when we're done. Your result will show up if you adhered to the course")
request, "We are evaluating your result."
" The page will reload when we're done. Your result will show up if you adhered"
" to the course")
if result:
otherrecords = resultobj.objects.filter(
@@ -3328,7 +3319,7 @@ def virtualevent_submit_result_view(request, id=0, workoutid=0):
othername = otheruser.user.first_name+' '+otheruser.user.last_name
registeredname = r.user.first_name+' '+r.user.last_name
if otherrecord.emailnotifications:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_racesubmission,
otheruser.user.email, othername,
@@ -3348,7 +3339,7 @@ def virtualevent_submit_result_view(request, id=0, workoutid=0):
registeredname = r.user.first_name+' '+r.user.last_name
email = follower.emailaddress
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_racesubmission,
email, othername,
@@ -3577,7 +3568,6 @@ def virtualevent_entry_edit_view(request, id=0, entryid=0):
boatclass = coursestandard.boatclass
weightcategory = coursestandard.weightclass
adaptiveclass = coursestandard.adaptiveclass
skillclass = coursestandard.skillclass
if age < coursestandard.agemin: # pragma: no cover
messages.error(

View File

@@ -106,9 +106,9 @@ def remove_user(request):
PlannedSession.objects.filter(manager=user).delete()
user.delete()
res = myqueue(queuehigh,
handle_sendemail_userdeleted,
name, email)
_ = myqueue(queuehigh,
handle_sendemail_userdeleted,
name, email)
url = '/logout/?next=/login'
# url = reverse(auth_views.logout_then_login)
@@ -128,7 +128,6 @@ def survey(request): # pragma: no cover
surveyform = SurveyForm()
if request.method == 'POST':
form = SurveyForm(request.POST)
r.surveydone = True
r.surveydonedate = timezone.now()
r.save()
@@ -221,7 +220,6 @@ def start_plantrial_view(request):
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
def rower_favoritecharts_view(request, userid=0):
message = ''
successmessage = ''
r = getrequestrowercoachee(request, userid=userid, notpermanent=True)
staticchartform = StaticChartRowerForm(instance=r)
@@ -304,7 +302,6 @@ def rower_favoritecharts_view(request, userid=0):
with transaction.atomic():
FavoriteChart.objects.filter(user=r).delete()
FavoriteChart.objects.bulk_create(new_instances)
successmessage = "You have updated your favorites"
messages.info(request, message)
if len(new_instances) == 0:
FavoriteChartFormSet = formset_factory(
@@ -352,13 +349,14 @@ def rower_exportsettings_view(request, userid=0):
cd = form.cleaned_data
if r.rowerplan == 'basic': # pragma: no cover
messages.error(
request, 'These settings can only be set if you are a user on one of the <a href="/rowers/paidplans">paid plans</a>.')
request, 'These settings can only be set if you are a user" \
" on one of the <a href="/rowers/paidplans">paid plans</a>.')
for attr, value in cd.items():
doset = True
try:
tokenname = attrtokens[attr]
if getattr(r, tokenname) == '' or getattr(r, tokenname) == None:
if getattr(r, tokenname) == '' or getattr(r, tokenname) is None:
doset = False
except KeyError:
doset = True
@@ -519,8 +517,6 @@ def rower_edit_view(request, rowerid=0, userid=0, message=""):
def rower_prefs_view(request, userid=0, message=""):
r = getrequestrowercoachee(request, userid=userid, notpermanent=True)
rowerid = r.id
breadcrumbs = [
{
'url': '/rowers/me/edit/',
@@ -636,8 +632,8 @@ def rower_prefs_view(request, userid=0, message=""):
r.kfatigue = kfatigue
r.save()
messages.info(request, 'Updated CP range and time decay constants')
success = dataprep.update_rolling_cp(r, mytypes.otwtypes, 'water')
success = dataprep.update_rolling_cp(r, mytypes.otetypes, 'erg')
_ = dataprep.update_rolling_cp(r, mytypes.otwtypes, 'water')
_ = dataprep.update_rolling_cp(r, mytypes.otetypes, 'erg')
return render(request, 'rower_preferences.html',
{
@@ -665,10 +661,10 @@ def rower_revokeapp_view(request, id=0): # pragma: no cover
for token in refreshtokens:
token.revoke()
r = getrower(request.user)
form = RowerForm(instance=r)
powerform = RowerPowerForm(instance=r)
grants = AccessToken.objects.filter(user=request.user)
# r = getrower(request.user)
# form = RowerForm(instance=r)
# powerform = RowerPowerForm(instance=r)
# grants = AccessToken.objects.filter(user=request.user)
url = reverse('rower_edit_view')
return HttpResponseRedirect(url)
except AccessToken.DoesNotExist:
@@ -749,7 +745,9 @@ def rower_update_empower_view(
except KeyError:
request.session['async_tasks'] = [(job.id, 'update_empower')]
successmessage = 'Your workouts are being updated in the background. You will receive email when this is done. You can check the status of your calculations <a href="/rowers/jobs-status" target="_blank">here</a>'
successmessage = 'Your workouts are being updated in the background." \
" You will receive email when this is done. You can check the status" \
" of your calculations <a href="/rowers/jobs-status" target="_blank">here</a>'
messages.info(request, successmessage)

View File

@@ -1,9 +1,6 @@
import hashlib
from shutil import copyfile
from six import iterlists
from rowers.views.statements import *
import rowers.teams as teams
import rowers.mytypes as mytypes
import numpy
import rowers.uploads as uploads
@@ -16,7 +13,6 @@ from json.decoder import JSONDecodeError
import ruptures as rpt
from rowers.courses import getnearestraces, getnearestcourses
def default(o): # pragma: no cover
if isinstance(o, numpy.int64):
return int(o)
@@ -325,7 +321,9 @@ def workout_video_create_view(request, id=0):
return HttpResponseRedirect(url)
except IntegrityError: # pragma: no cover
messages.error(
request, 'You cannot save two video analysis with the same YouTube video and Workout. Redirecting to your existing analysis')
request,
'You cannot save two video analysis with the same YouTube video and Workout." \
" Redirecting to your existing analysis')
analysis = VideoAnalysis.objects.filter(
workout=w, video_id=video_id)
if analysis:
@@ -405,17 +403,16 @@ def workout_video_create_view(request, id=0):
@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. If you are already a Pro user, please log in to access this functionality",
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)
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
def workout_forcecurve_view(request, id=0, workstrokesonly=False):
row = get_workoutuser(id, request)
promember = 0
mayedit = 0
r = getrequestrower(request)
promember = 1
if r == row.user:
mayedit = 1
@@ -526,7 +523,6 @@ def otw_use_gps(request, id=0):
def workout_histo_view(request, id=0):
w = get_workoutuser(id, request)
r = getrequestrower(request)
promember = 1
mayedit = 0
if w.user == r:
@@ -612,7 +608,6 @@ def addmanual_view(request, raceid=0):
avgpwr = metricsform.cleaned_data['avgpwr']
avgspm = metricsform.cleaned_data['avgspm']
#ps = form.cleaned_data.get('plannedsession',None)
boattype = form.cleaned_data.get('boattype', '1x')
privacy = form.cleaned_data.get('privacy', 'visible')
rankingpiece = form.cleaned_data.get('rankingpiece', False)
@@ -656,7 +651,6 @@ def addmanual_view(request, raceid=0):
w.weightcategory = weightcategory
w.adaptiveclass = adaptiveclass
w.notes = notes
#w.plannedsession = ps
w.name = name
w.rpe = rpe
w.workouttype = workouttype
@@ -735,7 +729,7 @@ def addmanual_view(request, raceid=0):
othername = otheruser.user.first_name+' '+otheruser.user.last_name
registeredname = r.user.first_name+' '+r.user.last_name
if otherrecord.emailnotifications:
job = myqueue(
_ = myqueue(
queue,
handle_sendemail_racesubmission,
otheruser.user.email, othername,
@@ -815,18 +809,12 @@ def workout_recalcsummary_view(request, id=0):
# Joining workout
@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. If you are already a Pro user, please log in to access this functionality",
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)
@permission_required('rower.is_coach', fn=get_user_by_userid, raise_exception=True)
def workouts_join_view(request, userid=0):
promember = 0
r = getrequestrower(request, userid=userid)
if not request.user.is_anonymous:
r = getrower(request.user)
result = request.user.is_authenticated and ispromember(request.user)
if result:
promember = 1
if request.method == 'POST' and 'workouts' in request.POST:
form = WorkoutMultipleCompareForm(request.POST)
@@ -887,17 +875,10 @@ def video_selectworkout(request, userid=0):
options = defaultoptions
options['userid'] = userid
try:
workouttypes = options['workouttypes']
except KeyError: # pragma: no cover
workouttypes = ['rower', 'dynamic', 'slides']
try: # pragma: no cover
modalities = options['modalities']
modality = modalities[0]
except KeyError: # pragma: no cover
modalities = [m[0] for m in mytypes.workouttypes_ordered.items()]
modality = 'all'
query = request.GET.get('q')
if query: # pragma: no cover
@@ -944,8 +925,6 @@ def video_selectworkout(request, userid=0):
url = reverse('workout_video_create_view',
kwargs={'id': encoder.encode_hex(selectedworkout.id)})
return HttpResponseRedirect(url)
else: # pragma: no cover
id = 0
else:
form = WorkoutSingleSelectForm(workouts=workouts)
thediv = ''
@@ -1020,7 +999,8 @@ def video_selectworkout(request, userid=0):
@permission_required('rower.is_coach', fn=get_user_by_userid, 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. If you are already a Pro user, please log in to access this functionality",
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 workouts_join_select(request,
startdatestring="",
@@ -1085,8 +1065,6 @@ def workouts_join_select(request,
startdate = datetime.datetime.combine(startdate, datetime.time())
enddate = datetime.datetime.combine(enddate, datetime.time(23, 59, 59))
#enddate = enddate+datetime.timedelta(days=1)
if startdatestring:
startdate = iso8601.parse_date(startdatestring)
if enddatestring:
@@ -1107,10 +1085,11 @@ def workouts_join_select(request,
except ValueError:
pass
workouts = Workout.objects.filter(user=r,
startdatetime__gte=startdate,
startdatetime__lte=enddate,
workouttype__in=modalities).order_by("-date", "-starttime").exclude(boattype__in=negtypes)
workouts = Workout.objects.filter(
user=r,
startdatetime__gte=startdate,
startdatetime__lte=enddate,
workouttype__in=modalities).order_by("-date", "-starttime").exclude(boattype__in=negtypes)
query = request.GET.get('q')
if query: # pragma: no cover
@@ -1204,7 +1183,7 @@ def remove_power_view(request, id=0):
row = rdata(csvfile=f, rower=rr)
row.df[' Power (watts)'] = 0
row.write_csv(f)
res = dataprep.dataprep(row.df, id=workout.id)
_ = dataprep.dataprep(row.df, id=workout.id)
cpdf, delta, cpvalues = dataprep.setcp(workout)
workout.normp = 0
@@ -1224,7 +1203,8 @@ def remove_power_view(request, id=0):
@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. If you are already a Pro user, please log in to access this functionality",
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 course_mapcompare_view(request, id=0):
results = []
@@ -1494,7 +1474,6 @@ def course_compare_view(request, id=0):
xparam = chartform.cleaned_data['xparam']
yparam = chartform.cleaned_data['yparam']
plottype = chartform.cleaned_data['plottype']
teamid = chartform.cleaned_data['teamid']
ids = [int(w.id) for w in workouts]
request.session['ids'] = ids
elif request.method == 'POST': # pragma: no cover
@@ -1508,7 +1487,6 @@ def course_compare_view(request, id=0):
xparam = chartform.cleaned_data['xparam']
yparam = chartform.cleaned_data['yparam']
plottype = chartform.cleaned_data['plottype']
teamid = chartform.cleaned_data['teamid']
try:
workoutids = request.session['ids']
except KeyError: # pragma: no cover
@@ -1674,7 +1652,6 @@ def virtualevent_compare_view(request, id=0):
xparam = chartform.cleaned_data['xparam']
yparam = chartform.cleaned_data['yparam']
plottype = chartform.cleaned_data['plottype']
teamid = chartform.cleaned_data['teamid']
ids = [int(w.id) for w in workouts]
request.session['ids'] = ids
elif request.method == 'POST':
@@ -1688,7 +1665,6 @@ def virtualevent_compare_view(request, id=0):
xparam = chartform.cleaned_data['xparam']
yparam = chartform.cleaned_data['yparam']
plottype = chartform.cleaned_data['plottype']
teamid = chartform.cleaned_data['teamid']
try:
workoutids = request.session['ids']
except KeyError: # pragma: no cover
@@ -1758,8 +1734,6 @@ def virtualevent_compare_view(request, id=0):
@permission_required('plannedsession.view_session',
fn=get_session_by_pk, raise_exception=True)
def plannedsession_compare_view(request, id=0, userid=0):
r = getrequestrower(request, userid=userid)
try:
ps = PlannedSession.objects.get(id=id)
except PlannedSession.DoesNotExist: # pragma: no cover
@@ -1769,10 +1743,6 @@ def plannedsession_compare_view(request, id=0, userid=0):
ids = [int(w.id) for w in workouts]
labeldict = {
int(w.id): w.__str__() for w in workouts
}
xparam = 'time'
yparam = 'hr'
plottype = 'line'
@@ -1783,8 +1753,6 @@ def plannedsession_compare_view(request, id=0, userid=0):
request.session['plottype'] = plottype
request.session['ps'] = ps.id
teams = ps.team.all()
if ids:
url = reverse('analysis_new',
kwargs={
@@ -1832,16 +1800,12 @@ def workouts_view(request, message='', successmessage='',
startdate, datetime.time()).astimezone(usertimezone)
enddate = datetime.datetime.combine(
enddate, datetime.time(23, 59, 59)).astimezone(usertimezone)
#enddate = enddate+datetime.timedelta(days=1)
if enddate < startdate: # pragma: no cover
s = enddate
enddate = startdate
startdate = s
startdatestring = startdate.strftime('%Y-%m-%d')
enddatestring = enddate.strftime('%Y-%m-%d')
# start date for the small graph
activity_startdate = enddate-datetime.timedelta(days=15)
@@ -1926,7 +1890,7 @@ def workouts_view(request, message='', successmessage='',
workoutsnohr = workouts.exclude(averagehr__isnull=False)
for w in workoutsnohr: # pragma: no cover
res = dataprep.workout_trimp(w)
_ = dataprep.workout_trimp(w)
# ids = [w.id for w in workouts]
# df = dataprep.getsmallrowdata_db(['time','power'],ids=ids)
@@ -2013,7 +1977,8 @@ def workouts_view(request, message='', successmessage='',
# List of workouts to compare a selected workout to
@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. If you are already a Pro user, please log in to access this functionality",
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)
@permission_required('workout.change_workout', fn=get_workout_by_opaqueid, raise_exception=True)
def workout_fusion_list(request, id=0,
@@ -2036,7 +2001,6 @@ def workout_fusion_list(request, id=0,
startdate = datetime.datetime.combine(startdate, datetime.time())
enddate = datetime.datetime.combine(enddate, datetime.time(23, 59, 59))
#enddate = enddate+datetime.timedelta(days=1)
startdate = arrow.get(startdate).datetime
enddate = arrow.get(enddate).datetime
@@ -2148,8 +2112,6 @@ def workout_view(request, id=0, raceresult=0, sessionresult=0, nocourseraceresul
result = CourseTestResult.objects.get(id=sessionresult)
startsecond = result.startsecond
endsecond = result.endsecond
duration = row.duration
durationsecs = duration.hour*3600+duration.minute*60+duration.second
itime = [startsecond, endsecond-startsecond]
itype = [3, 4]
intervaldata['itime'] = itime
@@ -2167,8 +2129,6 @@ def workout_view(request, id=0, raceresult=0, sessionresult=0, nocourseraceresul
result = IndoorVirtualRaceResult.objects.get(id=nocourseraceresult)
startsecond = result.startsecond
endsecond = result.endsecond
duration = row.duration
durationsecs = duration.hour*3600+duration.minute*60+duration.second
itime = [startsecond, endsecond-startsecond]
itype = [3, 4]
intervaldata['itime'] = itime
@@ -2186,8 +2146,6 @@ def workout_view(request, id=0, raceresult=0, sessionresult=0, nocourseraceresul
result = VirtualRaceResult.objects.get(id=raceresult)
startsecond = result.startsecond
endsecond = result.endsecond
duration = row.duration
durationsecs = duration.hour*3600+duration.minute*60+duration.second
itime = [startsecond, endsecond-startsecond]
itype = [3, 4]
intervaldata['itime'] = itime
@@ -2280,7 +2238,8 @@ def workout_view(request, id=0, raceresult=0, sessionresult=0, nocourseraceresul
# Resets stroke data to raw data (pace)
@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. If you are already a Pro user, please log in to access this functionality",
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_undo_smoothenpace_view(
request, id=0, message="", successmessage=""
@@ -2312,7 +2271,8 @@ def workout_undo_smoothenpace_view(
# Data smoothing of pace 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. If you are already a Pro user, please log in to access this functionality",
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_smoothenpace_view(request, id=0, message="", successmessage=""):
row = get_workoutuser(id, request)
@@ -2342,7 +2302,7 @@ def workout_smoothenpace_view(request, id=0, message="", successmessage=""):
return HttpResponseRedirect(url)
if not 'originalvelo' in row.df:
if 'originalvelo' not in row.df:
row.df['originalvelo'] = velo
velo2 = stravastuff.ewmovingaverage(velo, 5)
@@ -2374,7 +2334,8 @@ def workout_smoothenpace_view(request, id=0, message="", successmessage=""):
# Get weather for given location and date/time
@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",
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_downloadwind_view(request, id=0,
airportcode=None,
@@ -2389,7 +2350,7 @@ def workout_downloadwind_view(request, id=0,
return HttpResponse("Error: CSV Data File Not Found")
try:
bearing = rowdata.df.loc[:, 'bearing'].values
_ = rowdata.df.loc[:, 'bearing'].values
except KeyError:
rowdata.add_bearing()
rowdata.write_csv(f1, gzip=True)
@@ -2399,13 +2360,8 @@ def workout_downloadwind_view(request, id=0,
try:
avglat = rowdata.df[' latitude'].mean()
avglon = rowdata.df[' longitude'].mean()
avgtime = int(rowdata.df['TimeStamp (sec)'].mean(
)-rowdata.df.loc[:, 'TimeStamp (sec)'].iloc[0])
startdatetime = dateutil.parser.parse("{}, {}".format(row.date,
row.starttime))
avgtime = int(rowdata.df['TimeStamp (sec)'].mean()-rowdata.df.loc[:, 'TimeStamp (sec)'].iloc[0])
starttimeunix = int(arrow.get(row.startdatetime).timestamp())
#starttimeunix = int(mktime(startdatetime.utctimetuple()))
avgtime = starttimeunix+avgtime
winddata = get_wind_data(avglat, avglon, avgtime)
windspeed = winddata[0]
@@ -2444,7 +2400,11 @@ def workout_downloadwind_view(request, id=0,
@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)
@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_downloadmetar_view(request, id=0,
airportcode=None,
message="", successmessage=""):
@@ -2458,7 +2418,7 @@ def workout_downloadmetar_view(request, id=0,
return HttpResponse("Error: CSV Data File Not Found")
try:
bearing = rowdata.df.loc[:, 'bearing'].values
_ = rowdata.df.loc[:, 'bearing'].values
except KeyError:
rowdata.add_bearing()
rowdata.write_csv(f1, gzip=True)
@@ -2470,11 +2430,8 @@ def workout_downloadmetar_view(request, id=0,
airportcode = get_airport_code(avglat, avglon)[0]
avgtime = int(rowdata.df['TimeStamp (sec)'].mean(
)-rowdata.df.loc[:, 'TimeStamp (sec)'].iloc[0])
startdatetime = dateutil.parser.parse("{}, {}".format(row.date,
row.starttime))
starttimeunix = arrow.get(row.startdatetime).timestamp()
#starttimeunix = int(mktime(startdatetime.utctimetuple()))
avgtime = starttimeunix + avgtime
winddata = get_metar_data(airportcode, avgtime)
windspeed = winddata[0]
@@ -2513,7 +2470,11 @@ def workout_downloadmetar_view(request, id=0,
# 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)
@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)
@@ -2553,7 +2514,7 @@ def workout_wind_view(request, id=0, message="", successmessage=""):
hascoordinates = 0
try:
bearing = rowdata.df.loc[:, 'bearing'].values
_ = rowdata.df.loc[:, 'bearing'].values
except KeyError:
rowdata.add_bearing()
rowdata.write_csv(f1, gzip=True)
@@ -2598,7 +2559,7 @@ def workout_wind_view(request, id=0, message="", successmessage=""):
'id': id
}
url = reverse('workout_wind_view', kwargs=kwargs)
response = HttpResponseRedirect(url)
_ = HttpResponseRedirect(url)
else:
form = UpdateWindForm()
@@ -2638,7 +2599,11 @@ def workout_wind_view(request, id=0, message="", successmessage=""):
# 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)
@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)
@@ -2678,7 +2643,7 @@ def workout_stream_view(request, id=0, message="", successmessage=""):
kwargs = {
'id': id}
url = reverse('workout_wind_view', kwargs=kwargs)
response = HttpResponseRedirect(url)
_ = HttpResponseRedirect(url)
else:
form = UpdateStreamForm()
@@ -2733,8 +2698,6 @@ def workout_otwsetpower_view(request, id=0, message="", successmessage=""):
form = AdvancedWorkoutForm(request.POST)
if form.is_valid():
#quick_calc = form.cleaned_data['quick_calc']
#go_service = form.cleaned_data['go_service']
boattype = form.cleaned_data['boattype']
weightvalue = form.cleaned_data['weightvalue']
coastalbrand = form.cleaned_data['boatbrand']
@@ -2750,19 +2713,19 @@ def workout_otwsetpower_view(request, id=0, message="", successmessage=""):
if rowdata == 0: # pragma: no cover
return HttpResponse("Error: CSV Data File Not Found")
try:
vstream = rowdata.df['vstream']
_ = rowdata.df['vstream']
except KeyError:
rowdata.add_stream(0)
rowdata.write_csv(f1, gzip=True)
try:
bearing = rowdata.df['bearing']
_ = rowdata.df['bearing']
except KeyError:
rowdata.add_bearing()
rowdata.write_csv(f1, gzip=True)
try:
vwind = rowdata.df['vwind']
_ = rowdata.df['vwind']
except KeyError:
rowdata.add_wind(0, 0)
rowdata.write_csv(f1, gzip=True)
@@ -2792,7 +2755,10 @@ def workout_otwsetpower_view(request, id=0, message="", successmessage=""):
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>'
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}
@@ -2868,14 +2834,10 @@ def instroke_view(request, id=0):
]
# form = WorkoutForm(instance=row)
g = GraphImage.objects.filter(workout=w).order_by("-creationdatetime")
# check if user is owner of this workout
rowdata = rrdata(csvfile=w.csvfilename)
try:
instrokemetrics = rowdata.get_instroke_columns()
instrokemetrics = [m for m in instrokemetrics if not m in nometrics]
instrokemetrics = [m for m in instrokemetrics if m not in nometrics]
except AttributeError: # pragma: no cover
instrokemetrics = []
@@ -2906,7 +2868,6 @@ def instroke_chart(request, id=0, metric=''): # pragma: no cover
fullpathimagename = 'static/plots/'+imagename
u = w.user.user
r = getrower(u)
title = w.name
fig1 = rowdata.get_plot_instroke(metric)
canvas = FigureCanvas(fig1)
canvas.print_figure('static/plots/'+imagename)
@@ -2968,7 +2929,7 @@ def workout_erase_column_view(request, id=0, column=''):
return HttpResponseRedirect(url)
try:
cdata = data[column]
_ = data[column]
except KeyError: # pragma: no cover
url = reverse('workout_data_view', kwargs={
'id': encoder.encode_hex(w.id)
@@ -3019,7 +2980,7 @@ def workout_erase_column_view(request, id=0, column=''):
row.write_csv(w.csvfilename, gzip=True)
row, workout = dataprep.getrowdata(id=w.id)
datadf = dataprep.dataprep(row.df, id=w.id)
_ = dataprep.dataprep(row.df, id=w.id)
if column == 'hr':
w.hrtss = 0
@@ -3067,6 +3028,7 @@ def workout_erase_column_view(request, id=0, column=''):
'column': column,
'teams': get_my_teams(request.user),
'workout': w,
'rower': r,
'breadcrumbs': breadcrumbs,
}
@@ -3210,9 +3172,6 @@ def workout_data_view(request, id=0):
except (TypeError, KeyError):
pass
# pd.set_option('display.width', 1000)
#pd.set_option('colheader_justify', 'left')
htmltable = datadf.to_html(
bold_rows=True,
show_dimensions=True, border=1,
@@ -3226,6 +3185,7 @@ def workout_data_view(request, id=0):
'data': datadf,
'cols': datadf.columns,
'form': form,
'rower': r,
'teams': get_my_teams(request.user),
'workout': w,
'breadcrumbs': breadcrumbs,
@@ -3281,11 +3241,11 @@ def workout_stats_view(request, id=0, message="", successmessage=""):
if datadf.empty:
return HttpResponse("CSV data file not found")
#datadf['deltat'] = datadf['time'].diff()
# datadf['deltat'] = datadf['time'].diff()
workoutstateswork = [1, 4, 5, 8, 9, 6, 7]
workoutstatesrest = [3]
workoutstatetransition = [0, 2, 10, 11, 12, 13]
# workoutstateswork = [1, 4, 5, 8, 9, 6, 7]
# workoutstatesrest = [3]
# workoutstatetransition = [0, 2, 10, 11, 12, 13]
# Create stats
stats = {}
@@ -3463,7 +3423,7 @@ def workout_workflow_config2_view(request, userid=0):
if value != 'None':
newmiddlepanel.append(value)
newmiddlepanel = [i for i in newmiddlepanel if i != None]
newmiddlepanel = [i for i in newmiddlepanel if i is not None]
r.workflowmiddlepanel = newmiddlepanel
try:
r.save()
@@ -3496,12 +3456,6 @@ def workout_workflow_view(request, id):
row = get_workout_by_opaqueid(request, id)
r = getrower(request.user)
result = request.user.is_authenticated and ispromember(request.user)
if result:
promember = 1
if request.user == row.user.user:
mayedit = 1
comments = WorkoutComment.objects.filter(workout=row)
aantalcomments = len(comments)
@@ -3614,7 +3568,7 @@ def workout_flexchart3_view(request, *args, **kwargs):
# check if favoritenr is not out of range
if favorites:
try:
t = favorites[favoritenr].xparam
_ = favorites[favoritenr].xparam
except IndexError: # pragma: no cover
favoritenr = 0
except AssertionError:
@@ -3683,11 +3637,6 @@ def workout_flexchart3_view(request, *args, **kwargs):
reststrokes = not workstrokesonly
r = getrower(request.user)
try:
range = metrics.yaxmaxima[xparam]
if yparam1 is not None:
range = metrics.yaxmaxima[yparam1]
if yparam2 is not None:
range = metrics.yaxmaxima[yparam2]
f = FavoriteChart(user=r, xparam=xparam,
yparam1=yparam1, yparam2=yparam2,
plottype=plottype, workouttype=workouttype,
@@ -3774,7 +3723,7 @@ def workout_flexchart3_view(request, *args, **kwargs):
try:
additionalmetrics = rowdata.get_additional_metrics()
additionalmetrics = [
m for m in additionalmetrics if not m in nometrics]
m for m in additionalmetrics if m not in nometrics]
except AttributeError: # pragma: no cover
additionalmetrics = []
@@ -3959,9 +3908,6 @@ def workout_otwpowerplot_view(request, id=0, message="", successmessage=""):
# check if user is owner of this workout
# create interactive plot
f1 = w.csvfilename
u = w.user.user
# r = getrower(u)
promember = 0
mayedit = 0
@@ -4064,34 +4010,34 @@ def workout_comment_view(request, id=0):
if request.user != r.user: # pragma: no cover
a_messages.info(r.user, message.encode('ascii', 'ignore'))
res = myqueue(queuehigh,
handle_sendemailnewcomment, r.user.first_name,
r.user.last_name,
r.user.email,
request.user.first_name,
request.user.last_name,
comment, w.name, w.id,
emailbounced=r.emailbounced
)
_ = myqueue(queuehigh,
handle_sendemailnewcomment, r.user.first_name,
r.user.last_name,
r.user.email,
request.user.first_name,
request.user.last_name,
comment, w.name, w.id,
emailbounced=r.emailbounced
)
commenters = {oc.user for oc in comments if oc.notification}
for u in commenters: # pragma: no cover
a_messages.info(u, message)
if u != request.user and u != r.user:
ocr = Rower.objects.get(user=u)
res = myqueue(queue,
handle_sendemailnewresponse,
u.first_name,
u.last_name,
u.email,
request.user.first_name,
request.user.last_name,
comment,
w.name,
w.id,
c.id,
emailbounced=ocr.emailbounced
)
_ = myqueue(queue,
handle_sendemailnewresponse,
u.first_name,
u.last_name,
u.email,
request.user.first_name,
request.user.last_name,
comment,
w.name,
w.id,
c.id,
emailbounced=ocr.emailbounced
)
url = reverse('workout_comment_view',
kwargs={
@@ -4236,7 +4182,7 @@ def workout_edit_view(request, id=0, message="", successmessage=""):
try:
# aware object can be in any timezone
out = startdatetime.astimezone(pytz.utc)
_ = startdatetime.astimezone(pytz.utc)
except (ValueError, TypeError): # pragma: no cover
startdatetime = timezone.make_aware(startdatetime)
@@ -4444,9 +4390,6 @@ def workout_map_view(request, id=0):
mayedit = 0
if not request.user.is_anonymous:
r = getrower(request.user)
result = request.user.is_authenticated and ispromember(request.user)
if result:
promember = 1
if request.user == w.user.user:
mayedit = 1
@@ -4618,7 +4561,6 @@ def workout_toggle_ranking(request, id=0):
@csrf_exempt
def workout_upload_api(request):
stravaid = ''
if request.method != 'POST': # pragma: no cover
message = {'status': 'false',
'message': 'this view cannot be accessed through GET'}
@@ -4672,11 +4614,7 @@ def workout_upload_api(request):
return JSONResponse(status=400, data=message)
# sync related IDs
stravaid = post_data.get('stravaid', '')
c2id = post_data.get('c2id', '')
nkid = post_data.get('nkid', '')
rp3id = post_data.get('rp3id', '')
garminid = post_data.get('garminid', 0)
startdatetime = post_data.get('startdatetime', '')
oarlockfirmware = post_data.get('oarlockfirmware', None)
@@ -4740,11 +4678,6 @@ def workout_upload_api(request):
if optionsform.is_valid():
make_plot = optionsform.cleaned_data['make_plot']
plottype = optionsform.cleaned_data['plottype']
upload_to_c2 = optionsform.cleaned_data['upload_to_C2']
upload_to_strava = optionsform.cleaned_data['upload_to_Strava']
upload_to_st = optionsform.cleaned_data['upload_to_SportTracks']
upload_to_tp = optionsform.cleaned_data['upload_to_TrainingPeaks']
makeprivate = optionsform.cleaned_data['makeprivate']
else: # pragma: no cover
message = optionsform.errors
@@ -4852,7 +4785,7 @@ def workout_upload_api(request):
'id': encoder.encode_hex(w.id),
}
)
email_sent = send_confirm(r.user, t, link, '')
_ = send_confirm(r.user, t, link, '')
return JSONResponse(status=statuscode, data=message)
@@ -4894,10 +4827,9 @@ def workout_upload_view(request,
if 'uploadoptions' in request.session:
uploadoptions = request.session['uploadoptions']
try:
defaultlandingpage = uploadoptions['landingpage']
_ = uploadoptions['landingpage']
except KeyError: # pragma: no cover
uploadoptions['landingpage'] = r.defaultlandingpage
defaultlandingpage = r.defaultlandingpage
else:
request.session['uploadoptions'] = uploadoptions
@@ -5026,15 +4958,17 @@ def workout_upload_view(request,
url = settings.UPLOAD_SERVICE_URL
job = myqueue(queuehigh,
handle_request_post,
url,
uploadoptions
)
_ = myqueue(queuehigh,
handle_request_post,
url,
uploadoptions
)
messages.info(
request,
"The file was too large to process in real time. It will be processed in a background process. You will receive an email when it is ready")
"The file was too large to process in real time."
" It will be processed in a background process."
" You will receive an email when it is ready")
url = reverse('workout_upload_view')
if is_ajax: # pragma: no cover
return JSONResponse({'result': 1, 'url': url})
@@ -5051,7 +4985,9 @@ def workout_upload_view(request,
response = HttpResponseRedirect(url)
return response
elif id == -1: # pragma: no cover
message = 'The zip archive will be processed in the background. The files in the archive will only be uploaded without the extra actions. You will receive email when the workouts are ready.'
message = 'The zip archive will be processed in the background." \
" The files in the archive will only be uploaded without the extra actions." \
" You will receive email when the workouts are ready.'
messages.info(request, message)
url = reverse('workout_upload_view')
if is_ajax:
@@ -5086,7 +5022,7 @@ def workout_upload_view(request,
(jobid, 'make_plot')]
except KeyError:
request.session['async_tasks'] = [(jobid, 'make_plot')]
elif r.staticchartonupload != None:
elif r.staticchartonupload is not None:
plottype = r.staticchartonupload
res, jobid = uploads.make_plot(r, w, f1, f2, plottype, t)
@@ -5345,8 +5281,6 @@ def team_workout_upload_view(request, message="",
}
]
myteams = Team.objects.filter(manager=request.user)
make_plot = uploadoptions['make_plot']
plottype = uploadoptions['plottype']
@@ -5406,8 +5340,6 @@ def team_workout_upload_view(request, message="",
workouttype = form.cleaned_data['workouttype']
notes = form.cleaned_data['notes']
if optionsform.is_valid():
make_plot = optionsform.cleaned_data['make_plot']
plottype = optionsform.cleaned_data['plottype']
@@ -5434,7 +5366,7 @@ def team_workout_upload_view(request, message="",
notes=''
)
else: # pragma: no cover
job = myqueue(
_ = myqueue(
queuehigh,
handle_zip_file,
r.user.email,
@@ -5445,7 +5377,9 @@ def team_workout_upload_view(request, message="",
messages.info(
request,
"The file was too large to process in real time. It will be processed in a background process. The user will receive an email when it is ready"
"The file was too large to process in real time."
" It will be processed in a background process."
" The user will receive an email when it is ready"
)
url = reverse('team_workout_upload_view')
@@ -5458,7 +5392,9 @@ def team_workout_upload_view(request, message="",
response = HttpResponseRedirect(url)
return response
elif id == -1: # pragma: no cover
message = 'The zip archive will be processed in the background. The files in the archive will only be uploaded without the extra actions. You will receive email when the workouts are ready.'
message = 'The zip archive will be processed in the background." \
" The files in the archive will only be uploaded without the extra actions." \
" You will receive email when the workouts are ready.'
messages.info(request, message)
url = reverse('team_workout_upload_view')
response = HttpResponseRedirect(url)
@@ -5652,7 +5588,6 @@ def graph_show_view(request, id):
def workout_summary_restore_view(request, id, message="", successmessage=""):
row = get_workout_by_opaqueid(request, id)
s = ""
# still here - this is a workout we may edit
f1 = row.csvfilename
u = row.user.user
@@ -5681,14 +5616,6 @@ def workout_summary_restore_view(request, id, message="", successmessage=""):
row.summary = intervalstats
row.save()
# create interactive plot
try:
res = interactive_chart(encoder.decode_hex(id), promember=1)
script = res[0]
div = res[1]
except ValueError: # pragma: no cover
pass
messages.info(request, 'Original Interval Data Restored')
url = reverse('workout_summary_edit_view',
kwargs={
@@ -5702,7 +5629,8 @@ def workout_summary_restore_view(request, id, message="", successmessage=""):
@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",
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_split_view(request, id=0):
row = get_workout_by_opaqueid(request, id)
@@ -5797,7 +5725,10 @@ def workout_split_view(request, id=0):
# Fuse two workouts
@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)
@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_fusion_view(request, id1=0, id2=1):
try:
@@ -5812,8 +5743,8 @@ def workout_fusion_view(request, id1=0, id2=1):
w1 = Workout.objects.get(id=id1)
w2 = Workout.objects.get(id=id2)
r = w1.user
if (is_workout_user(request.user, w1) == False) or \
(is_workout_user(request.user, w2) == False): # pragma: no cover
if (is_workout_user(request.user, w1) is False) or \
(is_workout_user(request.user, w2) is False): # pragma: no cover
raise PermissionDenied("You are not allowed to use these workouts")
except Workout.DoesNotExist: # pragma: no cover
raise Http404("One of the workouts doesn't exist")
@@ -5835,10 +5766,9 @@ def workout_fusion_view(request, id1=0, id2=1):
title='Fused data',
parent=w1,
forceunit=forceunit)
if message != None: # pragma: no cover
if message is not None: # pragma: no cover
messages.error(request, message)
else:
successmessage = 'Data fused'
messages.info(request, message)
url = reverse('workout_edit_view',
@@ -5947,7 +5877,7 @@ def workout_course_view(request, id):
)
record.save()
job = myqueue(
_ = myqueue(
queuehigh,
handle_check_race_course,
row.csvfilename,
@@ -5967,7 +5897,9 @@ def workout_course_view(request, id):
request.session['async_tasks'] = [
(job.id, 'check_race_course')]
messages.info(request, 'We are checking your time on the course in the background. You will receive an email when the check is complete. You can check the status <a href="/rowers/jobs-status/" target="_blank">here</a>')
messages.info(request, 'We are checking your time on the course in the background." \
" You will receive an email when the check is complete." \
" You can check the status <a href="/rowers/jobs-status/" target="_blank">here</a>')
# get results
records = VirtualRaceResult.objects.filter(
@@ -6033,7 +5965,7 @@ def workout_summary_edit_view(request, id, message="", successmessage=""
rowdata = rdata(csvfile=f1, rower=rr)
if rowdata == 0: # pragma: no cover
return HttpResponse("Error: CSV Data File Not Found")
#intervalstats = rowdata.allstats()
intervalstats = row.summary
try:
itime, idist, itype = rowdata.intervalstats_values()
@@ -6145,7 +6077,7 @@ def workout_summary_edit_view(request, id, message="", successmessage=""
)
record.save()
job = myqueue(
_ = myqueue(
queuehigh,
handle_check_race_course,
row.csvfilename,
@@ -6165,7 +6097,9 @@ def workout_summary_edit_view(request, id, message="", successmessage=""
request.session['async_tasks'] = [
(job.id, 'check_race_course')]
messages.info(request, 'We are checking your time on the course in the background. You will receive an email when the check is complete. You can check the status <a href="/rowers/jobs-status/" target="_blank">here</a>')
messages.info(request, 'We are checking your time on the course in the background." \
" You will receive an email when the check is complete." \
" You can check the status <a href="/rowers/jobs-status/" target="_blank">here</a>')
vals = None
# feeling lucky / ruptures
@@ -6352,7 +6286,7 @@ def workout_summary_edit_view(request, id, message="", successmessage=""
itime, idist, itype = rowdata.intervalstats_values()
nrintervals = len(idist)
row.summary = intervalstats
#intervalstats = rowdata.allstats()
if s:
try:
row.notes = u'{n} \n {s}'.format(
@@ -6634,7 +6568,6 @@ class WorkoutDelete(PermissionRequiredMixin, 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)
if result: