From 7fb606842d3c1c77348a4ed76764ac8106a55b1a Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Sat, 15 Sep 2018 22:05:29 +0200 Subject: [PATCH] adding plan/actual in plan view --- rowers/models.py | 39 ++++++ rowers/plannedsessions.py | 5 +- rowers/templates/trainingplan.html | 199 +++++++++++++++++++++-------- rowers/views.py | 82 ++++++++++++ 4 files changed, 269 insertions(+), 56 deletions(-) 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 %}
{% endif %} -
-

{{ macrocycle.0.name }} ({{ macrocycle.0.startdate }} - {{ macrocycle.0.enddate }})

- {% if todays_date <= macrocycle.0.enddate|date:"Y-m-d" %} -

edit - / - delete - / - sessions -

- {% else %} -

 

- {% endif %} +
+ + + + + + + + + + + + + + + + + + + + + + + + + + {% if todays_date <= macrocycle.0.enddate|date:"Y-m-d" %} + + + + + + + {% endif %} +
+ {{ macrocycle.0.name }} ({{ macrocycle.0.startdate }} - {{ macrocycle.0.enddate }}) +
dist (m)t (min)rScoreTRIMP
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 +
@@ -59,55 +90,115 @@ {% if mesocycle.0.type == 'filler' %}
{% else %} -
+
+ {% endif %} +
+ + + + + {% if mesocycle.0.plan.type == 'userdefined' %} + + + + + + + + + + + + + + + + + + + + + + {% if todays_date <= mesocycle.0.enddate|date:"Y-m-d" %} + + + + + + + {% endif %} + {% endif %} +
+ {{ mesocycle.0.name }} ({{ mesocycle.0.startdate }} - {{ mesocycle.0.enddate }}) +
dist (m)t (min)rScoreTRIMP
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 +
+
+
+
+ {% for microcycle in mesocycle.1 %} + {% if microcycle.type == 'filler' %} +
+ {% else %} +
{% endif %}
-

{{ mesocycle.0.name }} ({{ mesocycle.0.startdate }} - {{ mesocycle.0.enddate }})

- {% if mesocycle.0.plan.type == 'userdefined' %} - {% if todays_date <= mesocycle.0.enddate|date:"Y-m-d" %} -

edit - / - delete - / - sessions - -

- {% endif %} - {% else %} -

 

- {% endif %} + + + + + {% if microcycle.plan.type == 'userdefined' %} + + + + + + + + + + + + + + + + + + + + + + {% if todays_date <= microcycle.enddate|date:"Y-m-d" %} + + + + + + + {% endif %} + {% endif %} +
+ {{ microcycle.name }} ({{ microcycle.startdate }} - {{ microcycle.enddate }}) +
dist (m)t (min)rScoreTRIMP
plan{{ microcycle.plandistance }}{{ microcycle.plantime }}{{ microcycle.planrscore }}{{ microcycle.plantrimp }}
actual{{ microcycle.actualdistance }}{{ microcycle.actualtime }}{{ microcycle.actualrscore }}{{ microcycle.actualtrimp }}
 
+ edit + / + delete + / + sessions +
-
- {% for microcycle in mesocycle.1 %} - {% if microcycle.type == 'filler' %} -
- {% else %} -
- {% endif %} -
-

{{ microcycle.name }} ({{ microcycle.startdate }} - {{ microcycle.enddate }})

- {% if microcycle.plan.type == 'userdefined' %} - {% if todays_date <= microcycle.enddate|date:"Y-m-d" %} -

- edit - / - delete - / - sessions -

- {% endif %} - {% else %} -

 

- {% endif %} -
-
- {% endfor %} + {% endfor %}
{% endfor %}
-
- {% endfor %} +
+ {% endfor %}

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):