diff --git a/rowers/models.py b/rowers/models.py index de1946fa..c2cd5004 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -934,7 +934,9 @@ def a_week_from_now(): # models related to training planning - draft # Do we need a separate class TestTarget? class TrainingTarget(models.Model): - rower = models.ForeignKey(Rower,related_name='targetathlete') + rower = models.ForeignKey(Rower,related_name='targetathlete',null=True) + rowers = models.ManyToManyField(Rower, related_name='targetathletes', + verbose_name='Athletes') manager = models.ForeignKey(Rower,related_name='targetmanager',null=True) name = models.CharField(max_length=150,blank=True) date = models.DateField( @@ -944,8 +946,12 @@ class TrainingTarget(models.Model): def __unicode__(self): date = self.date name = self.name - ownerfirst = self.rower.user.first_name - ownerlast = self.rower.user.last_name + try: + ownerfirst = self.manager.user.first_name + ownerlast = self.manager.user.last_name + except AttributeError: + ownerfirst = '' + ownerlast = '' stri = u'{ownerfirst} {ownerlast} {d} {n}'.format( ownerfirst = ownerfirst, @@ -959,12 +965,24 @@ class TrainingTarget(models.Model): class TrainingTargetForm(ModelForm): class Meta: model = TrainingTarget - fields = ['name','date','notes'] + fields = ['name','date','notes','rowers'] widgets = { 'date': AdminDateWidget() } + def __init__(self,*args, **kwargs): + super(TrainingTargetForm, self).__init__(*args, **kwargs) + + try: + teams = Team.objects.filter(manager=self.instance.manager.user) + + self.fields['rowers'].queryset = Rower.objects.filter( + team__in=teams + ).distinct().order_by("user__last_name","user__first_name") + except AttributeError: + self.fields.pop('rowers') + # SportTracks has a TrainingGoal like this #class TrainingGoal(models.Model): @@ -991,10 +1009,11 @@ class TrainingPlan(models.Model): # rower field is obsolete. Use rowers rower = models.ForeignKey(Rower,related_name='planathlete',null=True) - rowers = models.ManyToManyField(Rower,related_name='planathletes') + rowers = models.ManyToManyField(Rower,related_name='planathletes', + verbose_name='Athletes') manager = models.ForeignKey(Rower,related_name='planmanager',null=True) name = models.CharField(max_length=150,blank=True) - status = models.CharField(max_length=150,default='active',choices=statuschoices) + status = models.BooleanField(default=True,verbose_name='Active') target = models.ForeignKey(TrainingTarget,blank=True,null=True) startdate = models.DateField(default=timezone.now) enddate = models.DateField( @@ -1024,16 +1043,23 @@ class TrainingPlan(models.Model): self.startdate = enddate self.enddate = startdate - if self.status == 'active': + if self.status: otherplans = TrainingPlan.objects.filter( - rower=self.rower, - status='active').exclude(pk=self.pk).order_by("-startdate") + status=True).exclude( + pk=self.pk).order_by( + "-startdate") for otherplan in otherplans: if otherplan.startdate <= self.enddate and otherplan.startdate >= self.startdate: - self.status = 'deactivated' + for rower in self.rowers.all(): + if rower in otherplan.rowers.all(): + print otherplan + self.status = False if otherplan.enddate >= self.startdate and otherplan.enddate <= self.enddate: - self.status = 'deactivated' + for rower in self.rowers.all(): + if rower in otherplan.rowers.all(): + print otherplan + self.status = False if not self.enddate <= self.startdate: super(TrainingPlan,self).save(*args, **kwargs) @@ -1061,7 +1087,7 @@ class TrainingPlan(models.Model): class TrainingPlanForm(ModelForm): class Meta: model = TrainingPlan - fields = ['name','target','startdate','enddate','status'] + fields = ['name','target','startdate','enddate','status','rowers'] widgets = { 'startdate': AdminDateWidget(), @@ -1076,8 +1102,16 @@ class TrainingPlanForm(ModelForm): targetchoices = [(x.id,x) for x in targets] targetchoices.append((None,'---')) self.fields['target'].choices = targetchoices + + try: + teams = Team.objects.filter(manager=self.instance.manager.user) + + self.fields['rowers'].queryset = Rower.objects.filter( + team__in=teams + ).distinct().order_by("user__last_name","user__first_name") + except AttributeError: + self.fields.pop('rowers') - cycletypechoices = ( ('filler','System Defined'), ('userdefined','User Defined') diff --git a/rowers/templates/trainingplan_create.html b/rowers/templates/trainingplan_create.html index 013ada82..2ec6d3d1 100644 --- a/rowers/templates/trainingplan_create.html +++ b/rowers/templates/trainingplan_create.html @@ -71,7 +71,7 @@ {{ plan.startdate }} {{ plan.enddate }} {{ plan.name }} - {{ plan.status }} + {% if plan.status %} active {% else %} inactive {% endif %} Edit Plan Delete diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py index c8f67040..1707661d 100644 --- a/rowers/templatetags/rowerfilters.py +++ b/rowers/templatetags/rowerfilters.py @@ -273,7 +273,7 @@ def team_members(user): members = Rower.objects.filter( team__in=teams ).distinct().order_by( - "user__last_name","user__last_name" + "user__last_name","user__first_name" ) return [rower.user for rower in members] except TypeError: @@ -397,7 +397,9 @@ def timeurl(path,timestring): @register.filter def trainingplans(rower): - plans = TrainingPlan.objects.filter(rower=rower).order_by("-startdate") + plans = TrainingPlan.objects.filter( + rowers=rower, + status=True).order_by("-startdate") return plans diff --git a/rowers/views.py b/rowers/views.py index 7c56c41f..2b8220a7 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -16156,12 +16156,15 @@ def rower_create_trainingplan(request,userid=0): date = targetform.cleaned_data['date'] notes = targetform.cleaned_data['notes'] - t = TrainingTarget(rowers=[therower], - name=name, - date=date, - manager=themanager, - notes=notes) + t = TrainingTarget( + name=name, + date=date, + manager=themanager, + notes=notes) + + t.save() + t.rowers.add(therower) t.save() elif request.method == 'POST' and 'startdate' in request.POST: @@ -16185,7 +16188,14 @@ def rower_create_trainingplan(request,userid=0): - targets = TrainingTarget.objects.filter(rower=therower).order_by("date") + targets2 = TrainingTarget.objects.filter(rower=therower).order_by("date") + for target in targets2: + if target.rower is not None: + target.rowers.add(target.rower) + target.rower = None + target.save() + + targets = TrainingTarget.objects.filter(rowers=therower).order_by("date") targetform = TrainingTargetForm() plans = TrainingPlan.objects.filter(rower=therower).order_by("-startdate") @@ -16193,7 +16203,7 @@ def rower_create_trainingplan(request,userid=0): plans = plans | plans2 - form = TrainingPlanForm(targets=targets) + form = TrainingPlanForm(targets=targets,initial={'status':False}) breadcrumbs = [ { @@ -17022,22 +17032,53 @@ class TrainingTargetUpdate(UpdateView): template_name = 'trainingplan_edit.html' form_class = TrainingTargetForm + # extra parameters + def get_context_data(self, **kwargs): + context = super(TrainingTargetUpdate, self).get_context_data(**kwargs) + + if 'userid' in kwargs: + userid = kwargs['userid'] + else: + userid=0 + + breadcrumbs = [ + { + 'url':reverse(plannedsessions_view, + kwargs={'userid':userid}), + 'name': 'Plan' + }, + { + 'url':reverse('trainingtarget_update_view', + kwargs={'pk':self.object.pk}), + 'name': 'Edit' + } + + ] + + context['active'] = 'nav-plan' + context['breadcrumbs'] = breadcrumbs + context['rower'] = getrequestrower(self.request,userid=userid) + + return context + def get_success_url(self): return reverse(rower_create_trainingplan) def form_valid(self, form): form.instance.user = self.request.user form.instance.post_date = datetime.datetime.now() - plan = form.save() + target = form.save() return super(TrainingTargetUpdate, self).form_valid(form) def get_object(self, *args, **kwargs): obj = super(TrainingTargetUpdate, self).get_object(*args, **kwargs) + if obj.rower is not None: + obj.rowers.add(obj.rower) + obj.rower = None + obj.save() 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 target') return obj def allsundays(startdate,enddate):