Private
Public Access
1
0

NK LiNK to NK Logbook

This commit is contained in:
Sander Roosendaal
2021-04-21 16:47:44 +02:00
parent c278f7b900
commit ef2229c1ee
10 changed files with 246 additions and 129 deletions

View File

@@ -1002,7 +1002,7 @@ class Rower(models.Model):
nkrefreshtoken = models.TextField(default='',max_length=1000, nkrefreshtoken = models.TextField(default='',max_length=1000,
blank=True,null=True) blank=True,null=True)
nk_owner_id = models.BigIntegerField(default=0) nk_owner_id = models.BigIntegerField(default=0)
nk_auto_import = models.BooleanField(default=False,verbose_name='NK LiNK auto import') nk_auto_import = models.BooleanField(default=False,verbose_name='NK Logbook auto import')
trainingpeaks_auto_export = models.BooleanField(default=False) trainingpeaks_auto_export = models.BooleanField(default=False)

View File

@@ -157,7 +157,7 @@ def checkscores(r,macrocycles):
if mm.type == 'userdefined': if mm.type == 'userdefined':
for ps in sps: for ps in sps: # pragma: no cover
ratio, status, cdate = is_session_complete(r,ps) ratio, status, cdate = is_session_complete(r,ps)
if ps.sessionmode == 'time': if ps.sessionmode == 'time':
mm.plantime += ps.sessionvalue mm.plantime += ps.sessionvalue
@@ -256,12 +256,12 @@ def get_execution_report(rower,startdate,enddate,plan=None):
for w in unmatchedworkouts: for w in unmatchedworkouts:
if w.rscore != 0: if w.rscore != 0:
actualscore += w.rscore actualscore += w.rscore
elif w.hrtss != 0: elif w.hrtss != 0: # pragma: no cover
actualscore += w.hrtss actualscore += w.hrtss
else: else: # pragma: no cover
minutes = w.duration.hour*60+w.duration.minute minutes = w.duration.hour*60+w.duration.minute
actualscore += minutes actualscore += minutes
for ps in sps: for ps in sps: # pragma: no cover
ratio, status, cdate = is_session_complete(rower,ps) ratio, status, cdate = is_session_complete(rower,ps)
if ps.sessionmode == 'rScore': if ps.sessionmode == 'rScore':
plannedscore += ps.sessionvalue plannedscore += ps.sessionvalue
@@ -386,11 +386,11 @@ def add_workouts_plannedsession(ws,ps,r):
# check if all sessions have same date # check if all sessions have same date
dates = [w.date for w in ws] dates = [w.date for w in ws]
if (not all(d == dates[0] for d in dates)) and ps.sessiontype not in ['challenge','cycletarget']: if (not all(d == dates[0] for d in dates)) and ps.sessiontype not in ['challenge','cycletarget']: # pragma: no cover
errors.append('For tests and training sessions, selected workouts must all be done on the same date') errors.append('For tests and training sessions, selected workouts must all be done on the same date')
return result,comments,errors return result,comments,errors
if len(ws)>1 and ps.sessiontype == 'test': if len(ws)>1 and ps.sessiontype == 'test': # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors return result,comments,errors
@@ -400,7 +400,7 @@ def add_workouts_plannedsession(ws,ps,r):
ids = [w.id for w in wold] + [w.id for w in ws] ids = [w.id for w in wold] + [w.id for w in ws]
ids = list(set(ids)) ids = list(set(ids))
if len(ids)>1 and ps.sessiontype in ['test','coursetest','race','fastest_time','fastest_distance']: if len(ids)>1 and ps.sessiontype in ['test','coursetest','race','fastest_time','fastest_distance']: # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors return result,comments,errors
@@ -411,7 +411,7 @@ def add_workouts_plannedsession(ws,ps,r):
w.save() w.save()
result += 1 result += 1
comments.append('Attached workout %s to session' % encoder.encode_hex(w.id)) comments.append('Attached workout %s to session' % encoder.encode_hex(w.id))
if ps.sessiontype == 'coursetest': if ps.sessiontype == 'coursetest': # pragma: no cover
record = CourseTestResult( record = CourseTestResult(
userid=w.user.id, userid=w.user.id,
plannedsession=ps, plannedsession=ps,
@@ -423,7 +423,7 @@ def add_workouts_plannedsession(ws,ps,r):
w.id,ps.course.id,record.id, w.id,ps.course.id,record.id,
w.user.user.email,w.user.user.first_name, w.user.user.email,w.user.user.first_name,
mode='coursetest') mode='coursetest')
if ps.sessiontype == 'fastest_distance': if ps.sessiontype == 'fastest_distance': # pragma: no cover
records = CourseTestResult.objects.filter(userid=w.user.id,plannedsession=ps) records = CourseTestResult.objects.filter(userid=w.user.id,plannedsession=ps)
for record in records: for record in records:
#w1 = Workout.objects.get(id=record.workoutid) #w1 = Workout.objects.get(id=record.workoutid)
@@ -454,7 +454,7 @@ def add_workouts_plannedsession(ws,ps,r):
record.save() record.save()
else: else:
errors.append('Could not find a matching interval') errors.append('Could not find a matching interval')
if ps.sessiontype == 'fastest_time': if ps.sessiontype == 'fastest_time': # pragma: no cover
records = CourseTestResult.objects.filter(userid=w.user.id,plannedsession=ps) records = CourseTestResult.objects.filter(userid=w.user.id,plannedsession=ps)
for record in records: for record in records:
#w1 = Workout.objects.get(id=record.workoutid) #w1 = Workout.objects.get(id=record.workoutid)
@@ -483,7 +483,7 @@ def add_workouts_plannedsession(ws,ps,r):
record.save() record.save()
else: else:
errors.append('Could not find a matching interval') errors.append('Could not find a matching interval')
else: else: # pragma: no cover
errors.append('Workout %i did not match session dates' % w.id) errors.append('Workout %i did not match session dates' % w.id)
return result,comments,errors return result,comments,errors
@@ -497,7 +497,7 @@ def remove_workout_plannedsession(w,ps):
return 0 return 0
def clone_planned_session(ps): def clone_planned_session(ps): # pragma: no cover
ps.save() ps.save()
ps.pk = None # creates new instance ps.pk = None # creates new instance
ps.save() ps.save()
@@ -511,7 +511,7 @@ def timefield_to_seconds_duration(t):
return duration return duration
def get_virtualrace_times(virtualrace): def get_virtualrace_times(virtualrace): # pragma: no cover
geocourse = GeoCourse.objects.get(id = virtualrace.course.id) geocourse = GeoCourse.objects.get(id = virtualrace.course.id)
timezone_str = get_course_timezone(geocourse) timezone_str = get_course_timezone(geocourse)
@@ -564,13 +564,13 @@ def get_session_metrics(ps):
tss = dataprep.workout_rscore(w)[0] tss = dataprep.workout_rscore(w)[0]
if not np.isnan(tss) and tss != 0: if not np.isnan(tss) and tss != 0:
rscorev += tss rscorev += tss
elif tss == 0: elif tss == 0: # pragma: no cover
rscorev += hrtss rscorev += hrtss
ratio,statusv,completiondate = is_session_complete_ws(ws,ps) ratio,statusv,completiondate = is_session_complete_ws(ws,ps)
try: try:
completedatev = completiondate.strftime('%Y-%m-%d') completedatev = completiondate.strftime('%Y-%m-%d')
except AttributeError: except AttributeError: # pragma: no cover
completedatev = '' completedatev = ''
durationv /= 60. durationv /= 60.
@@ -622,7 +622,7 @@ def is_session_complete_ws(ws,ps):
value = ps.sessionvalue value = ps.sessionvalue
if ps.sessionunit == 'min': if ps.sessionunit == 'min':
value *= 60. value *= 60.
elif ps.sessionunit == 'km': elif ps.sessionunit == 'km': # pragma: no cover
value *= 1000. value *= 1000.
cratiomin = 1 cratiomin = 1
@@ -663,7 +663,7 @@ def is_session_complete_ws(ws,ps):
rscore = dataprep.workout_rscore(w)[0] rscore = dataprep.workout_rscore(w)[0]
if not np.isnan(rscore) and rscore != 0: if not np.isnan(rscore) and rscore != 0:
score += rscore score += rscore
elif rscore == 0: elif rscore == 0: # pragma: no cover
trimp,hrtss = dataprep.workout_trimp(w) trimp,hrtss = dataprep.workout_trimp(w)
score += hrtss score += hrtss
@@ -672,7 +672,7 @@ def is_session_complete_ws(ws,ps):
try: try:
ratio = score/float(int(value)) ratio = score/float(int(value))
except ZeroDivisionError: except ZeroDivisionError: # pragma: no cover
ratio = 0 ratio = 0
verdict = 'better than nothing' verdict = 'better than nothing'
@@ -682,10 +682,10 @@ def is_session_complete_ws(ws,ps):
if ratio == 1.0: if ratio == 1.0:
return ratio,'on target',completiondate return ratio,'on target',completiondate
else: else:
if not completiondate: if not completiondate: # pragma: no cover
completiondate = ws.reverse()[0].date completiondate = ws.reverse()[0].date
return ratio,'partial',completiondate return ratio,'partial',completiondate
elif ps.criterium == 'minimum': elif ps.criterium == 'minimum': # pragma: no cover
if ratio >= 1.0: if ratio >= 1.0:
return ratio,'on target',completiondate return ratio,'on target',completiondate
else: else:
@@ -713,7 +713,7 @@ def is_session_complete_ws(ws,ps):
return ratio,'on target',completiondate return ratio,'on target',completiondate
else: else:
return ratio,'partial',completiondate return ratio,'partial',completiondate
elif ps.criterium == 'minimum': elif ps.criterium == 'minimum': # pragma: no cover
if ratio > 1.0: if ratio > 1.0:
return ratio,'on target',completiondate return ratio,'on target',completiondate
else: else:
@@ -721,10 +721,10 @@ def is_session_complete_ws(ws,ps):
completiondate = ws.reverse()[0].date completiondate = ws.reverse()[0].date
return ratio,'partial',completiondate return ratio,'partial',completiondate
else: else:
if not completiondate: if not completiondate: # pragma: no cover
completiondate = ws.reverse()[0].date completiondate = ws.reverse()[0].date
return ratio,'partial',completiondate return ratio,'partial',completiondate
elif ps.sessiontype == 'race': elif ps.sessiontype == 'race': # pragma: no cover
vs = VirtualRaceResult.objects.filter(race=ps) vs = VirtualRaceResult.objects.filter(race=ps)
wids = [w.id for w in ws] wids = [w.id for w in ws]
for record in vs: for record in vs:
@@ -736,7 +736,7 @@ def is_session_complete_ws(ws,ps):
ratio = record.distance/ps.sessionvalue ratio = record.distance/ps.sessionvalue
return ratio,'partial',completiondate return ratio,'partial',completiondate
return (0,'partial',None) return (0,'partial',None)
elif ps.sessiontype in ['fastest_time','fastest_distance']: elif ps.sessiontype in ['fastest_time','fastest_distance']: # pragma: no cover
vs = CourseTestResult.objects.filter(plannedsession=ps,userid=ws[0].user.user.id) vs = CourseTestResult.objects.filter(plannedsession=ps,userid=ws[0].user.user.id)
completiondate = ws.reverse()[0].date completiondate = ws.reverse()[0].date
wids = [w.id for w in ws] wids = [w.id for w in ws]
@@ -757,7 +757,7 @@ def is_session_complete_ws(ws,ps):
) )
record.save() record.save()
return (0,'not done',None) return (0,'not done',None)
elif ps.sessiontype == 'coursetest': elif ps.sessiontype == 'coursetest': # pragma: no cover
vs = CourseTestResult.objects.filter(plannedsession=ps) vs = CourseTestResult.objects.filter(plannedsession=ps)
wids = [w.id for w in ws] wids = [w.id for w in ws]
for record in vs: for record in vs:
@@ -787,7 +787,7 @@ def is_session_complete_ws(ws,ps):
return (0,'not done',None) return (0,'not done',None)
else: else: # pragma: no cover
if not completiondate: if not completiondate:
completiondate = ws.reverse()[0].date completiondate = ws.reverse()[0].date
return ratio,verdict,completiondate return ratio,verdict,completiondate
@@ -797,7 +797,7 @@ def is_session_complete(r,ps):
verdict = 'not done' verdict = 'not done'
if r not in ps.rower.all(): if r not in ps.rower.all(): # pragma: no cover
return 0,'not assigned',None return 0,'not assigned',None
ws = Workout.objects.filter(user=r,plannedsession=ps) ws = Workout.objects.filter(user=r,plannedsession=ps)
@@ -805,7 +805,7 @@ def is_session_complete(r,ps):
return is_session_complete_ws(ws,ps) return is_session_complete_ws(ws,ps)
def rank_results(ps): def rank_results(ps): # pragma: no cover
return 1 return 1
def add_team_session(t,ps): def add_team_session(t,ps):
@@ -828,7 +828,7 @@ def add_rower_session(r,ps):
return 0 return 0
def remove_team_session(t,ps): def remove_team_session(t,ps): # pragma: no cover
ps.team.remove(t) ps.team.remove(t)
return 1 return 1
@@ -865,7 +865,7 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
try: try:
startdate = parser.parse(startdatestring,fuzzy=True).date() startdate = parser.parse(startdatestring,fuzzy=True).date()
enddate = parser.parse(enddatestring, fuzzy=True).date() enddate = parser.parse(enddatestring, fuzzy=True).date()
except ValueError: except ValueError: # pragma: no cover
startdate = timezone.now()-timezone.timedelta(days=5) startdate = timezone.now()-timezone.timedelta(days=5)
startdate = startdate.date() startdate = startdate.date()
enddate = timezone.now().date() enddate = timezone.now().date()
@@ -879,31 +879,31 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
daterangetester = re.compile('^(\d+-\d+-\d+)\/(\d+-\d+-\d+)') daterangetester = re.compile('^(\d+-\d+-\d+)\/(\d+-\d+-\d+)')
if timeperiod=='today': if timeperiod=='today': # pragma: no cover
startdate=date.today() startdate=date.today()
enddate=date.today() enddate=date.today()
elif timeperiod=='tomorrow': elif timeperiod=='tomorrow': # pragma: no cover
startdate=date.today()+timezone.timedelta(days=1) startdate=date.today()+timezone.timedelta(days=1)
enddate=date.today()+timezone.timedelta(days=1) enddate=date.today()+timezone.timedelta(days=1)
elif timeperiod=='thisweek': elif timeperiod=='thisweek': # pragma: no cover
today = date.today() today = date.today()
startdate = date.today()-timezone.timedelta(days=today.weekday()) startdate = date.today()-timezone.timedelta(days=today.weekday())
enddate = startdate+timezone.timedelta(days=6) enddate = startdate+timezone.timedelta(days=6)
elif timeperiod=='thismonth': elif timeperiod=='thismonth': # pragma: no cover
today = date.today() today = date.today()
startdate = today.replace(day=1) startdate = today.replace(day=1)
enddate = startdate+timezone.timedelta(days=32) enddate = startdate+timezone.timedelta(days=32)
enddate = enddate.replace(day=1) enddate = enddate.replace(day=1)
enddate = enddate-timezone.timedelta(days=1) enddate = enddate-timezone.timedelta(days=1)
elif timeperiod=='lastweek': elif timeperiod=='lastweek': # pragma: no cover
today = date.today() today = date.today()
enddate = today-timezone.timedelta(days=today.weekday())-timezone.timedelta(days=1) enddate = today-timezone.timedelta(days=today.weekday())-timezone.timedelta(days=1)
startdate = enddate-timezone.timedelta(days=6) startdate = enddate-timezone.timedelta(days=6)
elif timeperiod=='nextweek': elif timeperiod=='nextweek': # pragma: no cover
today = date.today() today = date.today()
startdate = today-timezone.timedelta(days=today.weekday())+timezone.timedelta(days=7) startdate = today-timezone.timedelta(days=today.weekday())+timezone.timedelta(days=7)
enddate = startdate+timezone.timedelta(days=6) enddate = startdate+timezone.timedelta(days=6)
elif timeperiod=='lastmonth': elif timeperiod=='lastmonth': # pragma: no cover
today = date.today() today = date.today()
startdate = today.replace(day=1) startdate = today.replace(day=1)
startdate = startdate-timezone.timedelta(days=3) startdate = startdate-timezone.timedelta(days=3)
@@ -911,7 +911,7 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
enddate = startdate+timezone.timedelta(days=32) enddate = startdate+timezone.timedelta(days=32)
enddate = enddate.replace(day=1) enddate = enddate.replace(day=1)
enddate = enddate-timezone.timedelta(days=1) enddate = enddate-timezone.timedelta(days=1)
elif timeperiod=='nextmonth': elif timeperiod=='nextmonth': # pragma: no cover
today = date.today() today = date.today()
startdate = today.replace(day=1) startdate = today.replace(day=1)
startdate = startdate+timezone.timedelta(days=32) startdate = startdate+timezone.timedelta(days=32)
@@ -919,7 +919,7 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
enddate = startdate+timezone.timedelta(days=32) enddate = startdate+timezone.timedelta(days=32)
enddate = enddate.replace(day=1) enddate = enddate.replace(day=1)
enddate = enddate-timezone.timedelta(days=1) enddate = enddate-timezone.timedelta(days=1)
elif timeperiod=='lastyear': elif timeperiod=='lastyear': # pragma: no cover
today = date.today() today = date.today()
startdate = today-timezone.timedelta(days=365) startdate = today-timezone.timedelta(days=365)
enddate = today+timezone.timedelta(days=1) enddate = today+timezone.timedelta(days=1)
@@ -929,11 +929,11 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
try: try:
startdate = dt.datetime.strptime(tstartdatestring,'%Y-%m-%d').date() startdate = dt.datetime.strptime(tstartdatestring,'%Y-%m-%d').date()
enddate = dt.datetime.strptime(tenddatestring,'%Y-%m-%d').date() enddate = dt.datetime.strptime(tenddatestring,'%Y-%m-%d').date()
if startdate > enddate: if startdate > enddate: # pragma: no cover
startdate2 = enddate startdate2 = enddate
enddate = startdate enddate = startdate
startdate = startdate2 startdate = startdate2
except ValueError: except ValueError: # pragma: no cover
startdate = date.today() startdate = date.today()
enddate = date.today() enddate = date.today()
else: else:
@@ -957,7 +957,7 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='',
def get_sessions_manager(m,teamid=0,startdate=date.today(), def get_sessions_manager(m,teamid=0,startdate=date.today(),
enddate=date.today()+timezone.timedelta(+1000)): enddate=date.today()+timezone.timedelta(+1000)):
if teamid: if teamid: # pragma: no cover
t = Team.objects.get(id=teamid) t = Team.objects.get(id=teamid)
rs = Rower.objects.filter(team__in=[t]).distinct() rs = Rower.objects.filter(team__in=[t]).distinct()
sps = PlannedSession.objects.filter( sps = PlannedSession.objects.filter(
@@ -1039,7 +1039,7 @@ def update_plannedsession(ps,cd):
if attr != 'fitfile': if attr != 'fitfile':
setattr(ps, attr, value) setattr(ps, attr, value)
if cd['fitfile']: if cd['fitfile']: # pragma: no cover
f = cd['fitfile'] f = cd['fitfile']
try: try:
filename, path_and_filename = handle_uploaded_file(f) filename, path_and_filename = handle_uploaded_file(f)
@@ -1079,7 +1079,7 @@ def update_indoorvirtualrace(ps,cd):
registration_form = cd['registration_form'] registration_form = cd['registration_form']
registration_closure = cd['registration_closure'] registration_closure = cd['registration_closure']
if registration_form == 'manual': if registration_form == 'manual': # pragma: no cover
try: try:
registration_closure = pytz.timezone( registration_closure = pytz.timezone(
timezone_str timezone_str
@@ -1088,9 +1088,9 @@ def update_indoorvirtualrace(ps,cd):
) )
except AttributeError: except AttributeError:
registration_closure = startdatetime registration_closure = startdatetime
elif registration_form == 'windowstart': elif registration_form == 'windowstart': # pragma: no cover
registration_closure = startdatetime registration_closure = startdatetime
elif registration_form == 'windowend': elif registration_form == 'windowend': # pragma: no cover
registration_closure = enddatetime registration_closure = enddatetime
else: else:
registration_closure = ps.evaluation_closure registration_closure = ps.evaluation_closure
@@ -1132,7 +1132,7 @@ def update_virtualrace(ps,cd):
registration_form = cd['registration_form'] registration_form = cd['registration_form']
registration_closure = cd['registration_closure'] registration_closure = cd['registration_closure']
if registration_form == 'manual': if registration_form == 'manual': # pragma: no cover
try: try:
registration_closure = pytz.timezone( registration_closure = pytz.timezone(
timezone_str timezone_str
@@ -1141,9 +1141,9 @@ def update_virtualrace(ps,cd):
) )
except AttributeError: except AttributeError:
registration_closure = startdatetime registration_closure = startdatetime
elif registration_form == 'windowstart': elif registration_form == 'windowstart': # pragma: no cover
registration_closure = startdatetime registration_closure = startdatetime
elif registration_form == 'windowend': elif registration_form == 'windowend': # pragma: no cover
registration_closure = enddatetime registration_closure = enddatetime
else: else:
registration_closure = ps.evaluation_closure registration_closure = ps.evaluation_closure
@@ -1191,11 +1191,11 @@ def race_can_edit(r,race):
) )
if timezone.now()<enddatetime: if timezone.now()<enddatetime:
return True return True
else: else: # pragma: no cover
return False return False
return False return False # pragma: no cover
def race_can_submit(r,race): def race_can_submit(r,race):
#if r not in race.rower.all(): #if r not in race.rower.all():
@@ -1219,7 +1219,7 @@ def race_can_submit(r,race):
else: else:
return False return False
return False return False # pragma: no cover
def race_can_editentry(r,race): def race_can_editentry(r,race):
start_time = race.start_time start_time = race.start_time
@@ -1234,12 +1234,12 @@ def race_can_editentry(r,race):
is_complete,has_registered = race_rower_status(r,race) is_complete,has_registered = race_rower_status(r,race)
if is_complete == False: if is_complete == False:
return True return True
else: else: # pragma: no cover
return False return False
else: else: # pragma: no cover
return False return False
return False return False # pragma: no cover
def race_can_resubmit(r,race): def race_can_resubmit(r,race):
records = VirtualRaceResult.objects.filter( records = VirtualRaceResult.objects.filter(
@@ -1263,10 +1263,10 @@ def race_can_resubmit(r,race):
if timezone.now() > startdatetime and timezone.now() < evaluation_closure: if timezone.now() > startdatetime and timezone.now() < evaluation_closure:
is_complete,has_registered = race_rower_status(r,race) is_complete,has_registered = race_rower_status(r,race)
return is_complete return is_complete
else: else: # pragma: no cover
return False return False
return False return False # pragma: no cover
def race_can_adddiscipline(r,race): def race_can_adddiscipline(r,race):
@@ -1276,7 +1276,7 @@ def race_can_adddiscipline(r,race):
if race.sessiontype in ['race']: if race.sessiontype in ['race']:
resultobj = VirtualRaceResult resultobj = VirtualRaceResult
else: else: # pragma: no cover
resultobj = IndoorVirtualRaceResult resultobj = IndoorVirtualRaceResult
records = resultobj.objects.filter( records = resultobj.objects.filter(
@@ -1302,12 +1302,12 @@ def race_can_adddiscipline(r,race):
is_complete,has_registered = race_rower_status(r,race) is_complete,has_registered = race_rower_status(r,race)
if has_registered: if has_registered:
return True return True
else: else: # pragma: no cover
return False return False
else: else: # pragma: no cover
return False return False
return False return False # pragma: no cover
def race_can_withdraw(r,race): def race_can_withdraw(r,race):
@@ -1334,10 +1334,10 @@ def race_can_withdraw(r,race):
) )
registration_closure = race.registration_closure registration_closure = race.registration_closure
if registration_closure is None or registration_closure == '': if registration_closure is None or registration_closure == '': # pragma: no cover
registration_closure = startdatetime registration_closure = startdatetime
if timezone.now() > registration_closure: if timezone.now() > registration_closure: # pragma: no cover
return False return False
elif timezone.now() > startdatetime: elif timezone.now() > startdatetime:
return False return False
@@ -1348,7 +1348,7 @@ def race_can_withdraw(r,race):
def email_submit_race(r,race,workoutid): def email_submit_race(r,race,workoutid):
try: try:
w = Workout.objects.get(id=workoutid) w = Workout.objects.get(id=workoutid)
except Workout.DoesNotExist: except Workout.DoesNotExist: # pragma: no cover
return 0 return 0
if race.sessionmode == 'time': if race.sessionmode == 'time':
@@ -1360,7 +1360,7 @@ def email_submit_race(r,race,workoutid):
w.save() w.save()
elif race.sessionmode == 'distance': elif race.sessionmode == 'distance': # pragma: no cover
delta = w.distance - race.sessionvalue delta = w.distance - race.sessionvalue
if delta > -5 and delta < 5: if delta > -5 and delta < 5:
@@ -1375,7 +1375,7 @@ def email_submit_race(r,race,workoutid):
if sex == 'not specified': if sex == 'not specified':
sex = 'male' sex = 'male'
if not r.birthdate: if not r.birthdate: # pragma: no cover
return 0 return 0
age = calculate_age(r.birthdate) age = calculate_age(r.birthdate)
@@ -1429,7 +1429,7 @@ def email_submit_race(r,race,workoutid):
race=race race=race
) )
if not records: if not records: # pragma: no cover
return 0 return 0
record = records[0] record = records[0]
@@ -1461,12 +1461,12 @@ def email_submit_race(r,race,workoutid):
return 1 return 1
else: else:
return 0 return 0 # pragma: no cover
else: else: # pragma: no cover
return 0 return 0
return 0 return 0 # pragma: no cover
def race_can_register(r,race): def race_can_register(r,race):
@@ -1490,10 +1490,10 @@ def race_can_register(r,race):
) )
registration_closure = race.registration_closure registration_closure = race.registration_closure
if registration_closure is None or registration_closure == '': if registration_closure is None or registration_closure == '': # pragma: no cover
registration_closure = startdatetime registration_closure = startdatetime
if timezone.now() > registration_closure: if timezone.now() > registration_closure: # pragma: no cover
return False return False
return True return True
@@ -1507,12 +1507,12 @@ def add_rower_race(r,race):
def remove_rower_race(r,race,recordid=None): def remove_rower_race(r,race,recordid=None):
race.rower.remove(r) race.rower.remove(r)
if race.sessiontype in ['race']: if race.sessiontype in ['race']: # pragma: no cover
recordobj = VirtualRaceResult recordobj = VirtualRaceResult
else: else:
recordobj = IndoorVirtualRaceResult recordobj = IndoorVirtualRaceResult
if recordid: if recordid: # pragma: no cover
records = recordobj.objects.filter(userid=r.id, records = recordobj.objects.filter(userid=r.id,
workoutid__isnull=True, workoutid__isnull=True,
race=race, race=race,
@@ -1529,14 +1529,14 @@ def remove_rower_race(r,race,recordid=None):
def default_class(r,w,race): def default_class(r,w,race):
if r.birthdate: if r.birthdate:
age = calculate_age(r.birthdate) age = calculate_age(r.birthdate)
else: else: # pragma: no cover
age = 25 age = 25
sex = r.sex sex = r.sex
if sex=='not specified': if sex=='not specified':
sex='male' sex='male'
if w is not None: if w is not None: # pragma: no cover
boatclass = w.workouttype boatclass = w.workouttype
boattype = w.boattype boattype = w.boattype
@@ -1545,7 +1545,7 @@ def default_class(r,w,race):
else: else:
if race.sessiontype in ['race','fastest_time','fastest_distance']: if race.sessiontype in ['race','fastest_time','fastest_distance']:
boatclass = 'water' boatclass = 'water'
else: else: # pragma: no cover
boatclass = 'rower' boatclass = 'rower'
boattype = '1x' boattype = '1x'
@@ -1565,7 +1565,7 @@ def default_class(r,w,race):
if standards.count()==0: if standards.count()==0: # pragma: no cover
# omit weight # omit weight
standards = CourseStandard.objects.filter( standards = CourseStandard.objects.filter(
agemin__lt=age,agemax__gt=age, agemin__lt=age,agemax__gt=age,
@@ -1642,14 +1642,14 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
ids = [w.id for w in ws] ids = [w.id for w in ws]
ids = list(set(ids)) ids = list(set(ids))
if len(ids)>1 and race.sessiontype in ['test','coursetest','race','indoorrace','fastest_time','fastest_distance']: if len(ids)>1 and race.sessiontype in ['test','coursetest','race','indoorrace','fastest_time','fastest_distance']: # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors,0 return result,comments,errors,0
username = r.user.first_name+' '+r.user.last_name username = r.user.first_name+' '+r.user.last_name
if r.birthdate: if r.birthdate:
age = calculate_age(r.birthdate) age = calculate_age(r.birthdate)
else: else: # pragma: no cover
age = None age = None
try: try:
@@ -1658,7 +1658,7 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
race=race, race=race,
id=recordid id=recordid
) )
except IndoorVirtualRaceResult.DoesNotExist: except IndoorVirtualRaceResult.DoesNotExist: # pragma: no cover
if doregister: if doregister:
hasinitial,boattype,boatclass,adaptiveclass,weightclass,sex,referencespeed,initialcategory = default_class(r,ws[0],race) hasinitial,boattype,boatclass,adaptiveclass,weightclass,sex,referencespeed,initialcategory = default_class(r,ws[0],race)
if hasinitial: if hasinitial:
@@ -1678,7 +1678,7 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
else: else:
errors.append("Unable to find a suitable start category") errors.append("Unable to find a suitable start category")
return result,comments,errors,0 return result,comments,errors,0
else: else: # pragma: no cover
errors.append("Couldn't find this entry") errors.append("Couldn't find this entry")
return result,comments,errors,0 return result,comments,errors,0
@@ -1688,19 +1688,19 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
workoutid = ws[0].id workoutid = ws[0].id
) )
if ws[0].workouttype != record.boatclass: if ws[0].workouttype != record.boatclass: # pragma: no cover
errors.append('Your workout boat class is different than on your race registration') errors.append('Your workout boat class is different than on your race registration')
return 0,comments,errors,0 return 0,comments,errors,0
if ws[0].workouttype not in mytypes.otwtypes: if ws[0].workouttype not in mytypes.otwtypes: # pragma: no cover
errors.append('You must submit a on-the-water rowing workout') errors.append('You must submit a on-the-water rowing workout')
return 0,comments, errors, 0 return 0,comments, errors, 0
if record.weightcategory == 'lwt' and ws[0].weightcategory != record.weightcategory: if record.weightcategory == 'lwt' and ws[0].weightcategory != record.weightcategory: # pragma: no cover
errors.append('Your workout weight category did not match the weight category you registered') errors.append('Your workout weight category did not match the weight category you registered')
return 0,comments, errors,0 return 0,comments, errors,0
if ws[0].adaptiveclass != record.adaptiveclass: if ws[0].adaptiveclass != record.adaptiveclass: # pragma: no cover
errors.append('Your adaptive classification did not match the registration') errors.append('Your adaptive classification did not match the registration')
return 0,comments, errors, 0 return 0,comments, errors, 0
@@ -1710,12 +1710,12 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
ws[0].save() ws[0].save()
result += 1 result += 1
else: else: # pragma: no cover
errors.append('Workout %i did not match the race window' % ws[0].id) errors.append('Workout %i did not match the race window' % ws[0].id)
return result,comments,errors,0 return result,comments,errors,0
if result>0: if result>0:
for otherrecord in records: for otherrecord in records: # pragma: no cover
otherrecord.workoutid = None otherrecord.workoutid = None
otherrecord.coursecompleted = False otherrecord.coursecompleted = False
otherrecord.save() otherrecord.save()
@@ -1739,7 +1739,7 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
record.startsecond = startsecond record.startsecond = startsecond
record.endsecond = endsecond record.endsecond = endsecond
record.save() record.save()
if race.sessiontype == 'fastest_time': if race.sessiontype == 'fastest_time': # pragma: no cover
df = dataprep.getsmallrowdata_db(['time','cumdist'],ids=[ws[0].id]) df = dataprep.getsmallrowdata_db(['time','cumdist'],ids=[ws[0].id])
fastest_meters, startsecond, endsecond = datautils.getfastest(df,race.sessionvalue,mode='time') fastest_meters, startsecond, endsecond = datautils.getfastest(df,race.sessionvalue,mode='time')
velo = fastest_meters/(60.*race.sessionvalue) velo = fastest_meters/(60.*race.sessionvalue)
@@ -1757,13 +1757,13 @@ def add_workout_fastestrace(ws, race, r, recordid=0, doregister=False):
if ws[0].privacy == 'private': if ws[0].privacy == 'private': # pragma: no cover
ws[0].privacy = 'visible' ws[0].privacy = 'visible'
ws[0].save() ws[0].save()
comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.') comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.')
record.save() record.save()
else: else: # pragma: no cover
errors.append('Could not find a valid interval in this workout') errors.append('Could not find a valid interval in this workout')
return result, comments, errors, 0 return result, comments, errors, 0
@@ -1791,12 +1791,12 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
# check if all sessions have same date # check if all sessions have same date
dates = [w.date for w in ws] dates = [w.date for w in ws]
if (not all(d == dates[0] for d in dates)) and race.sessiontype not in ['challenge','cycletarget']: if (not all(d == dates[0] for d in dates)) and race.sessiontype not in ['challenge','cycletarget']: # pragma: no cover
errors.append('For tests and training sessions, selected workouts must all be done on the same date') errors.append('For tests and training sessions, selected workouts must all be done on the same date')
return result,comments,errors,0 return result,comments,errors,0
if len(ws)>1 and race.sessiontype == 'test': if len(ws)>1 and race.sessiontype == 'test': # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors,0 return result,comments,errors,0
@@ -1805,7 +1805,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
ids = [w.id for w in ws] ids = [w.id for w in ws]
ids = list(set(ids)) ids = list(set(ids))
if len(ids)>1 and race.sessiontype in ['test','coursetest','race','indoorrace','fastest_time','fastest_distance']: if len(ids)>1 and race.sessiontype in ['test','coursetest','race','indoorrace','fastest_time','fastest_distance']: # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors,0 return result,comments,errors,0
@@ -1814,7 +1814,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
username = r.user.first_name+' '+r.user.last_name username = r.user.first_name+' '+r.user.last_name
if r.birthdate: if r.birthdate:
age = calculate_age(r.birthdate) age = calculate_age(r.birthdate)
else: else: # pragma: no cover
age = None age = None
try: try:
@@ -1823,7 +1823,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
race=race, race=race,
id=recordid id=recordid
) )
except IndoorVirtualRaceResult.DoesNotExist: except IndoorVirtualRaceResult.DoesNotExist: # pragma: no cover
if doregister: if doregister:
hasinitial,boattype,boatclass,adaptiveclass,weightclass,sex,referencespeed,initialcategory = default_class(r,ws[0],race) hasinitial,boattype,boatclass,adaptiveclass,weightclass,sex,referencespeed,initialcategory = default_class(r,ws[0],race)
if hasinitial: if hasinitial:
@@ -1843,7 +1843,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
else: else:
errors.append("Unable to find a suitable start category") errors.append("Unable to find a suitable start category")
return result,comments,errors,0 return result,comments,errors,0
else: else: # pragma: no cover
errors.append("Couldn't find this entry") errors.append("Couldn't find this entry")
return result,comments,errors,0 return result,comments,errors,0
@@ -1864,7 +1864,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
else: else:
t = ws[0].duration t = ws[0].duration
seconds = t.second+t.minute*60.+t.hour*3600.+t.microsecond/1.e6 seconds = t.second+t.minute*60.+t.hour*3600.+t.microsecond/1.e6
if seconds != race.sessionvalue*60.: if seconds != race.sessionvalue*60.: # pragma: no cover
errors.append('Your workout did not have the correct duration') errors.append('Your workout did not have the correct duration')
return 0, comments, errors, 0 return 0, comments, errors, 0
else: else:
@@ -1875,15 +1875,15 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
errors.append('Your workout boat class is different than on your race registration') errors.append('Your workout boat class is different than on your race registration')
return 0,comments,errors,0 return 0,comments,errors,0
if ws[0].workouttype not in mytypes.otetypes: if ws[0].workouttype not in mytypes.otetypes: # pragma: no cover
errors.append('You must submit a indoor rowing workout') errors.append('You must submit a indoor rowing workout')
return 0,comments, errors, 0 return 0,comments, errors, 0
if record.weightcategory == 'lwt' and ws[0].weightcategory != record.weightcategory: if record.weightcategory == 'lwt' and ws[0].weightcategory != record.weightcategory: # pragma: no cover
errors.append('Your workout weight category did not match the weight category you registered') errors.append('Your workout weight category did not match the weight category you registered')
return 0,comments, errors,0 return 0,comments, errors,0
if ws[0].adaptiveclass != record.adaptiveclass: if ws[0].adaptiveclass != record.adaptiveclass: # pragma: no cover
errors.append('Your adaptive classification did not match the registration') errors.append('Your adaptive classification did not match the registration')
return 0,comments, errors, 0 return 0,comments, errors, 0
@@ -1893,12 +1893,12 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
ws[0].save() ws[0].save()
result += 1 result += 1
else: else: # pragma: no cover
errors.append('Workout %i did not match the race window' % ws[0].id) errors.append('Workout %i did not match the race window' % ws[0].id)
return result,comments,errors,0 return result,comments,errors,0
if result>0: if result>0:
for otherrecord in records: for otherrecord in records: # pragma: no cover
otherrecord.workoutid = None otherrecord.workoutid = None
otherrecord.coursecompleted = False otherrecord.coursecompleted = False
otherrecord.save() otherrecord.save()
@@ -1906,7 +1906,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0,doregister=False):
record.coursecompleted = True record.coursecompleted = True
record.workoutid = ws[0].id record.workoutid = ws[0].id
if ws[0].privacy == 'private': if ws[0].privacy == 'private': # pragma: no cover
ws[0].privacy = 'visible' ws[0].privacy = 'visible'
ws[0].save() ws[0].save()
comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.') comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.')
@@ -1940,11 +1940,11 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
# check if all sessions have same date # check if all sessions have same date
dates = [w.date for w in ws] dates = [w.date for w in ws]
if (not all(d == dates[0] for d in dates)) and race.sessiontype not in ['challenge','cycletarget']: if (not all(d == dates[0] for d in dates)) and race.sessiontype not in ['challenge','cycletarget']: # pragma: no cover
errors.append('For tests and training sessions, selected workouts must all be done on the same date') errors.append('For tests and training sessions, selected workouts must all be done on the same date')
return result,comments,errors,0 return result,comments,errors,0
if len(ws)>1 and race.sessiontype == 'test': if len(ws)>1 and race.sessiontype == 'test': # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors,0 return result,comments,errors,0
@@ -1953,7 +1953,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
ids = [w.id for w in ws] ids = [w.id for w in ws]
ids = list(set(ids)) ids = list(set(ids))
if len(ids)>1 and race.sessiontype in ['test','coursetest','race','fastest_time','fastest_distance']: if len(ids)>1 and race.sessiontype in ['test','coursetest','race','fastest_time','fastest_distance']: # pragma: no cover
errors.append('For tests, you can only attach one workout') errors.append('For tests, you can only attach one workout')
return result,comments,errors,0 return result,comments,errors,0
@@ -1962,7 +1962,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
username = r.user.first_name+' '+r.user.last_name username = r.user.first_name+' '+r.user.last_name
if r.birthdate: if r.birthdate:
age = calculate_age(r.birthdate) age = calculate_age(r.birthdate)
else: else: # pragma: no cover
age = None age = None
try: try:
@@ -1971,7 +1971,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
race=race, race=race,
id=recordid id=recordid
) )
except VirtualRaceResult.DoesNotExist: except VirtualRaceResult.DoesNotExist: # pragma: no cover
if doregister: if doregister:
hasinitial,boattype,boatclass,adaptiveclass,weightclass,sex,referencespeed,initialcategory = default_class(r,ws[0],race) hasinitial,boattype,boatclass,adaptiveclass,weightclass,sex,referencespeed,initialcategory = default_class(r,ws[0],race)
if hasinitial: if hasinitial:
@@ -1993,7 +1993,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
else: else:
errors.append("Unable to find a suitable start category") errors.append("Unable to find a suitable start category")
return result,comments,errors,0 return result,comments,errors,0
else: else: # pragma: no cover
errors.append("Couldn't find this entry") errors.append("Couldn't find this entry")
return result,comments,errors,0 return result,comments,errors,0
@@ -2003,7 +2003,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
workoutid = ws[0].id workoutid = ws[0].id
) )
if not record and not doregister: if not record and not doregister: # pragma: no cover
errors.append("Couldn't find this entry") errors.append("Couldn't find this entry")
return result,comments,errors,0 return result,comments,errors,0
@@ -2011,21 +2011,21 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
# errors.append('You have to submit a rowing on water workout') # errors.append('You have to submit a rowing on water workout')
# return 0,comments,errors,0 # return 0,comments,errors,0
if ws[0].workouttype != record.boatclass: if ws[0].workouttype != record.boatclass: # pragma: no cover
ws[0].workouttype = record.boatclass ws[0].workouttype = record.boatclass
ws[0].save() ws[0].save()
#errors.append('Your workout boat class is different than on your race registration') #errors.append('Your workout boat class is different than on your race registration')
#return 0,comments,errors,0 #return 0,comments,errors,0
if ws[0].boattype != record.boattype: if ws[0].boattype != record.boattype: # pragma: no cover
errors.append('Your workout boat type did not match the boat type you registered') errors.append('Your workout boat type did not match the boat type you registered')
return 0,comments,errors,0 return 0,comments,errors,0
if record.weightcategory == 'lwt' and ws[0].weightcategory != record.weightcategory: if record.weightcategory == 'lwt' and ws[0].weightcategory != record.weightcategory: # pragma: no cover
errors.append('Your workout weight category did not match the weight category you registered') errors.append('Your workout weight category did not match the weight category you registered')
return 0,comments, errors,0 return 0,comments, errors,0
if ws[0].adaptiveclass != record.adaptiveclass: if ws[0].adaptiveclass != record.adaptiveclass: # pragma: no cover
errors.append('Your workout adaptive classification did not match the registration') errors.append('Your workout adaptive classification did not match the registration')
return 0,comments, errors,0 return 0,comments, errors,0
@@ -2043,17 +2043,17 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
ws[0].save() ws[0].save()
result += 1 result += 1
else: else: # pragma: no cover
errors.append('Workout %i did not match the race window' % ws[0].id) errors.append('Workout %i did not match the race window' % ws[0].id)
return result,comments,errors,0 return result,comments,errors,0
if result>0: if result>0:
for otherrecord in records: for otherrecord in records: # pragma: no cover
otherrecord.workoutid = None otherrecord.workoutid = None
otherrecord.coursecompleted = False otherrecord.coursecompleted = False
otherrecord.save() otherrecord.save()
if ws[0].privacy == 'private': if ws[0].privacy == 'private': # pragma: no cover
ws[0].privacy = 'visible' ws[0].privacy = 'visible'
ws[0].save() ws[0].save()
comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.') comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.')
@@ -2074,7 +2074,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0,doregister=False):
return result,comments,errors,job.id return result,comments,errors,job.id
def delete_race_result(workout,race): def delete_race_result(workout,race): # pragma: no cover
results = VirtualRaceResult.objects.filter(workoutid=workout.id,race=race) results = VirtualRaceResult.objects.filter(workoutid=workout.id,race=race)
for r in results: for r in results:
r.workoutid = None r.workoutid = None

View File

@@ -158,7 +158,7 @@
<li id="export-nk"> <li id="export-nk">
{% if workout.uploadedtonk %} {% if workout.uploadedtonk %}
<a href="{{ workout|nkviewerlink }}"> <a href="{{ workout|nkviewerlink }}">
NK LiNK <i class="fas fa-check"></i> NK Logbook <i class="fas fa-check"></i>
</a> </a>
{% endif %} {% endif %}
</li> </li>

View File

@@ -38,7 +38,7 @@
<ul> <ul>
<li id="concept2"><a href="/rowers/workout/c2list/">Concept2</a></li> <li id="concept2"><a href="/rowers/workout/c2list/">Concept2</a></li>
<li id="nklink"><a href="/rowers/workout/nkimport/">NK LiNK</a></li> <li id="nklink"><a href="/rowers/workout/nkimport/">NK Logbook</a></li>
<li id="strava"><a href="/rowers/workout/stravaimport/">Strava</a></li> <li id="strava"><a href="/rowers/workout/stravaimport/">Strava</a></li>
<li id="runkeeper"><a href="/rowers/workout/runkeeperimport/">RunKeeper</a></li> <li id="runkeeper"><a href="/rowers/workout/runkeeperimport/">RunKeeper</a></li>
<li id="sporttracks"><a href="/rowers/workout/sporttracksimport/">SportTracks</a></li> <li id="sporttracks"><a href="/rowers/workout/sporttracksimport/">SportTracks</a></li>

View File

@@ -5,7 +5,7 @@
{% block title %}Workouts{% endblock %} {% block title %}Workouts{% endblock %}
{% block main %} {% block main %}
<h1>Available on NK LiNK Logbook</h1> <h1>Available on NK Logbook</h1>
{% if workouts %} {% if workouts %}
<ul class="main-content"> <ul class="main-content">
<li> <li>

View File

@@ -12,7 +12,7 @@
Concept2 Logbook, Concept2 Logbook,
{% endif %} {% endif %}
{% if rower.nktoken is not None and rower.nktoken != '' %} {% if rower.nktoken is not None and rower.nktoken != '' %}
NK LiNK, NK Logbook,
{% endif %} {% endif %}
{% if rower.sporttrackstoken is not None and rower.sporttrackstoken != '' %} {% if rower.sporttrackstoken is not None and rower.sporttrackstoken != '' %}
SportTracks, SportTracks,
@@ -74,7 +74,7 @@
choice or to renew the authorization.</p> choice or to renew the authorization.</p>
<p><a href="/rowers/me/stravaauthorize/"><img src="/static/img/ConnectWithStrava.png" alt="connect with strava" width="120"></a></p> <p><a href="/rowers/me/stravaauthorize/"><img src="/static/img/ConnectWithStrava.png" alt="connect with strava" width="120"></a></p>
<p><a href="/rowers/me/c2authorize/"><img src="/static/img/blueC2logo.png" alt="connect with Concept2" width="120"></a></p> <p><a href="/rowers/me/c2authorize/"><img src="/static/img/blueC2logo.png" alt="connect with Concept2" width="120"></a></p>
<p><a href="/rowers/me/nkauthorize/"><img src="/static/img/NKLiNK.jpg" alt="connect with NK LiNK" width="120"></a></p> <p><a href="/rowers/me/nkauthorize/"><img src="/static/img/NKLiNK.jpg" alt="connect with NK Logbook" width="120"></a></p>
<p><a href="/rowers/me/sporttracksauthorize/"><img src="/static/img/sporttracks-button.png" alt="connect with SportTracks" width="120"></a></p> <p><a href="/rowers/me/sporttracksauthorize/"><img src="/static/img/sporttracks-button.png" alt="connect with SportTracks" width="120"></a></p>
<p><a href="/rowers/me/runkeeperauthorize/"><img src="/static/img/rk-logo.png" alt="connect with RunKeeper" width="120"></a></p> <p><a href="/rowers/me/runkeeperauthorize/"><img src="/static/img/rk-logo.png" alt="connect with RunKeeper" width="120"></a></p>
<p><a href="/rowers/me/underarmourauthorize/"><img src="/static/img/UAbtn.png" alt="connect with Under Armour" width="120"></a></p> <p><a href="/rowers/me/underarmourauthorize/"><img src="/static/img/UAbtn.png" alt="connect with Under Armour" width="120"></a></p>

View File

@@ -111,6 +111,17 @@ class ChallengesTest(TestCase):
workouttype = 'water', workouttype = 'water',
) )
result = get_random_file(filename='rowers/tests/testdata/thyro.csv')
self.wthyro3 = WorkoutFactory(user=self.r2,
csvfilename=result['filename'],
starttime=result['starttime'],
startdatetime=result['startdatetime'],
duration=result['duration'],
distance=result['totaldist'],
workouttype = 'water',
)
self.wthyro2.startdatetime = arrow.get(nu).datetime self.wthyro2.startdatetime = arrow.get(nu).datetime
self.wthyro2.date = nu.date() self.wthyro2.date = nu.date()
self.wthyro2.save() self.wthyro2.save()
@@ -164,6 +175,40 @@ class ChallengesTest(TestCase):
) )
self.result.save() self.result.save()
self.FastestRace = VirtualRace(
name='Thyro 5K',
startdate=startdate,
preferreddate = startdate,
start_time = start_time,
enddate=enddate,
end_time=end_time,
sessionvalue=200,
comment='',
sessiontype = 'fastest_distance',
timezone=timezone_str,
evaluation_closure=evaluation_closure,
registration_closure=registration_closure,
contact_phone=contact_phone,
contact_email=contact_email,
manager=self.u,
)
self.FastestRace.save()
self.result = VirtualRaceResult(
userid = self.u2.id,
username = self.u2.username,
race = self.FastestRace,
distance = 300,
duration = datetime.time(0,1,20),
points = 75,
coursecompleted = True,
age = 28,
startsecond = 0,
endsecond = 120,
workoutid = self.wthyro3.id
)
self.result.save()
def tearDown(self): def tearDown(self):
for workout in self.user_workouts: for workout in self.user_workouts:
@@ -182,12 +227,12 @@ class ChallengesTest(TestCase):
lat_lon = (52.214229145558484, 6.890036546847821) lat_lon = (52.214229145558484, 6.890036546847821)
races = VirtualRace.objects.all() races = VirtualRace.objects.all()
traces = getnearestraces(lat_lon,races) traces = getnearestraces(lat_lon,races)
self.assertEqual(len(traces),1) self.assertEqual(len(traces),2)
lat_lon = (0, 0) lat_lon = (0, 0)
races = VirtualRace.objects.all() races = VirtualRace.objects.all()
traces = getnearestraces(lat_lon,races) traces = getnearestraces(lat_lon,races)
self.assertEqual(len(traces),1) self.assertEqual(len(traces),2)
def test_getnearestcourses(self): def test_getnearestcourses(self):
lat_lon = (52.214229145558484, 6.890036546847821) lat_lon = (52.214229145558484, 6.890036546847821)
@@ -388,6 +433,72 @@ class ChallengesTest(TestCase):
self.assertEqual(response.status_code, 200) self.assertEqual(response.status_code, 200)
def test_fastestrace_view(self):
login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login)
race = self.FastestRace
if self.r.birthdate:
age = calculate_age(self.r.birthdate)
else:
age = 25
# look at event
url = reverse('virtualevent_view',kwargs={'id':race.id})
response = self.c.get(url)
self.assertEqual(response.status_code,200)
# register
url = reverse('virtualevent_register_view',kwargs={'id':race.id})
response = self.c.get(url)
self.assertEqual(response.status_code,200)
form_data = {
'teamname': 'ApeTeam',
'boatclass': 'water',
'boattype': '1x',
'weightcategory': 'hwt',
'adaptiveclass': 'None',
'age': age,
'mix': False,
'acceptsocialmedia': True,
}
form = VirtualRaceResultForm(form_data)
self.assertTrue(form.is_valid())
response = self.c.post(url,form_data,follow=True)
expected_url = reverse('virtualevent_view',kwargs={'id':race.id})
self.assertRedirects(response, expected_url=expected_url,
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
# submit workout
url = reverse('virtualevent_submit_result_view',kwargs={'id':race.id,'workoutid':self.wthyro.id})
response = self.c.get(url)
self.assertEqual(response.status_code, 200)
records = IndoorVirtualRaceResult.objects.filter(userid=self.u.id)
self.assertEqual(len(records),1)
record = records[0]
form_data = {
'workouts':[self.wthyro.id],
'record':record.id,
}
response = self.c.post(url,form_data,follow=True)
self.assertRedirects(response, expected_url=expected_url,
status_code=302,target_status_code=200)
self.assertEqual(response.status_code, 200)
def test_virtualevents_view(self): def test_virtualevents_view(self):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)
self.assertTrue(login) self.assertTrue(login)
@@ -995,6 +1106,8 @@ class IndoorChallengesTest(TestCase):
self.assertEqual(response.url,expected) self.assertEqual(response.url,expected)
@patch('rowers.views.racesviews.myqueue') @patch('rowers.views.racesviews.myqueue')
def test_virtualevent_view(self,mocked_myqueue): def test_virtualevent_view(self,mocked_myqueue):
login = self.c.login(username=self.u.username, password=self.password) login = self.c.login(username=self.u.username, password=self.password)

View File

@@ -296,6 +296,11 @@ class PlannedSessionTests(TestCase):
micro2 = plannedsessions.get_todays_micro(self.plan,thedate=datetime.date.today()) micro2 = plannedsessions.get_todays_micro(self.plan,thedate=datetime.date.today())
self.assertEqual(micro1.id,micro2.id) self.assertEqual(micro1.id,micro2.id)
def test_get_session_ids(self):
ids = plannedsessions.get_my_session_ids(self.r)
pss = PlannedSession.objects.filter(rower__in=[self.r])
self.assertEqual(len(ids),len(pss))
class DataPrepTests(TestCase): class DataPrepTests(TestCase):
def setUp(self): def setUp(self):
self.u = UserFactory() self.u = UserFactory()

View File

@@ -393,7 +393,7 @@ def workout_sporttracks_upload_view(request,id=0):
return HttpResponseRedirect(url) # pragma: no cover return HttpResponseRedirect(url) # pragma: no cover
# NK LiNK authorization # NK Logbook authorization
@login_required() @login_required()
def rower_nk_authorize(request): # pragma: no cover def rower_nk_authorize(request): # pragma: no cover
state = str(uuid4()) state = str(uuid4())

View File

@@ -3281,7 +3281,6 @@ def virtualevent_submit_result_view(request,id=0,workoutid=0):
if request.method == 'POST': if request.method == 'POST':
w_form = WorkoutRaceSelectForm(workoutdata,entries,request.POST) w_form = WorkoutRaceSelectForm(workoutdata,entries,request.POST)
if w_form.is_valid(): if w_form.is_valid():
selectedworkout = w_form.cleaned_data['workouts'] selectedworkout = w_form.cleaned_data['workouts']
splitsecond = 0 splitsecond = 0