fx
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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(
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user