diff --git a/rowers/models.py b/rowers/models.py index 4b4e5a73..cbc298ef 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1313,10 +1313,21 @@ class TrainingMacroCycle(models.Model): enddate = models.DateField( default=half_year_from_now) notes = models.TextField(max_length=300,blank=True) + type = models.CharField(default='filler', choices=cycletypechoices, max_length=150) + plantime = models.IntegerField(default=0,verbose_name='Planned Duration') + plandistance = models.IntegerField(default=0,verbose_name='Planned Distance') + planrscore = models.IntegerField(default=0,verbose_name='Planned rScore') + plantrimp = models.IntegerField(default=0,verbose_name='Planned TRIMP') + + actualtime = models.IntegerField(default=0,verbose_name='Actual Duration') + actualdistance = models.IntegerField(default=0,verbose_name='Actual Distance') + actualrscore = models.IntegerField(default=0,verbose_name='Actual rScore') + actualtrimp = models.IntegerField(default=0,verbose_name='Actual TRIMP') + def __unicode__(self): stri = 'Macro Cycle - {n} ({sd} - {ed})'.format( n = self.name, @@ -1391,6 +1402,18 @@ class TrainingMesoCycle(models.Model): type = models.CharField(default='filler', choices=cycletypechoices, max_length=150) + + plantime = models.IntegerField(default=0,verbose_name='Planned Duration') + plandistance = models.IntegerField(default=0,verbose_name='Planned Distance') + planrscore = models.IntegerField(default=0,verbose_name='Planned rScore') + plantrimp = models.IntegerField(default=0,verbose_name='Planned TRIMP') + + actualtime = models.IntegerField(default=0,verbose_name='Actual Duration') + actualdistance = models.IntegerField(default=0,verbose_name='Actual Distance') + actualrscore = models.IntegerField(default=0,verbose_name='Actual rScore') + actualtrimp = models.IntegerField(default=0,verbose_name='Actual TRIMP') + + def __unicode__(self): stri = 'Meso Cycle - {n} ({sd} - {ed})'.format( n = self.name, @@ -1454,6 +1477,20 @@ class TrainingMicroCycle(models.Model): type = models.CharField(default='filler', choices=cycletypechoices, max_length=150) + + plantime = models.IntegerField(default=0,verbose_name='Planned Duration') + plandistance = models.IntegerField(default=0,verbose_name='Planned Distance') + planrscore = models.IntegerField(default=0,verbose_name='Planned rScore') + plantrimp = models.IntegerField(default=0,verbose_name='Planned TRIMP') + + actualtime = models.IntegerField(default=0,verbose_name='Actual Duration') + actualdistance = models.IntegerField(default=0,verbose_name='Actual Distance') + actualrscore = models.IntegerField(default=0,verbose_name='Actual rScore') + actualtrimp = models.IntegerField(default=0,verbose_name='Actual TRIMP') + + + + def __unicode__(self): stri = 'Micro Cycle - {n} ({sd} - {ed})'.format( n = self.name, @@ -1491,6 +1528,8 @@ class TrainingMicroCycle(models.Model): if othercycle.enddate >= self.startdate and othercycle.enddate <= self.enddate: self.startdate = othercycle.enddate+datetime.timedelta(days=1) + + if not self.enddate <= self.startdate: super(TrainingMicroCycle,self).save(*args, **kwargs) diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index d9534de4..46b7f326 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -306,10 +306,10 @@ def is_session_complete_ws(ws,ps): for record in vs: if record.workoutid in wids: if record.coursecompleted: - ratio = record.distance/ps.sessionvalue + ratio = record.distance/float(ps.sessionvalue) return ratio,'completed',completiondate else: - ratio = record.distance/ps.sessionvalue + ratio = record.distance/float(ps.sessionvalue) return ratio,'partial',completiondate # we're still here - no record, need to create one @@ -338,6 +338,7 @@ def is_session_complete_ws(ws,ps): def is_session_complete(r,ps): status = 'not done' + if r not in ps.rower.all(): return 0,'not assigned',None diff --git a/rowers/templates/trainingplan.html b/rowers/templates/trainingplan.html index d7a9f850..e3d67466 100644 --- a/rowers/templates/trainingplan.html +++ b/rowers/templates/trainingplan.html @@ -40,18 +40,49 @@ {% else %}
edit - / - delete - / - sessions -
- {% else %} -- {% endif %} +
| + {{ macrocycle.0.name }} ({{ macrocycle.0.startdate }} - {{ macrocycle.0.enddate }}) + | +||||
|---|---|---|---|---|
| + | dist (m) | +t (min) | +rScore | +TRIMP | +
| plan | +{{ macrocycle.0.plandistance }} | +{{ macrocycle.0.plantime }} | +{{ maccrocycle.0.planrscore }} | +{{ macrocycle.0.plantrimp }} | +
| actual | +{{ macrocycle.0.actualdistance }} | +{{ macrocycle.0.actualtime }} | +{{ macrocycle.0.actualrscore }} | +{{ macrocycle.0.actualtrimp }} | +
| + | ||||
| + edit + / + delete + / + sessions + | +||||
| + {{ mesocycle.0.name }} ({{ mesocycle.0.startdate }} - {{ mesocycle.0.enddate }}) + | +||||
|---|---|---|---|---|
| + | dist (m) | +t (min) | +rScore | +TRIMP | +
| plan | +{{ mesocycle.0.plandistance }} | +{{ mesocycle.0.plantime }} | +{{ mesocycle.0.planrscore }} | +{{ mesocycle.0.plantrimp }} | +
| actual | +{{ mesocycle.0.actualdistance }} | +{{ mesocycle.0.actualtime }} | +{{ mesocycle.0.actualrscore }} | +{{ mesocycle.0.actualtrimp }} | +
| + | ||||
| + edit + / + delete + / + sessions + | +||||
edit - / - delete - / - sessions - -
- {% endif %} - {% else %} -- {% endif %} +
| + {{ microcycle.name }} ({{ microcycle.startdate }} - {{ microcycle.enddate }}) + | +||||
|---|---|---|---|---|
| + | dist (m) | +t (min) | +rScore | +TRIMP | +
| plan | +{{ microcycle.plandistance }} | +{{ microcycle.plantime }} | +{{ microcycle.planrscore }} | +{{ microcycle.plantrimp }} | +
| actual | +{{ microcycle.actualdistance }} | +{{ microcycle.actualtime }} | +{{ microcycle.actualrscore }} | +{{ microcycle.actualtrimp }} | +
| + | ||||
| + edit + / + delete + / + sessions + | +||||
Click on the plan cycles to edit their names, start and end dates. The gray "filler" diff --git a/rowers/views.py b/rowers/views.py index d53ff3c6..df481220 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -14499,17 +14499,98 @@ def rower_trainingplan_view(request,id=0): count = 0 cycles = {} + r = plan.rower for m in macrocycles: createmesofillers(m) + m.plantime = 0 + m.actualtime = 0 + m.plandistance = 0 + m.actualdistance = 0 + m.planrscore = 0 + m.actualrscore = 0 + m.plantrimp = 0 + m.actualtrimp = 0 + + mesocycles = TrainingMesoCycle.objects.filter(plan=m).order_by("startdate") mesos = {} count2 = 0 for me in mesocycles: createmicrofillers(me) + me.plantime = 0 + me.actualtime = 0 + me.plandistance = 0 + me.actualdistance = 0 + me.planrscore = 0 + me.actualrscore = 0 + me.plantrimp = 0 + me.actualtrimp = 0 + microcycles = TrainingMicroCycle.objects.filter(plan=me).order_by("startdate") + + for mm in microcycles: + sps = PlannedSession.objects.filter( + rower = plan.rower, + startdate__lte=mm.enddate, + enddate__gte=mm.startdate) + + + mm.plantime = 0 + mm.actualtime = 0 + mm.plandistance = 0 + mm.actualdistance = 0 + mm.planrscore = 0 + mm.actualrscore = 0 + mm.plantrimp = 0 + mm.actualtrimp = 0 + + + if mm.type == 'userdefined': + for ps in sps: + ratio, status, cdate = is_session_complete(r,ps) + if ps.sessionmode == 'time': + mm.plantime += ps.sessionvalue + mm.actualtime += ps.sessionvalue*ratio + elif ps.sessionmode == 'distance': + mm.plandistance += ps.sessionvalue + mm.actualdistance += ps.sessionvalue*ratio + elif ps.sessionmode == 'rScore': + mm.planrscore += ps.sessionvalue + mm.actualrscore += ps.sessionvalue*ratio + elif ps.sessionmode == 'TRIMP': + mm.plantrimp += ps.sessionvalue + mm.actualtrimp += ps.sessionvalue*ratio + + mm.save() + + me.plantime += mm.plantime + me.actualtime += mm.actualtime + me.plandistance += mm.plandistance + me.actualdistance += mm.actualdistance + me.planrscore += mm.planrscore + me.actualrscore += mm.actualrscore + me.plantrimp += mm.plantrimp + me.actualtrimp += mm.actualtrimp + + if me.type == 'userdefined': + me.save() + + m.plantime += me.plantime + m.actualtime += me.actualtime + m.plandistance += me.plandistance + m.actualdistance += me.actualdistance + m.planrscore += me.planrscore + m.actualrscore += me.actualrscore + m.plantrimp += me.plantrimp + m.actualtrimp += me.actualtrimp + + mesos[count2] = (me, microcycles) count2 += 1 + + if m.type == 'userdefined': + m.save() cycles[count] = (m,mesos) count += 1 @@ -14604,6 +14685,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):