diff --git a/rowers/models.py b/rowers/models.py index 67cb73c1..de1946fa 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -983,9 +983,18 @@ class TrainingTargetForm(ModelForm): class TrainingPlan(models.Model): - rower = models.ForeignKey(Rower,related_name='planathlete') + + statuschoices = ( + ('active','active'), + ('deactivated','inactive'), + ) + + # rower field is obsolete. Use rowers + rower = models.ForeignKey(Rower,related_name='planathlete',null=True) + rowers = models.ManyToManyField(Rower,related_name='planathletes') manager = models.ForeignKey(Rower,related_name='planmanager',null=True) - name = models.CharField(max_length=150,blank=True) + name = models.CharField(max_length=150,blank=True) + status = models.CharField(max_length=150,default='active',choices=statuschoices) target = models.ForeignKey(TrainingTarget,blank=True,null=True) startdate = models.DateField(default=timezone.now) enddate = models.DateField( @@ -995,10 +1004,10 @@ class TrainingPlan(models.Model): name = self.name startdate = self.startdate enddate = self.enddate - firstname = self.rower.user.first_name - lastname = self.rower.user.last_name + firstname = self.manager.user.first_name + lastname = self.manager.user.last_name - stri = u'Training Plan for {firstname} {lastname} {s} - {e}: {name}'.format( + stri = u'Training Plan by {firstname} {lastname} {s} - {e}: {name}'.format( s = startdate.strftime('%Y-%m-%d'), e = enddate.strftime('%Y-%m-%d'), firstname = firstname, @@ -1014,18 +1023,27 @@ class TrainingPlan(models.Model): enddate = self.enddate self.startdate = enddate self.enddate = startdate - - otherplans = TrainingPlan.objects.filter(rower=self.rower).exclude(pk=self.pk).order_by("-startdate") - for otherplan in otherplans: - if otherplan.startdate <= self.enddate and otherplan.startdate >= self.startdate: - self.enddate = otherplan.startdate-datetime.timedelta(days=1) - if otherplan.enddate >= self.startdate and otherplan.enddate <= self.enddate: - self.startdate = otherplan.enddate+datetime.timedelta(days=1) + if self.status == 'active': + otherplans = TrainingPlan.objects.filter( + rower=self.rower, + status='active').exclude(pk=self.pk).order_by("-startdate") + + for otherplan in otherplans: + if otherplan.startdate <= self.enddate and otherplan.startdate >= self.startdate: + self.status = 'deactivated' + if otherplan.enddate >= self.startdate and otherplan.enddate <= self.enddate: + self.status = 'deactivated' if not self.enddate <= self.startdate: super(TrainingPlan,self).save(*args, **kwargs) + if self.rower is not None: + self.rowers.add(self.rower) + self.rower = None + self.save() + + macrocycles = TrainingMacroCycle.objects.filter(plan = self) if not macrocycles: m = TrainingMacroCycle( @@ -1043,7 +1061,7 @@ class TrainingPlan(models.Model): class TrainingPlanForm(ModelForm): class Meta: model = TrainingPlan - fields = ['name','target','startdate','enddate'] + fields = ['name','target','startdate','enddate','status'] widgets = { 'startdate': AdminDateWidget(), diff --git a/rowers/templates/trainingplan_create.html b/rowers/templates/trainingplan_create.html index cbf7ffb6..013ada82 100644 --- a/rowers/templates/trainingplan_create.html +++ b/rowers/templates/trainingplan_create.html @@ -62,6 +62,7 @@ Start Date End Date Name + Status @@ -70,6 +71,7 @@ {{ plan.startdate }} {{ plan.enddate }} {{ plan.name }} + {{ plan.status }} Edit Plan Delete diff --git a/rowers/views.py b/rowers/views.py index 3396d11b..7c56c41f 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -14032,7 +14032,7 @@ def plannedsession_multiclone_view( try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14178,7 +14178,7 @@ def plannedsession_create_view(request, try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14211,7 +14211,7 @@ def plannedsession_multicreate_view(request, try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14468,7 +14468,7 @@ def plannedsession_teamedit_view(request, try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14702,7 +14702,7 @@ def plannedsessions_view(request, try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14765,7 +14765,7 @@ def plannedsessions_print_view(request,userid=0): try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14807,7 +14807,7 @@ def plannedsessions_manage_view(request,userid=0, try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -14961,7 +14961,7 @@ def plannedsession_clone_view(request,id=0,userid=0): try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -15026,7 +15026,7 @@ def plannedsession_edit_view(request,id=0,userid=0): try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -15243,7 +15243,7 @@ def plannedsession_view(request,id=0,userid=0): try: trainingplan = TrainingPlan.objects.filter( startdate__lte = startdate, - rower = r, + rowers = r, enddate__gte = enddate)[0] except IndexError: trainingplan = None @@ -16156,7 +16156,7 @@ def rower_create_trainingplan(request,userid=0): date = targetform.cleaned_data['date'] notes = targetform.cleaned_data['notes'] - t = TrainingTarget(rower=therower, + t = TrainingTarget(rowers=[therower], name=name, date=date, manager=themanager, @@ -16189,6 +16189,10 @@ def rower_create_trainingplan(request,userid=0): targetform = TrainingTargetForm() plans = TrainingPlan.objects.filter(rower=therower).order_by("-startdate") + plans2 = TrainingPlan.objects.filter(rowers=therower).order_by("-startdate") + + plans = plans | plans2 + form = TrainingPlanForm(targets=targets) breadcrumbs = [ @@ -16564,12 +16568,16 @@ def rower_trainingplan_view(request, try: plan = TrainingPlan.objects.get(id=id) + if plan.rower is not None: + plan.rowers.add(plan.rower) + plan.rower = None + plan.save() except TrainingPlan.DoesNotExist: raise Http404("Training Plan Does Not Exist") r = getrequestrower(request,userid=userid) - if not checkaccessuser(request.user,plan.rower): + if not checkaccessuser(request.user,plan.manager): raise PermissionDenied("Access denied") createmacrofillers(plan) @@ -16677,8 +16685,6 @@ def rower_trainingplan_view(request, count = 0 cycles = {} - r = plan.rower - for m in macrocycles: createmesofillers(m) mesocycles = TrainingMesoCycle.objects.filter(plan=m).order_by("startdate") @@ -16787,7 +16793,7 @@ class TrainingMacroCycleUpdate(UpdateView): if obj.plan.manager is not None and self.request.user.rower != obj.plan.manager: raise PermissionDenied('You are not allowed to edit this training plan cycle') - if not checkaccessuser(self.request.user,obj.plan.rower): + if not checkaccessuser(self.request.user,obj.plan.manager): raise PermissionDenied('You are not allowed to edit this training plan cycle') else: obj.type = 'userdefined' @@ -16862,7 +16868,7 @@ class TrainingMesoCycleUpdate(UpdateView): if obj.plan.plan.manager is not None and self.request.user.rower != obj.plan.plan.manager: raise PermissionDenied('You are not allowed to edit this training plan cycle') - if not checkaccessuser(self.request.user,r): + if r is not None and not checkaccessuser(self.request.user,r): raise PermissionDenied('You are not allowed to edit this training plan cycle') else: obj.type = 'userdefined' @@ -16943,7 +16949,7 @@ class TrainingMicroCycleUpdate(UpdateView): if obj.plan.plan.plan.manager is not None and self.request.user.rower != obj.plan.plan.plan.manager: raise PermissionDenied('You are not allowed to edit this training plan cycle') - if not checkaccessuser(self.request.user,r): + if r is not None and not checkaccessuser(self.request.user,r): raise PermissionDenied('You are not allowed to edit this training plan cycle') else: obj.type = 'userdefined' @@ -17006,11 +17012,9 @@ class TrainingPlanUpdate(UpdateView): def get_object(self, *args, **kwargs): obj = super(TrainingPlanUpdate, self).get_object(*args, **kwargs) - if obj.manager is not None and self.request.user.rower != obj.manager.user: + if obj.manager is not None and self.request.user.rower != obj.manager: raise PermissionDenied('You are not allowed to edit this training plan cycle') - if not checkaccessuser(self.request.user,obj.rower): - raise PermissionDenied('You are not allowed to edit this training plan cycle') return obj class TrainingTargetUpdate(UpdateView): @@ -17029,7 +17033,7 @@ class TrainingTargetUpdate(UpdateView): def get_object(self, *args, **kwargs): obj = super(TrainingTargetUpdate, self).get_object(*args, **kwargs) - if obj.manager is not None and self.request.user.rower != obj.manager.user: + if obj.manager is not None and self.request.user.rower != obj.manager: raise PermissionDenied('You are not allowed to edit this training plan cycle') if not checkaccessuser(self.request.user,obj.rower):