diff --git a/rowers/models.py b/rowers/models.py index 1d74caf9..c33b46d8 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1073,6 +1073,7 @@ def createmacrofillers(plan): if not cycles: macr = TrainingMacroCycle( + plan=plan, startdate = plan.startdate, enddate = plan.enddate, type='filler', @@ -1095,6 +1096,131 @@ def createmacrofillers(plan): cycles = cycles[1:] +def createmesofillers(plan): + fillers = TrainingMesoCycle.objects.filter( + plan = plan, type = 'filler' + ) + + for f in fillers: + f.delete() + + cycles = TrainingMesoCycle.objects.filter( + plan = plan + ).order_by("-startdate") + + if not cycles: + macr = TrainingMesoCycle( + plan = plan, + startdate = plan.startdate, + enddate = plan.enddate, + type='filler', + name='Filler' + ) + macr.save() + + thedate = plan.enddate + while cycles: + if cycles[0].enddate < thedate: + macr = TrainingMesoCycle( + plan=plan, + startdate = cycles[0].enddate+datetime.timedelta(days=1), + enddate = thedate, + type='filler', + name='Filler' + ) + macr.save() + thedate = cycles[0].startdate-datetime.timedelta(days=1) + cycles = cycles[1:] + + +def createmicrofillers(plan): + fillers = TrainingMicroCycle.objects.filter( + plan = plan, type = 'filler' + ) + + for f in fillers: + f.delete() + + cycles = TrainingMicroCycle.objects.filter( + plan = plan + ).order_by("-startdate") + + if not cycles: + macr = TrainingMicroCycle( + plan=plan, + startdate = plan.startdate, + enddate = plan.enddate, + type='filler', + name='Filler' + ) + macr.save() + + thedate = plan.enddate + while cycles: + if cycles[0].enddate < thedate: + macr = TrainingMicroCycle( + plan=plan, + startdate = cycles[0].enddate+datetime.timedelta(days=1), + enddate = thedate, + type='filler', + name='Filler' + ) + macr.save() + thedate = cycles[0].startdate-datetime.timedelta(days=1) + cycles = cycles[1:] + +def microcyclecheckdates(plan): + cycles = TrainingMicroCycle.objects.filter( + plan=plan + ).order_by("-startdate") + + thedate = plan.enddate + while cycles: + if cycles[0].enddate < plan.startdate: + cycles[0].delete() + if cycles[0].startdate > plan.enddate: + cycles[0].delete() + if cycles[0].enddate > thedate: + cycles[0].enddate = thedate + cycles[0].save() + thedate = cycles[0].startdate-datetime.timedelta(days=1) + cycles = cycles[1:] + +def mesocyclecheckdates(plan): + cycles = TrainingMesoCycle.objects.filter( + plan=plan + ).order_by("-startdate") + + thedate = plan.enddate + while cycles: + if cycles[0].enddate < plan.startdate: + cycles[0].delete() + if cycles[0].startdate > plan.enddate: + cycles[0].delete() + if cycles[0].enddate > thedate: + cycles[0].enddate = thedate + cycles[0].save() + thedate = cycles[0].startdate-datetime.timedelta(days=1) + cycles = cycles[1:] + +def macrocyclecheckdates(plan): + cycles = TrainingMacroCycle.objects.filter( + plan=plan + ).order_by("-startdate") + + thedate = plan.enddate + while cycles: + if cycles[0].enddate < plan.startdate: + cycles[0].delete() + if cycles[0].startdate > plan.enddate: + cycles[0].delete() + if cycles[0].enddate > thedate: + cycles[0].enddate = thedate + cycles[0].save() + thedate = cycles[0].startdate-datetime.timedelta(days=1) + cycles = cycles[1:] + + class TrainingMacroCycle(models.Model): plan = models.ForeignKey(TrainingPlan) name = models.CharField(max_length=150,blank=True) @@ -1127,6 +1253,12 @@ class TrainingMacroCycle(models.Model): for f in fillers: f.delete() + if self.enddate > self.plan.enddate: + self.enddate = self.plan.enddate + + if self.startdate < self.plan.startdate: + self.startdate = self.plan.startdate + othercycles = TrainingMacroCycle.objects.filter( plan=self.plan).exclude(pk=self.pk).order_by("-startdate") @@ -1151,11 +1283,13 @@ class TrainingMacroCycle(models.Model): ) meso.save() + else: + createmesofillers(self) class TrainingMacroCycleForm(ModelForm): class Meta: model = TrainingMacroCycle - fields = ['name','startdate','enddate'] + fields = ['name','startdate','enddate','notes'] widgets = { 'startdate': AdminDateWidget(), @@ -1181,6 +1315,49 @@ class TrainingMesoCycle(models.Model): return stri + def save(self, *args, **kwargs): + if self.enddate < self.startdate: + startdate = self.startdate + enddate = self.enddate + self.startdate = enddate + self.enddate = startdate + + fillers = TrainingMesoCycle.objects.filter( + plan=self.plan,type='filler') + for f in fillers: + f.delete() + + if self.enddate > self.plan.enddate: + self.enddate = self.plan.enddate + + if self.startdate < self.plan.startdate: + self.startdate = self.plan.startdate + + othercycles = TrainingMesoCycle.objects.filter( + plan=self.plan).exclude(pk=self.pk).order_by("-startdate") + + for othercycle in othercycles: + if othercycle.startdate <= self.enddate and othercycle.startdate >= self.startdate: + self.enddate = othercycle.startdate-datetime.timedelta(days=1) + + 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(TrainingMesoCycle,self).save(*args, **kwargs) + + microcycles = TrainingMicroCycle.objects.filter(plan = self) + if not microcycles: + micro = TrainingMicroCycle( + plan = self, + name = 'Filler', + startdate = self.startdate, + enddate = self.enddate, + ) + + micro.save() + else: + createmicrofillers(self) class TrainingMicroCycle(models.Model): plan = models.ForeignKey(TrainingMesoCycle) @@ -1201,15 +1378,57 @@ class TrainingMicroCycle(models.Model): return stri + def save(self, *args, **kwargs): + if self.enddate < self.startdate: + startdate = self.startdate + enddate = self.enddate + self.startdate = enddate + self.enddate = startdate -# Needs some error checking -# - Microcycles should not overlap with other microcycles, same for MesoCycles, MacroCycles -# - When a TrainingPlan is created, it should create 1 "collector" Macro, Meso & MicroCycle - this is invisible for users who choose to not use cycles -# - When a new Microcycle is inserted, the "collector" cycle is automatically adjusted to "go out of the way" of the new MicroCycle - and similar for Macro & Meso -# - If the entire MesoCycle is filled with user defined MicroCycles - there are no "filler" MicroCycles -# - Sessions are automatically linked to the correct Cycles based on their start/end date - no need for a hard link + fillers = TrainingMicroCycle.objects.filter( + plan=self.plan,type='filler') + for f in fillers: + f.delete() + + if self.enddate > self.plan.enddate: + self.enddate = self.plan.enddate + + if self.startdate < self.plan.startdate: + self.startdate = self.plan.startdate + + othercycles = TrainingMicroCycle.objects.filter( + plan=self.plan).exclude(pk=self.pk).order_by("-startdate") + + for othercycle in othercycles: + if othercycle.startdate <= self.enddate and othercycle.startdate >= self.startdate: + self.enddate = othercycle.startdate-datetime.timedelta(days=1) + + 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) + +class TrainingMesoCycleForm(ModelForm): + class Meta: + model = TrainingMesoCycle + fields = ['name','startdate','enddate','notes'] + + widgets = { + 'startdate': AdminDateWidget(), + 'enddate': AdminDateWidget() + } + +class TrainingMicroCycleForm(ModelForm): + class Meta: + model = TrainingMicroCycle + fields = ['name','startdate','enddate','notes'] + + widgets = { + 'startdate': AdminDateWidget(), + 'enddate': AdminDateWidget() + } -# Cycle error checking goes in forms # model for Planned Session (Workout, Challenge, Test) class PlannedSession(models.Model): diff --git a/rowers/templates/trainingplan.html b/rowers/templates/trainingplan.html index 8c726804..4477b255 100644 --- a/rowers/templates/trainingplan.html +++ b/rowers/templates/trainingplan.html @@ -18,43 +18,48 @@
{{ macrocycle.0.startdate }}
-{{ macrocycle.0.enddate }}
- +