From df80860ed12c064705004b87ae225d94d699bec1 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Thu, 31 Oct 2019 18:32:58 +0100 Subject: [PATCH] replaced len with count() on a few queries --- rowers/alerts.py | 24 +-- rowers/models.py | 8 +- rowers/plannedsessions.py | 144 +++++++++-------- rowers/views/planviews.py | 325 +++++++++++++++++++------------------- 4 files changed, 248 insertions(+), 253 deletions(-) diff --git a/rowers/alerts.py b/rowers/alerts.py index 7a3eaa09..886c34f6 100644 --- a/rowers/alerts.py +++ b/rowers/alerts.py @@ -13,7 +13,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, if manager.rower != rower: if rower not in coach_getcoachees(manager.rower): return 0,'You are not allowed to create this alert' - + m = Condition( metric = measured['metric'], value1 = measured['value1'], @@ -22,7 +22,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, ) m.save() - + alert = Alert(name=name, manager=manager, rower=rower, @@ -46,7 +46,7 @@ def create_alert(manager, rower, measured,period=7, emailalert=True, value2 = f['value2'], condition = f['condition'] ) - + m.save() alert.filter.add(m) @@ -79,7 +79,7 @@ def alert_add_filters(alert,filters): m.save() alert.filter.add(m) - + return 1 # get alert stats @@ -104,7 +104,7 @@ def alert_get_stats(alert,nperiod=0): if df.empty: return { - 'workouts':len(workouts), + 'workouts':workouts.count(), 'startdate':startdate, 'enddate':enddate, 'nr_strokes':0, @@ -139,7 +139,7 @@ def alert_get_stats(alert,nperiod=0): df.dropna(inplace=True,axis=0) else: return { - 'workouts':len(workouts), + 'workouts':workouts.count(), 'startdate':startdate, 'enddate':enddate, 'nr_strokes':0, @@ -150,11 +150,11 @@ def alert_get_stats(alert,nperiod=0): 'median_q': 0, 'standard_dev': 0, } - - + + # count strokes nr_strokes = len(df) - + # count qualifying if alert.measured.condition == '>': @@ -164,7 +164,7 @@ def alert_get_stats(alert,nperiod=0): mask = df[alert.measured.metric] < alert.measured.value1 df2 = df[mask].copy() elif alert.measured.condition == 'between': - mask = df[alert.measured.metric] > alert.measured.value1 + mask = df[alert.measured.metric] > alert.measured.value1 mask2 = df[alert.measured.metric] < alert.measured.value2 df2 = df[mask & mask2].copy() else: @@ -181,9 +181,9 @@ def alert_get_stats(alert,nperiod=0): median_q = df2[alert.measured.metric].median() median = df[alert.measured.metric].median() std = df[alert.measured.metric].std() - + return { - 'workouts':len(workouts), + 'workouts':workouts.count(), 'startdate':startdate, 'enddate':enddate, 'nr_strokes':nr_strokes, diff --git a/rowers/models.py b/rowers/models.py index 6b773bde..68b6d7c2 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -364,7 +364,7 @@ class Team(models.Model): if manager.rower.rowerplan in ['plan','pro']: otherteams = Team.objects.filter(manager=manager) - if len(otherteams) >= 1: + if otherteams.count() >= 1: raise ValidationError( "Pro and Self-Coach users cannot have more than one team" ) @@ -569,7 +569,7 @@ def course_length(course): if not polygons: return 0 - for i in range(len(polygons)-1): + for i in range(polygons.count()-1): latitude1,longitude1 = polygon_coord_center(polygons[i]) latitude2,longitude2 = polygon_coord_center(polygons[i+1]) @@ -656,7 +656,7 @@ class CoachingGroup(models.Model): def __len__(self): rs = Rower.objects.filter(coachinggroups__in=[self]) - return len(rs) + return rs.count() # Extension of User with rowing specific data @python_2_unicode_compatible @@ -3133,7 +3133,7 @@ def auto_delete_image_on_delete(sender,instance, **kwargs): if instance.filename: if os.path.isfile(instance.filename): others = GraphImage.objects.filter(filename=instance.filename) - if len(others) == 0: + if others.count() == 0: os.remove(instance.filename) else: print("couldn't find the file "+instance.filename) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 05d0bfbc..29cceb11 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -62,7 +62,7 @@ def checkscores(r,macrocycles): m.plantrimp = 0 m.actualtrimp = 0 - + mesocycles = TrainingMesoCycle.objects.filter( plan=m, type='userdefined').order_by("startdate") @@ -76,19 +76,19 @@ def checkscores(r,macrocycles): me.actualrscore = 0 me.plantrimp = 0 me.actualtrimp = 0 - + microcycles = TrainingMicroCycle.objects.filter( plan=me, type='userdefined').order_by("startdate") for mm in microcycles: sps = get_sessions(r,startdate=mm.startdate,enddate=mm.enddate) - + # sps = PlannedSession.objects.filter( # rower = r, # startdate__lte=mm.enddate, # enddate__gte=mm.startdate) - + mm.plantime = 0 mm.actualtime = 0 @@ -139,11 +139,11 @@ def checkscores(r,macrocycles): m.plantrimp += me.plantrimp m.actualtrimp += me.actualtrimp - + if m.type == 'userdefined': m.save() - + def get_execution_report(rower,startdate,enddate,plan=None): if plan: @@ -188,7 +188,7 @@ def get_execution_report(rower,startdate,enddate,plan=None): startdates = [] planned = [] executed = [] - + for mm in micros: plannedscore = 0 actualscore = 0 @@ -219,7 +219,7 @@ def get_execution_report(rower,startdate,enddate,plan=None): plannedscore += 60. elif ps.sessionmode == 'TRIMP': plannedscore += ps.sessionvalue/2. - + for w in ws: if w.rscore != 0: if ratio > 0: @@ -234,19 +234,19 @@ def get_execution_report(rower,startdate,enddate,plan=None): actualscore += w.hrtss else: plannedscore += 60 - actualscore += 0 + actualscore += 0 else: minutes = w.duration.hour*60+w.duration.minute if ratio > 0: plannedscore += minutes/ratio else: plannedscore += 60 - + actualscore += minutes actualscore = int(actualscore) plannedscore = int(plannedscore) - + startdates += [mm.startdate] planned += [plannedscore] executed += [actualscore] @@ -272,14 +272,14 @@ def get_indoorraces(workout): if workout.duration.second == 0 and workout.duration.microsecond == 0: duration = 60*workout.duration.hour+workout.duration.minute - + races2 = VirtualRace.objects.filter( sessiontype='indoorrace', startdate__lte=workout.date, enddate__gte=workout.date, sessionmode='time', sessionvalue=duration) - + races = races1 | races2 else: races = races1 @@ -290,13 +290,13 @@ def get_indoorraces(workout): userid=workout.user.id) races = [r.race for r in registrations] - - + + return races def get_todays_micro(plan,thedate=date.today()): thismicro = None - + thismacro = TrainingMacroCycle.objects.filter( plan=plan, startdate__lte = thedate, @@ -334,7 +334,7 @@ def add_workouts_plannedsession(ws,ps,r): errors.append('For tests and training sessions, selected workouts must all be done on the same date') return result,comments,errors - if len(ws)>1 and ps.sessiontype == 'test': + if ws.count()>1 and ps.sessiontype == 'test': errors.append('For tests, you can only attach one workout') return result,comments,errors @@ -438,7 +438,7 @@ def get_session_metrics(ps): ws = Workout.objects.filter(user=r,plannedsession=ps).order_by("date") - if len(ws) != 0: + if ws.count() != 0: for w in ws: distancev += w.distance durationv += timefield_to_seconds_duration(w.duration) @@ -493,7 +493,7 @@ cratiocolors = { def is_session_complete_ws(ws,ps): ws = ws.order_by("date") - if len(ws)==0: + if ws.count()==0: today = date.today() if today > ps.enddate: verdict = 'missed' @@ -519,7 +519,7 @@ def is_session_complete_ws(ws,ps): 'way over target': 1.5 } - + if ps.criterium == 'none': if ps.sessiontype == 'session': cratiomin = 0.8 @@ -549,7 +549,7 @@ def is_session_complete_ws(ws,ps): elif rscore == 0: trimp,hrtss = dataprep.workout_trimp(w) score += hrtss - + if not completiondate and score>=cratiomin*value: completiondate = w.date @@ -646,7 +646,7 @@ def is_session_complete_ws(ws,ps): mode='coursetest') return (0,'not done',None) - + else: if not completiondate: @@ -657,7 +657,7 @@ def is_session_complete_ws(ws,ps): def is_session_complete(r,ps): verdict = 'not done' - + if r not in ps.rower.all(): return 0,'not assigned',None @@ -686,7 +686,7 @@ def add_rower_session(r,ps): elif ps.manager.rower == r and r.rowerplan != 'freecoach': ps.rower.add(r) ps.save() - + return 0 def remove_team_session(t,ps): @@ -722,9 +722,9 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='', except ValueError: startdate = parser.parse(startdatestring,fuzzy=True) enddate = parser.parse(enddatestring, fuzzy=True) - + return startdate,enddate - + daterangetester = re.compile('^(\d+-\d+-\d+)\/(\d+-\d+-\d+)') if timeperiod=='today': @@ -770,7 +770,7 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='', elif timeperiod=='lastyear': today = date.today() startdate = today-timezone.timedelta(days=365) - enddate = today+timezone.timedelta(days=1) + enddate = today+timezone.timedelta(days=1) elif daterangetester.match(timeperiod): tstartdatestring = daterangetester.match(timeperiod).group(1) tenddatestring = daterangetester.match(timeperiod).group(2) @@ -783,18 +783,18 @@ def get_dates_timeperiod(request,startdatestring='',enddatestring='', startdate = startdate2 except ValueError: startdate = date.today() - enddate = date.today() + enddate = date.today() else: startdate = date.today() enddate = date.today() - + if startdatestring != '': try: startdate = iso8601.parse_date(startdatestring) except ParseError: pass - + if enddatestring != '': try: enddate = iso8601.parse_date(enddatestring) @@ -834,7 +834,7 @@ def get_sessions(r,startdate=date.today(), rower__in=[r], startdate__lte=enddate, enddate__gte=startdate, - is_template=False, + is_template=False, ).order_by("preferreddate","startdate","enddate").exclude( sessiontype='race').exclude(sessiontype='indoorrace') @@ -871,14 +871,14 @@ def update_indoorvirtualrace(ps,cd): value.replace("\r\n", " "); value.replace("\n", " "); setattr(ps, attr, value) - + timezone_str = cd['timezone'] # correct times - + startdatetime = datetime.combine(cd['startdate'],cd['start_time']) enddatetime = datetime.combine(cd['enddate'],cd['end_time']) - + startdatetime = pytz.timezone(timezone_str).localize( startdatetime ) @@ -910,7 +910,7 @@ def update_indoorvirtualrace(ps,cd): ps.registration_closure = registration_closure ps.timezone = timezone_str - + ps.save() return 1,'Virtual Race Updated' @@ -924,14 +924,14 @@ def update_virtualrace(ps,cd): setattr(ps, attr, value) # correct times - + course = cd['course'] geocourse = GeoCourse.objects.get(id= course.id) timezone_str = get_course_timezone(geocourse) - + startdatetime = datetime.combine(cd['startdate'],cd['start_time']) enddatetime = datetime.combine(cd['enddate'],cd['end_time']) - + startdatetime = pytz.timezone(timezone_str).localize( startdatetime ) @@ -963,7 +963,7 @@ def update_virtualrace(ps,cd): ps.registration_closure = registration_closure ps.timezone = timezone_str - + ps.save() return 1,'Virtual Race Updated' @@ -977,12 +977,12 @@ def race_rower_status(r,race): resultobj = VirtualRaceResult else: resultobj = IndoorVirtualRaceResult - + vs = resultobj.objects.filter(userid=r.id,race=race) if vs: has_registered = True is_complete = vs[0].coursecompleted - + return is_complete,has_registered def race_can_edit(r,race): @@ -999,7 +999,7 @@ def race_can_edit(r,race): return True else: return False - + return False @@ -1058,7 +1058,7 @@ def race_can_adddiscipline(r,race): if race.sessiontype != 'race': return False - + records = VirtualRaceResult.objects.filter( userid=r.id, race=race) @@ -1066,7 +1066,7 @@ def race_can_adddiscipline(r,race): if not records: return False - + start_time = race.start_time start_date = race.startdate startdatetime = datetime.combine(start_date,start_time) @@ -1086,24 +1086,24 @@ def race_can_adddiscipline(r,race): return False return False - + def race_can_withdraw(r,race): if race.sessiontype == 'race': recordobj = VirtualRaceResult else: recordobj = IndoorVirtualRaceResult - + records = recordobj.objects.filter( userid=r.id, race=race ) - + if not records: return False - + start_time = race.start_time start_date = race.startdate startdatetime = datetime.combine(start_date,start_time) @@ -1114,7 +1114,7 @@ def race_can_withdraw(r,race): registration_closure = race.registration_closure if registration_closure is None or registration_closure == '': registration_closure = startdatetime - + if timezone.now() > registration_closure: return False elif timezone.now() > startdatetime: @@ -1145,7 +1145,7 @@ def email_submit_race(r,race,workoutid): w.distance = race.sessionvalue w.save() - + if race_can_register(r,race): teamname = '' weightcategory = w.weightcategory @@ -1213,16 +1213,16 @@ def email_submit_race(r,race,workoutid): record = records[0] workouts = Workout.objects.filter(id=w.id) - + result,comments,errors,jobid = add_workout_indoorrace( workouts,race,r,recordid=record.id ) - + if result: otherrecords = IndoorVirtualRaceResult.objects.filter( race = race) - + for otherrecord in otherrecords: otheruser = Rower.objects.get(id=otherrecord.userid) othername = otheruser.user.first_name+' '+otheruser.user.last_name @@ -1241,18 +1241,18 @@ def email_submit_race(r,race,workoutid): else: return 0 else: - + return 0 return 0 - + def race_can_register(r,race): if race.sessiontype == 'race': recordobj = VirtualRaceResult else: recordobj = IndoorVirtualRaceResult - + records = recordobj.objects.filter( userid=r.id, race=race) @@ -1330,7 +1330,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0): errors.append('For tests and training sessions, selected workouts must all be done on the same date') return result,comments,errors,0 - if len(ws)>1 and race.sessiontype == 'test': + if ws.count()>1 and race.sessiontype == 'test': errors.append('For tests, you can only attach one workout') return result,comments,errors,0 @@ -1343,7 +1343,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0): errors.append('For tests, you can only attach one workout') return result,comments,errors,0 - + username = r.user.first_name+' '+r.user.last_name if r.birthdate: @@ -1388,10 +1388,10 @@ def add_workout_indoorrace(ws,race,r,recordid=0): if ws[0].workouttype != record.boatclass: errors.append('Your workout boat class is different than on your race registration') return 0,comments,errors,0 - + if ws[0].workouttype not in mytypes.otetypes: errors.append('You must submit a indoor rowing workout') - return 0,comments, errors, 0 + return 0,comments, errors, 0 if ws[0].weightcategory != record.weightcategory: errors.append('Your workout weight category did not match the weight category you registered') @@ -1416,7 +1416,7 @@ def add_workout_indoorrace(ws,race,r,recordid=0): otherrecord.workoutid = None otherrecord.coursecompleted = False otherrecord.save() - + record.coursecompleted = True record.workoutid = ws[0].id @@ -1424,15 +1424,15 @@ def add_workout_indoorrace(ws,race,r,recordid=0): ws[0].privacy = 'visible' ws[0].save() comments.append('Workouts submitted to virtual events have to be public. We have changed the workout to a public workout.') - + record.save() add_workouts_plannedsession(ws,race,r) - + return result,comments,errors,0 - + def add_workout_race(ws,race,r,splitsecond=0,recordid=0): result = 0 comments = [] @@ -1458,7 +1458,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0): errors.append('For tests and training sessions, selected workouts must all be done on the same date') return result,comments,errors,0 - if len(ws)>1 and race.sessiontype == 'test': + if ws.count()>1 and race.sessiontype == 'test': errors.append('For tests, you can only attach one workout') return result,comments,errors,0 @@ -1471,7 +1471,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0): errors.append('For tests, you can only attach one workout') return result,comments,errors,0 - + username = r.user.first_name+' '+r.user.last_name if r.birthdate: @@ -1498,11 +1498,11 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0): if ws[0].workouttype not in mytypes.otwtypes: errors.append('You have to submit a rowing on water workout') return 0,comments,errors,0 - + if ws[0].workouttype != record.boatclass: errors.append('Your workout boat class is different than on your race registration') return 0,comments,errors,0 - + if ws[0].boattype != record.boattype: errors.append('Your workout boat type did not match the boat type you registered') return 0,comments,errors,0 @@ -1530,7 +1530,7 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0): otherrecord.workoutid = None otherrecord.coursecompleted = False otherrecord.save() - + if ws[0].privacy == 'private': ws[0].privacy = 'visible' ws[0].save() @@ -1538,10 +1538,10 @@ def add_workout_race(ws,race,r,splitsecond=0,recordid=0): job = myqueue(queue,handle_check_race_course,ws[0].csvfilename, ws[0].id,race.course.id,record.id,splitsecond=splitsecond) - + add_workouts_plannedsession(ws,race,r) - + return result,comments,errors,job.id def delete_race_result(workout,race): @@ -1549,5 +1549,3 @@ def delete_race_result(workout,race): for r in results: r.workoutid = None r.save() - - diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index 15b9abbb..ec786401 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -16,7 +16,7 @@ def plannedsession_comment_view(request,id=0,userid=0): m = ps.manager mm = Rower.objects.get(user=m) - + if ps.manager != request.user and ps.sessiontype not in ['race','indoorrace']: if r.rowerplan == 'coach' and r not in ps.rower.all(): teams = Team.objects.filter(manager=request.user) @@ -57,7 +57,7 @@ def plannedsession_comment_view(request,id=0,userid=0): comment = comment, url = url, ) - if request.user != manager: + if request.user != manager: a_messages.info(r.user,message.encode('ascii','ignore')) sessiontype = 'training session' @@ -77,7 +77,7 @@ def plannedsession_comment_view(request,id=0,userid=0): sessiontype = sessiontype, commentlink = url ) - + commenters = {oc.user for oc in comments if oc.notification} if ps.sessiontype=='race': registrations = VirtualRaceResult.objects.filter( @@ -118,7 +118,7 @@ def plannedsession_comment_view(request,id=0,userid=0): url = reverse('plannedsession_comment_view',kwargs={'id':ps.id}) return HttpResponseRedirect(url) - + form = WorkoutCommentForm() @@ -141,7 +141,7 @@ def plannedsession_comment_view(request,id=0,userid=0): ] active = 'nav-racing' - + else: breadcrumbs = [ { @@ -169,7 +169,7 @@ def plannedsession_comment_view(request,id=0,userid=0): 'comments':comments, 'form':form, }) - + # Cloning sessions @user_passes_test(hasplannedsessions,login_url="/rowers/paidplans/", message="This functionality requires a Coach or Self-Coach plan", @@ -180,10 +180,10 @@ def plannedsession_multiclone_view( r = getrequestplanrower(request,userid=userid) - + startdate,enddate = get_dates_timeperiod(request) teamid = get_team(request) - + if request.method == 'POST' and 'daterange' in request.POST: dateform = DateRangeForm(request.POST) if dateform.is_valid(): @@ -232,7 +232,7 @@ def plannedsession_multiclone_view( 'userid':r.user.id, }) - + url+='?when='+startdatestring+'/'+enddatestring return HttpResponseRedirect(url) @@ -256,7 +256,7 @@ def plannedsession_multiclone_view( team = None else: team = None - + query = request.GET.get('q') if query: query_list = query.split() @@ -296,8 +296,8 @@ def plannedsession_multiclone_view( 'startdate':startdate, 'enddate':enddate, }) - - if len(Team.objects.filter(manager=request.user))>=1: + + if Team.objects.filter(manager=request.user).count()>=1: teamform = RowerTeamForm(request.user) if teamid: teamform = RowerTeamForm(request.user,initial={'team':teamid}) @@ -320,7 +320,7 @@ def plannedsession_multiclone_view( 'teamform':teamform, } ) - + # Individual user creates training for himself @user_passes_test(hasplannedsessions,login_url="/rowers/paidplans/", message="This functionality requires a Coach or Self-Coach plan", @@ -332,9 +332,9 @@ def plannedsession_create_view(request, r = getrequestplanrower(request,userid=userid) - - - + + + startdate,enddate = get_dates_timeperiod(request,startdatestring=startdatestring, enddatestring=enddatestring) @@ -427,10 +427,10 @@ def plannedsession_create_view(request, enddate = enddate.date() except AttributeError: pass - + if preferreddate > enddate: preferreddate = enddate - + forminitial = { 'startdate':startdate, 'enddate':enddate, @@ -447,7 +447,7 @@ def plannedsession_create_view(request, sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True) - + try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, @@ -462,7 +462,7 @@ def plannedsession_create_view(request, 'startdate':startdate, 'enddate':enddate, }) - + return render(request,'plannedsessioncreate.html', { 'teams':get_my_teams(request.user), @@ -486,7 +486,7 @@ def plannedsession_multicreate_view(request, r = getrequestplanrower(request,userid=userid) - + startdate,enddate = get_dates_timeperiod(request) teamid = get_team(request) try: @@ -506,7 +506,7 @@ def plannedsession_multicreate_view(request, enddate__gte=startdate, ).order_by("startdate","preferreddate","enddate").exclude( sessiontype='race') - + if teamid: qset = qset.filter(team__in=[teamid]) try: @@ -527,8 +527,8 @@ def plannedsession_multicreate_view(request, 'name': 'NEW SESSION' } - - + + initials = [initial for i in range(extrasessions)] PlannedSessionFormSet = modelformset_factory( @@ -565,7 +565,7 @@ def plannedsession_multicreate_view(request, if team: url += '&team={teamid}'.format(teamid=team.id) - + return HttpResponseRedirect(url) ps_formset = PlannedSessionFormSet(queryset = qset, @@ -587,7 +587,7 @@ def plannedsession_multicreate_view(request, 'enddate':enddate }) - if len(Team.objects.filter(manager=request.user))>=1: + if Team.objects.filter(manager=request.user).count()>=1: teamform = RowerTeamForm(request.user) if teamid: teamform = RowerTeamForm(request.user,initial={'team':teamid}) @@ -620,10 +620,10 @@ def plannedsession_teamcreate_view(request, therower = getrequestplanrower(request,userid=userid) - - + + teams = Team.objects.filter(manager=request.user) - if len(teams)>0: + if teams.count()>0: teamchoices = [(team.id, team.name) for team in teams] teaminitial = [str(teams[0].id)] else: @@ -644,7 +644,7 @@ def plannedsession_teamcreate_view(request, ids = [ps.id for ps in sps] sps = PlannedSession.objects.filter(id__in=ids).order_by( "preferreddate","startdate","enddate") - + sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True) if request.method == 'POST': @@ -696,13 +696,13 @@ def plannedsession_teamcreate_view(request, rs = Rower.objects.filter(team__in=[team]).exclude(rowerplan='freecoach') for r in rs: add_rower_session(r,ps) - - + + url = reverse(plannedsession_teamcreate_view) startdatestring = startdate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d') url += '?when='+startdatestring+'/'+enddatestring - + return HttpResponseRedirect(url) else: timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') @@ -716,7 +716,7 @@ def plannedsession_teamcreate_view(request, 'name': 'Add Team Session' } ] - + return render(request,'plannedsessionteamcreate.html', { 'teams':get_my_teams(request.user), @@ -730,7 +730,7 @@ def plannedsession_teamcreate_view(request, 'rower':therower, 'active':'nav-plan' }) - + else: initial = { 'startdate':startdate, @@ -746,7 +746,7 @@ def plannedsession_teamcreate_view(request, } else: initialteam = {} - + sessioncreateform = PlannedSessionForm(initial=initial) sessionteamselectform = PlannedSessionTeamForm( request.user,initial=initialteam @@ -768,7 +768,7 @@ def plannedsession_teamcreate_view(request, 'startdate':startdate, 'enddate':enddate, }) - + return render(request,'plannedsessionteamcreate.html', { 'teams':get_my_teams(request.user), @@ -793,14 +793,14 @@ def plannedsession_teamedit_view(request, r = getrequestplanrower(request,userid=userid) - + try: ps = PlannedSession.objects.get(id=sessionid) except PlannedSession.DoesNotExist: raise Http404("This session doesn't exist") if not ps.manager == request.user: raise PermissionDenied("You are not the manager of this session") - + teams = Team.objects.filter(manager=request.user) teamchoices = [(team.id, team.name) for team in teams] @@ -830,7 +830,7 @@ def plannedsession_teamedit_view(request, ids = [pps.id for pps in sps] sps = PlannedSession.objects.filter(id__in=ids).order_by( "preferreddate","startdate","enddate") - + if request.method == 'POST': sessioncreateform = PlannedSessionForm(request.POST,instance=ps) sessionteamselectform = PlannedSessionTeamForm( @@ -838,7 +838,7 @@ def plannedsession_teamedit_view(request, ) sessionrowerform = PlannedSessionTeamMemberForm(ps,request.POST) - + if sessioncreateform.is_valid(): cd = sessioncreateform.cleaned_data @@ -846,17 +846,17 @@ def plannedsession_teamedit_view(request, cd['sessionmode'] = 'time' elif cd['sessionunit'] in ['km','m']: cd['sessionmode'] = 'distance' - + res,message = update_plannedsession(ps,cd) - + if res: messages.info(request,message) else: messages.error(request,message) - # some logic when to add all selected rowers + # some logic when to add all selected rowers if sessionteamselectform.is_valid(): cd = sessionteamselectform.cleaned_data selectedteams = cd['team'] @@ -872,8 +872,8 @@ def plannedsession_teamedit_view(request, selectedteams = [] for team in teams: remove_team_session(team,ps) - - + + if sessionrowerform.is_valid(): cd = sessionrowerform.cleaned_data selectedrowers = cd['members'] @@ -885,8 +885,8 @@ def plannedsession_teamedit_view(request, for t in selectedteams: if t in r.team.all(): add_rower_session(r,ps) - - + + url = reverse(plannedsession_teamedit_view, kwargs = { 'sessionid':sessionid, @@ -895,8 +895,8 @@ def plannedsession_teamedit_view(request, startdatestring = startdate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d') url += '?when='+startdatestring+'/'+enddatestring - - + + return HttpResponseRedirect(url) else: sessioncreateform = PlannedSessionForm(instance=ps) @@ -908,7 +908,7 @@ def plannedsession_teamedit_view(request, ps ) - + sessionrowerform.fields['members'].initial = ps.rower.all() timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') @@ -927,7 +927,7 @@ def plannedsession_teamedit_view(request, 'startdate':startdate, 'enddate':enddate, }) - + return render(request,'plannedsessionteamedit.html', { 'plannedsession':ps, @@ -953,7 +953,7 @@ def plannedsessions_coach_view(request, therower = getrequestplanrower(request,userid=userid) - + startdate,enddate = get_dates_timeperiod(request) @@ -979,7 +979,7 @@ def plannedsessions_coach_view(request, rowers = [therower] else: rowers = [] - + for ps in sps: if 'coach' in request.user.rower.rowerplan: rowers += ps.rower.all().exclude(rowerplan='freecoach') @@ -989,7 +989,7 @@ def plannedsessions_coach_view(request, rowers = list(set(rowers)) statusdict = [] - + for ps in sps: rowerstatus = {} rowercolor = {} @@ -1014,10 +1014,10 @@ def plannedsessions_coach_view(request, user=r, plannedsession=None, date__gte=startdate,date__lte=enddate) - - + + myteams = Team.objects.filter(manager=request.user) - + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') breadcrumbs = [ { @@ -1074,7 +1074,7 @@ def plannedsessions_view(request, pass - + startdate,enddate = get_dates_timeperiod( request, startdatestring=startdatestring, @@ -1088,7 +1088,7 @@ def plannedsessions_view(request, except IndexError: trainingplan = None - + sps = get_sessions(r,startdate=startdate,enddate=enddate) completeness = {} @@ -1139,7 +1139,7 @@ def plannedsessions_view(request, if not sps and request.user.rower.rowerplan == 'basic': messages.error(request, "You must purchase Coach or Self-coach plans or be part of a team to get planned sessions") - + for ps in sps: ratio,status,cdate = is_session_complete(r,ps) actualvalue[ps.id] = int(ps.sessionvalue*ratio) @@ -1159,12 +1159,12 @@ def plannedsessions_view(request, totals['time'] = int(totals['time']/60.) totals['actualtime'] = int(totals['actualtime']/60.) totals['plannedtime'] = int(totals['plannedtime']) - + unmatchedworkouts = Workout.objects.filter( user=r, plannedsession=None, date__gte=startdate,date__lte=enddate) - + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') breadcrumbs = [ { @@ -1177,10 +1177,10 @@ def plannedsessions_view(request, 'startdate':startdate, 'enddate':enddate, } - + dateform = DateRangeForm(initial=initial) - + return render(request,'plannedsessions.html', { 'teams':get_my_teams(request.user), @@ -1204,10 +1204,10 @@ def plannedsessions_print_view(request,userid=0): r = getrequestplanrower(request,userid=userid) - - + + startdate,enddate = get_dates_timeperiod(request) - + try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, @@ -1221,7 +1221,7 @@ def plannedsessions_print_view(request,userid=0): completeness = {} actualvalue = {} completiondate = {} - + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') return render(request,'plannedsessions_print.html', { @@ -1244,12 +1244,12 @@ def plannedsessions_manage_view(request,userid=0, if request.is_ajax(): is_ajax = True - + r = getrequestrower(request,userid=userid) startdate,enddate = get_dates_timeperiod(request) - + try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, @@ -1280,7 +1280,7 @@ def plannedsessions_manage_view(request,userid=0, "date","startdatetime","id" ) - + initialworkouts = [w.id for w in Workout.objects.filter(user=r,plannedsession=ps0)] linkedworkouts = [] @@ -1300,7 +1300,7 @@ def plannedsessions_manage_view(request,userid=0, workoutdata['initial'] = [] choices = [] - + for w in ws: wtpl = (w.id, w.__str__()) choices.append(wtpl) @@ -1320,7 +1320,7 @@ def plannedsessions_manage_view(request,userid=0, else: selectedworkouts = [] - if len(selectedworkouts)==0: + if selectedworkouts.count()==0: for w in ws: remove_workout_plannedsession(w,ps) @@ -1329,7 +1329,7 @@ def plannedsessions_manage_view(request,userid=0, for w in ws: if w.id not in selectedworkouts: remove_workout_plannedsession(w,ps) - + result,comments,errors = add_workouts_plannedsession(workouts,ps,r) for c in comments: messages.info(request,c) @@ -1348,13 +1348,13 @@ def plannedsessions_manage_view(request,userid=0, ininitial = id in initialworkouts inlinked = id in linkedworkouts ajax_workouts.append((id,name,ininitial,inlinked)) - + ajax_response = { 'workouts':ajax_workouts, 'plannedsessionstuple':plannedsessionstuple, } - + return JSONResponse(ajax_response) @@ -1374,14 +1374,14 @@ def plannedsessions_manage_view(request,userid=0, 'name': 'Link Sessions to Workouts' }, ] - + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') dateform = DateRangeForm(initial={ 'startdate':startdate, 'enddate':enddate, }) - + return render(request,'plannedsessionsmanage.html', { 'teams':get_my_teams(request.user), @@ -1396,7 +1396,7 @@ def plannedsessions_manage_view(request,userid=0, 'ps_form':ps_form, 'w_form':w_form, }) - + # Clone an existing planned session # need clarity on cloning behavior time shift @@ -1407,7 +1407,7 @@ def plannedsession_clone_view(request,id=0,userid=0): r = getrequestplanrower(request,userid=userid) - + startdate,enddate = get_dates_timeperiod(request) try: @@ -1422,13 +1422,13 @@ def plannedsession_clone_view(request,id=0,userid=0): ps = PlannedSession.objects.get(id=id) except PlannedSession.DoesNotExist: raise Http404("Planned Session does not exist") - + if ps.manager != request.user: raise PermissionDenied("You are not allowed to clone this planned session") rowers = ps.rower.all() teams = ps.team.all() - + ps.pk = None ps.id = None if not ps.is_template: @@ -1436,12 +1436,12 @@ def plannedsession_clone_view(request,id=0,userid=0): ps.is_template = False deltadays = ps.preferreddate-ps.startdate - + ps.startdate = startdate ps.enddate = enddate ps.preferreddate = ps.startdate+deltadays - + ps.save() if rowers: @@ -1476,7 +1476,7 @@ def plannedsession_teamclone_view(request,id=0): r = getrequestplanrower(request) teams = Team.objects.filter(manager=request.user) - if len(teams)>0: + if teams.count()>0: teamchoices = [(team.id, team.name) for team in teams] teaminitial = [str(teams[0].id)] else: @@ -1484,7 +1484,7 @@ def plannedsession_teamclone_view(request,id=0): url = reverse('rower_teams_view') return HttpResponseRedirect(url) - + startdate,enddate = get_dates_timeperiod(request) try: @@ -1499,11 +1499,11 @@ def plannedsession_teamclone_view(request,id=0): ps = PlannedSession.objects.get(id=id) except PlannedSession.DoesNotExist: raise Http404("Planned Session does not exist") - + if ps.manager != request.user: raise PermissionDenied("You are not allowed to clone this planned session") - + ps.pk = None ps.id = None if not ps.is_template: @@ -1511,7 +1511,7 @@ def plannedsession_teamclone_view(request,id=0): ps.is_template = False deltadays = ps.enddate-ps.startdate - + ps.startdate = timezone.now().date() ps.enddate = (timezone.now()+deltadays).date() ps.preferreddate = ps.preferreddate+deltadays @@ -1557,7 +1557,7 @@ def plannedsession_totemplate_view(request,id=0): ps.save() url = reverse(plannedsession_create_view,kwargs={'userid':request.user.id}) - + startdatestring = startdate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d') url += '?when='+startdatestring+'/'+enddatestring @@ -1572,7 +1572,7 @@ def plannedsession_edit_view(request,id=0,userid=0): r = getrequestplanrower(request,userid=userid) - + startdate,enddate = get_dates_timeperiod(request) @@ -1589,14 +1589,14 @@ def plannedsession_edit_view(request,id=0,userid=0): ps = PlannedSession.objects.get(id=id) except PlannedSession.DoesNotExist: raise Http404("Planned Session does not exist") - + if ps.manager != request.user: raise PermissionDenied("You are not allowed to edit this planned session") if ps.sessiontype in ['race','indoorrace']: raise PermissionDenied("You are not allowed to edit this planned session because it is a race") - - if ps.team.all() or len(ps.rower.all())>1: + + if ps.team.all() or ps.rower.all().count()>1: url = reverse(plannedsession_teamedit_view, kwargs={ 'sessionid':id, @@ -1612,9 +1612,9 @@ def plannedsession_edit_view(request,id=0,userid=0): cd['sessionmode'] = 'time' elif cd['sessionunit'] in ['km','m']: cd['sessionmode'] = 'distance' - - + + res,message = update_plannedsession(ps,cd) if res: @@ -1631,7 +1631,7 @@ def plannedsession_edit_view(request,id=0,userid=0): startdatestring = startdate.strftime('%Y-%m-%d') enddatestring = enddate.strftime('%Y-%m-%d') url += '?when='+startdatestring+'/'+enddatestring - + return HttpResponseRedirect(url) else: sessioncreateform = PlannedSessionForm(instance=ps) @@ -1671,14 +1671,14 @@ def plannedsession_edit_view(request,id=0,userid=0): sessiontemplates = PlannedSession.objects.filter(manager=request.user,is_template=True) - + dateform = DateRangeForm(initial={ 'startdate':startdate, 'enddate':enddate, }) - timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') - + timeperiod = startdate.strftime('%Y-%m-%d')+'/'+enddate.strftime('%Y-%m-%d') + return render(request,'plannedsessionedit.html', { 'teams':get_my_teams(request.user), @@ -1721,7 +1721,7 @@ def plannedsession_view(request,id=0,userid=0): r = getrequestplanrower(request,userid=userid) - + try: ps = PlannedSession.objects.get(id=id) @@ -1742,7 +1742,7 @@ def plannedsession_view(request,id=0,userid=0): m = ps.manager mm = Rower.objects.get(user=m) - + if ps.manager != request.user: if 'coach' in r.rowerplan and r not in ps.rower.all(): teams = Team.objects.filter(manager=request.user) @@ -1755,13 +1755,13 @@ def plannedsession_view(request,id=0,userid=0): resultsdict = get_session_metrics(ps) resultsdict = pd.DataFrame(resultsdict).transpose().to_dict() - + psdict = my_dict_from_instance(ps,PlannedSession) ws = get_workouts_session(r,ps) ratio,status,completiondate = is_session_complete(r,ps) - + ratio = int(100.*ratio) # ranking for test @@ -1791,7 +1791,7 @@ def plannedsession_view(request,id=0,userid=0): if ps.sessiontype == 'coursetest': vs = CourseTestResult.objects.filter(plannedsession=ps, workoutid=w.id) - + if vs: for record in vs: if record.workoutid == w.id: @@ -1818,7 +1818,7 @@ def plannedsession_view(request,id=0,userid=0): job = myqueue(queue,handle_check_race_course, w.csvfilename,w.id,ps.course.id, record.id,mode='coursetest') - + intsecs = 0 microsecs = 0 @@ -1827,7 +1827,7 @@ def plannedsession_view(request,id=0,userid=0): wdict['distance'] = ps.course.distance wdict['coursecompleted'] = False - + ranking.append(wdict) if ps.sessiontype == 'coursetest': ranking = sorted(ranking, key=lambda k: k['time']) @@ -1956,7 +1956,7 @@ class PlannedSessionDelete(DeleteView): w.save() url = reverse(plannedsessions_view) - + return url def get_object(self, *args, **kwargs): @@ -2003,7 +2003,7 @@ def rower_create_trainingplan(request,userid=0): elif request.method == 'POST' and 'startdate' in request.POST: form = TrainingPlanForm(request.POST,user=request.user) - + if form.is_valid(): name = form.cleaned_data['name'] try: @@ -2025,7 +2025,7 @@ def rower_create_trainingplan(request,userid=0): athletes = form.cleaned_data['rowers'] except KeyError: athletes = [therower] - + p = TrainingPlan( name=name, target=target, @@ -2039,7 +2039,7 @@ def rower_create_trainingplan(request,userid=0): for athlete in athletes: p.rowers.add(athlete) - + targets = TrainingTarget.objects.filter( rowers=therower, date__gte=datetime.date.today(), @@ -2049,9 +2049,9 @@ def rower_create_trainingplan(request,userid=0): rowers=therower, date__lt=datetime.date.today(), ).order_by("-date") - + targetform = TrainingTargetForm(user=request.user) - + plans = TrainingPlan.objects.filter(rowers=therower).order_by("-startdate") plans_to_deactivate = TrainingPlan.objects.filter( @@ -2064,7 +2064,7 @@ def rower_create_trainingplan(request,userid=0): p.status = False p.save() - + form = TrainingPlanForm(targets=targets, initial={'status':False,'rowers':[therower]}, user=request.user) @@ -2081,8 +2081,8 @@ def rower_create_trainingplan(request,userid=0): 'name': 'Manage Plans and Targets' } ] - - + + return render(request,'trainingplan_create.html', { 'form':form, @@ -2103,7 +2103,7 @@ def rower_delete_trainingtarget(request,id=0): target = TrainingTarget.objects.get(id=id) except TrainingPlan.DoesNotExist: raise Http404("Training Plan Does Not Exist") - + if checkaccessuser(request.user,target.manager): target.delete() messages.info(request,"We have deleted the training target") @@ -2113,7 +2113,7 @@ def rower_delete_trainingtarget(request,id=0): url = reverse(rower_create_trainingplan) return HttpResponseRedirect(url) - + @user_passes_test(hasplannedsessions,login_url="/rowers/paidplans", message="This functionality requires a Coach or Self-Coach plan", @@ -2123,7 +2123,7 @@ def rower_delete_trainingplan(request,id=0): plan = TrainingPlan.objects.get(id=id) except TrainingPlan.DoesNotExist: raise Http404("Training Plan Does Not Exist") - + if checkaccessuser(request.user,plan.manager): plan.delete() messages.info(request,"We have deleted the training plan") @@ -2158,7 +2158,7 @@ class MicroCycleDelete(DeleteView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2186,7 +2186,7 @@ class MicroCycleDelete(DeleteView): kwargs={'pk':self.object.pk}), 'name': self.object.name } - + ] context['active'] = 'nav-plan' @@ -2204,7 +2204,7 @@ class MicroCycleDelete(DeleteView): 'id':plan.id, 'thismesoid':thismesoid }) - + def get_object(self, *args, **kwargs): obj = super(MicroCycleDelete, self).get_object(*args, **kwargs) if not checkaccessuser(self.request.user,obj.plan.plan.plan.manager): @@ -2224,7 +2224,7 @@ class MesoCycleDelete(DeleteView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2247,7 +2247,7 @@ class MesoCycleDelete(DeleteView): kwargs={'pk':self.object.pk}), 'name': self.object.name } - + ] context['active'] = 'nav-plan' @@ -2265,7 +2265,7 @@ class MesoCycleDelete(DeleteView): 'id':plan.id, 'thismacroid':thismacroid, }) - + def get_object(self, *args, **kwargs): obj = super(MesoCycleDelete, self).get_object(*args, **kwargs) @@ -2287,7 +2287,7 @@ class MacroCycleDelete(DeleteView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2320,7 +2320,7 @@ class MacroCycleDelete(DeleteView): kwargs = { 'id':plan.id }) - + def get_object(self, *args, **kwargs): obj = super(MacroCycleDelete, self).get_object(*args, **kwargs) if not checkaccessuser(self.request.user,obj.plan.manager): @@ -2337,10 +2337,10 @@ def rower_trainingplan_execution_view(request, userid=0): startdate,enddate = get_dates_timeperiod(request) - + r = getrequestrower(request,userid=userid) - + if int(id)>0: try: plan = TrainingPlan.objects.get(id=id) @@ -2417,8 +2417,8 @@ def rower_trainingplan_execution_view(request, 'the_div':div } ) - - + + @user_passes_test(hasplannedsessions,login_url="/rowers/paidplans", message="This functionality requires a Coach or Self-Coach plan", redirect_field_name=None) @@ -2432,14 +2432,14 @@ def rower_trainingplan_view(request, startdate,enddate = get_dates_timeperiod(request) - + try: plan = TrainingPlan.objects.get(id=id) except TrainingPlan.DoesNotExist: raise Http404("Training Plan Does Not Exist") r = getrequestrower(request,userid=userid) - + if not checkaccessuser(request.user,plan.manager): if request.user.rower not in plan.rowers.all(): raise PermissionDenied("Access denied") @@ -2493,7 +2493,7 @@ def rower_trainingplan_view(request, except AttributeError: thismicroid = None - + return render(request,'trainingplan.html', { 'plan':plan, @@ -2507,7 +2507,7 @@ def rower_trainingplan_view(request, 'thismesoid':thismesoid, } ) - + class TrainingMacroCycleUpdate(UpdateView): model = TrainingMacroCycle template_name = 'trainingplan_edit.html' @@ -2521,7 +2521,7 @@ class TrainingMacroCycleUpdate(UpdateView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2546,7 +2546,7 @@ class TrainingMacroCycleUpdate(UpdateView): context['rower'] = getrequestrower(self.request,userid=userid) return context - + def get_success_url(self): plan = self.object.plan createmacrofillers(plan) @@ -2575,7 +2575,7 @@ class TrainingMacroCycleUpdate(UpdateView): obj.type = 'userdefined' obj.save() return obj - + class TrainingMesoCycleUpdate(UpdateView): model = TrainingMesoCycle template_name = 'trainingplan_edit.html' @@ -2589,7 +2589,7 @@ class TrainingMesoCycleUpdate(UpdateView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2612,7 +2612,7 @@ class TrainingMesoCycleUpdate(UpdateView): kwargs={'pk':self.object.pk}), 'name': self.object.name } - + ] context['active'] = 'nav-plan' @@ -2620,7 +2620,7 @@ class TrainingMesoCycleUpdate(UpdateView): context['rower'] = getrequestrower(self.request,userid=userid) return context - + def get_success_url(self): plan = self.object.plan createmesofillers(plan) @@ -2630,7 +2630,7 @@ class TrainingMesoCycleUpdate(UpdateView): 'thismesoid':self.object.id, } ) - + def form_valid(self, form): form.instance.user = self.request.user form.instance.post_date = datetime.datetime.now() @@ -2649,7 +2649,7 @@ class TrainingMesoCycleUpdate(UpdateView): obj.plan.type = 'userdefined' obj.plan.save() return obj - + class TrainingMicroCycleUpdate(UpdateView): model = TrainingMicroCycle template_name = 'trainingplan_edit.html' @@ -2663,7 +2663,7 @@ class TrainingMicroCycleUpdate(UpdateView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2691,7 +2691,7 @@ class TrainingMicroCycleUpdate(UpdateView): kwargs={'pk':self.object.pk}), 'name': self.object.name } - + ] context['active'] = 'nav-plan' @@ -2699,7 +2699,7 @@ class TrainingMicroCycleUpdate(UpdateView): context['rower'] = getrequestrower(self.request,userid=userid) return context - + def get_success_url(self): plan = self.object.plan createmicrofillers(plan) @@ -2713,7 +2713,7 @@ class TrainingMicroCycleUpdate(UpdateView): form.instance.user = self.request.user form.instance.post_date = datetime.datetime.now() microcycle = form.save() - + return super(TrainingMicroCycleUpdate, self).form_valid(form) def get_object(self, *args, **kwargs): @@ -2728,7 +2728,7 @@ class TrainingMicroCycleUpdate(UpdateView): obj.plan.type = 'userdefined' obj.plan.save() return obj - + class TrainingPlanUpdate(UpdateView): model = TrainingPlan template_name = 'trainingplan_edit.html' @@ -2742,7 +2742,7 @@ class TrainingPlanUpdate(UpdateView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2760,7 +2760,7 @@ class TrainingPlanUpdate(UpdateView): kwargs={'pk':self.object.pk}), 'name': 'Edit' } - + ] context['active'] = 'nav-plan' @@ -2787,7 +2787,7 @@ class TrainingPlanUpdate(UpdateView): raise PermissionDenied('You are not allowed to edit this training plan cycle') if obj.manager.rowerplan not in ['coach','freecoach','plan']: raise PermissionDenied('You are not allowed to edit this training plan') - + return obj class TrainingTargetUpdate(UpdateView): @@ -2803,7 +2803,7 @@ class TrainingTargetUpdate(UpdateView): userid = kwargs['userid'] else: userid=0 - + breadcrumbs = [ { 'url':reverse(plannedsessions_view, @@ -2815,7 +2815,7 @@ class TrainingTargetUpdate(UpdateView): kwargs={'pk':self.object.pk}), 'name': 'Edit' } - + ] context['active'] = 'nav-plan' @@ -2841,7 +2841,7 @@ class TrainingTargetUpdate(UpdateView): return obj from rowers.utils import allsundays - + @user_passes_test(hasplannedsessions,login_url="/rowers/paidplans", message="This functionality requires a Coach or Self-Coach plan", redirect_field_name=None) @@ -2860,7 +2860,7 @@ def planmesocyclebyweek(request,id=0,userid=0): cycle.type = 'userdefined' cycle.save() - + #we're still here. We have permission sundays = [s for s in allsundays(cycle.startdate,cycle.enddate)] @@ -2868,7 +2868,7 @@ def planmesocyclebyweek(request,id=0,userid=0): sundays = sundays+[cycle.enddate] elif not sundays: sundays = [cycle.enddate] - + for i in range(len(sundays)): if i==0: monday = cycle.startdate @@ -2878,7 +2878,7 @@ def planmesocyclebyweek(request,id=0,userid=0): monday = cycle.startdate nextsunday = sundays[i] - + micro = TrainingMicroCycle(startdate = monday, enddate = nextsunday, plan = cycle, @@ -2896,7 +2896,7 @@ def planmesocyclebyweek(request,id=0,userid=0): return HttpResponseRedirect(url) from rowers.utils import allmonths - + @user_passes_test(hasplannedsessions,login_url="/rowers/paidplans", message="This functionality requires a Coach or Self-Coach plan", redirect_field_name=None) @@ -2915,7 +2915,7 @@ def planmacrocyclebymonth(request,id=0,userid=0): cycle.type = 'userdefined' cycle.save() - + #we're still here. We have permission monthstarts = [d for d in allmonths(cycle.startdate,cycle.enddate)] monthstarts.append(cycle.enddate) @@ -2925,7 +2925,7 @@ def planmacrocyclebymonth(request,id=0,userid=0): if lastday < cycle.enddate and i == len(monthstarts)-2: lastday = cycle.enddate - + meso = TrainingMesoCycle(startdate = firstday, enddate = lastday, plan = cycle, @@ -2941,6 +2941,3 @@ def planmacrocyclebymonth(request,id=0,userid=0): 'thismesoid':str(mesos[0].id)}) return HttpResponseRedirect(url) - - -