Private
Public Access
1
0

Merge branch 'feature/shareplans' into develop

This commit is contained in:
Sander Roosendaal
2018-10-29 21:21:40 +01:00
5 changed files with 164 additions and 54 deletions

View File

@@ -934,7 +934,9 @@ def a_week_from_now():
# models related to training planning - draft # models related to training planning - draft
# Do we need a separate class TestTarget? # Do we need a separate class TestTarget?
class TrainingTarget(models.Model): 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) manager = models.ForeignKey(Rower,related_name='targetmanager',null=True)
name = models.CharField(max_length=150,blank=True) name = models.CharField(max_length=150,blank=True)
date = models.DateField( date = models.DateField(
@@ -944,8 +946,12 @@ class TrainingTarget(models.Model):
def __unicode__(self): def __unicode__(self):
date = self.date date = self.date
name = self.name name = self.name
ownerfirst = self.rower.user.first_name try:
ownerlast = self.rower.user.last_name ownerfirst = self.manager.user.first_name
ownerlast = self.manager.user.last_name
except AttributeError:
ownerfirst = ''
ownerlast = ''
stri = u'{ownerfirst} {ownerlast} {d} {n}'.format( stri = u'{ownerfirst} {ownerlast} {d} {n}'.format(
ownerfirst = ownerfirst, ownerfirst = ownerfirst,
@@ -959,12 +965,24 @@ class TrainingTarget(models.Model):
class TrainingTargetForm(ModelForm): class TrainingTargetForm(ModelForm):
class Meta: class Meta:
model = TrainingTarget model = TrainingTarget
fields = ['name','date','notes'] fields = ['name','date','notes','rowers']
widgets = { widgets = {
'date': AdminDateWidget() '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 # SportTracks has a TrainingGoal like this
#class TrainingGoal(models.Model): #class TrainingGoal(models.Model):
@@ -983,9 +1001,19 @@ class TrainingTargetForm(ModelForm):
class TrainingPlan(models.Model): 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',
verbose_name='Athletes')
manager = models.ForeignKey(Rower,related_name='planmanager',null=True) 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.BooleanField(default=True,verbose_name='Active')
target = models.ForeignKey(TrainingTarget,blank=True,null=True) target = models.ForeignKey(TrainingTarget,blank=True,null=True)
startdate = models.DateField(default=timezone.now) startdate = models.DateField(default=timezone.now)
enddate = models.DateField( enddate = models.DateField(
@@ -995,10 +1023,10 @@ class TrainingPlan(models.Model):
name = self.name name = self.name
startdate = self.startdate startdate = self.startdate
enddate = self.enddate enddate = self.enddate
firstname = self.rower.user.first_name firstname = self.manager.user.first_name
lastname = self.rower.user.last_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'), s = startdate.strftime('%Y-%m-%d'),
e = enddate.strftime('%Y-%m-%d'), e = enddate.strftime('%Y-%m-%d'),
firstname = firstname, firstname = firstname,
@@ -1014,18 +1042,34 @@ class TrainingPlan(models.Model):
enddate = self.enddate enddate = self.enddate
self.startdate = enddate self.startdate = enddate
self.enddate = startdate self.enddate = startdate
otherplans = TrainingPlan.objects.filter(rower=self.rower).exclude(pk=self.pk).order_by("-startdate")
for otherplan in otherplans: if self.status:
if otherplan.startdate <= self.enddate and otherplan.startdate >= self.startdate: otherplans = TrainingPlan.objects.filter(
self.enddate = otherplan.startdate-datetime.timedelta(days=1) status=True).exclude(
if otherplan.enddate >= self.startdate and otherplan.enddate <= self.enddate: pk=self.pk).order_by(
self.startdate = otherplan.enddate+datetime.timedelta(days=1) "-startdate")
for otherplan in otherplans:
if otherplan.startdate <= self.enddate and otherplan.startdate >= self.startdate:
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:
for rower in self.rowers.all():
if rower in otherplan.rowers.all():
print otherplan
self.status = False
if not self.enddate <= self.startdate: if not self.enddate <= self.startdate:
super(TrainingPlan,self).save(*args, **kwargs) 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) macrocycles = TrainingMacroCycle.objects.filter(plan = self)
if not macrocycles: if not macrocycles:
m = TrainingMacroCycle( m = TrainingMacroCycle(
@@ -1043,7 +1087,7 @@ class TrainingPlan(models.Model):
class TrainingPlanForm(ModelForm): class TrainingPlanForm(ModelForm):
class Meta: class Meta:
model = TrainingPlan model = TrainingPlan
fields = ['name','target','startdate','enddate'] fields = ['name','target','startdate','enddate','status','rowers']
widgets = { widgets = {
'startdate': AdminDateWidget(), 'startdate': AdminDateWidget(),
@@ -1058,8 +1102,16 @@ class TrainingPlanForm(ModelForm):
targetchoices = [(x.id,x) for x in targets] targetchoices = [(x.id,x) for x in targets]
targetchoices.append((None,'---')) targetchoices.append((None,'---'))
self.fields['target'].choices = targetchoices 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 = ( cycletypechoices = (
('filler','System Defined'), ('filler','System Defined'),
('userdefined','User Defined') ('userdefined','User Defined')

View File

@@ -366,7 +366,7 @@
<p>Click on the cycle to fold out its contents.</p> <p>Click on the cycle to fold out its contents.</p>
<p>Click on the plan cycles to edit their names, start and end dates. <p>
The gray "filler" The gray "filler"
cycles are generated, adjusted and deleted automatically to cycles are generated, adjusted and deleted automatically to
ensure the entire plan ensure the entire plan

View File

@@ -62,6 +62,7 @@
<th> Start Date</th> <th> Start Date</th>
<th> End Date</th> <th> End Date</th>
<th> Name</th> <th> Name</th>
<th> Status</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
@@ -70,9 +71,18 @@
<td> {{ plan.startdate }} </td> <td> {{ plan.startdate }} </td>
<td> {{ plan.enddate }}</td> <td> {{ plan.enddate }}</td>
<td><a href="/rowers/plan/{{ plan.id }}">{{ plan.name }}</a></td> <td><a href="/rowers/plan/{{ plan.id }}">{{ plan.name }}</a></td>
<td> <a href="/rowers/editplan/{{ plan.id }}">Edit</a></td> <td> {% if plan.status %} active {% else %} inactive {% endif %}</td>
<td>
{% if request.user == plan.manager %}
<a href="/rowers/editplan/{{ plan.id }}">Edit</a>
{% endif %}
</td>
<td> <a href="/rowers/plan/{{ plan.id }}">Plan</a></td> <td> <a href="/rowers/plan/{{ plan.id }}">Plan</a></td>
<td> <a href="/rowers/deleteplan/{{ plan.id }}">Delete</a></td> <td>
{% if request.user == plan.manager %}
<a href="/rowers/deleteplan/{{ plan.id }}">Delete</a>
{% endif %}
</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>

View File

@@ -273,7 +273,7 @@ def team_members(user):
members = Rower.objects.filter( members = Rower.objects.filter(
team__in=teams team__in=teams
).distinct().order_by( ).distinct().order_by(
"user__last_name","user__last_name" "user__last_name","user__first_name"
) )
return [rower.user for rower in members] return [rower.user for rower in members]
except TypeError: except TypeError:
@@ -397,7 +397,9 @@ def timeurl(path,timestring):
@register.filter @register.filter
def trainingplans(rower): 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 return plans

View File

@@ -14032,7 +14032,7 @@ def plannedsession_multiclone_view(
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14178,7 +14178,7 @@ def plannedsession_create_view(request,
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14211,7 +14211,7 @@ def plannedsession_multicreate_view(request,
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14468,7 +14468,7 @@ def plannedsession_teamedit_view(request,
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14702,7 +14702,7 @@ def plannedsessions_view(request,
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14765,7 +14765,7 @@ def plannedsessions_print_view(request,userid=0):
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14807,7 +14807,7 @@ def plannedsessions_manage_view(request,userid=0,
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -14961,7 +14961,7 @@ def plannedsession_clone_view(request,id=0,userid=0):
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -15026,7 +15026,7 @@ def plannedsession_edit_view(request,id=0,userid=0):
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -15243,7 +15243,7 @@ def plannedsession_view(request,id=0,userid=0):
try: try:
trainingplan = TrainingPlan.objects.filter( trainingplan = TrainingPlan.objects.filter(
startdate__lte = startdate, startdate__lte = startdate,
rower = r, rowers = r,
enddate__gte = enddate)[0] enddate__gte = enddate)[0]
except IndexError: except IndexError:
trainingplan = None trainingplan = None
@@ -16156,12 +16156,15 @@ def rower_create_trainingplan(request,userid=0):
date = targetform.cleaned_data['date'] date = targetform.cleaned_data['date']
notes = targetform.cleaned_data['notes'] notes = targetform.cleaned_data['notes']
t = TrainingTarget(rower=therower, t = TrainingTarget(
name=name, name=name,
date=date, date=date,
manager=themanager, manager=themanager,
notes=notes) notes=notes)
t.save()
t.rowers.add(therower)
t.save() t.save()
elif request.method == 'POST' and 'startdate' in request.POST: elif request.method == 'POST' and 'startdate' in request.POST:
@@ -16185,11 +16188,22 @@ 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() targetform = TrainingTargetForm()
plans = TrainingPlan.objects.filter(rower=therower).order_by("-startdate") plans = TrainingPlan.objects.filter(rower=therower).order_by("-startdate")
form = TrainingPlanForm(targets=targets) plans2 = TrainingPlan.objects.filter(rowers=therower).order_by("-startdate")
plans = plans | plans2
form = TrainingPlanForm(targets=targets,initial={'status':False})
breadcrumbs = [ breadcrumbs = [
{ {
@@ -16564,13 +16578,18 @@ def rower_trainingplan_view(request,
try: try:
plan = TrainingPlan.objects.get(id=id) 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: except TrainingPlan.DoesNotExist:
raise Http404("Training Plan Does Not Exist") raise Http404("Training Plan Does Not Exist")
r = getrequestrower(request,userid=userid) r = getrequestrower(request,userid=userid)
if not checkaccessuser(request.user,plan.rower): if not checkaccessuser(request.user,plan.manager):
raise PermissionDenied("Access denied") if request.user.rower not in plan.rowers.all():
raise PermissionDenied("Access denied")
createmacrofillers(plan) createmacrofillers(plan)
macrocycles = TrainingMacroCycle.objects.filter( macrocycles = TrainingMacroCycle.objects.filter(
@@ -16677,8 +16696,6 @@ def rower_trainingplan_view(request,
count = 0 count = 0
cycles = {} cycles = {}
r = plan.rower
for m in macrocycles: for m in macrocycles:
createmesofillers(m) createmesofillers(m)
mesocycles = TrainingMesoCycle.objects.filter(plan=m).order_by("startdate") mesocycles = TrainingMesoCycle.objects.filter(plan=m).order_by("startdate")
@@ -16787,7 +16804,7 @@ class TrainingMacroCycleUpdate(UpdateView):
if obj.plan.manager is not None and self.request.user.rower != obj.plan.manager: 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') 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') raise PermissionDenied('You are not allowed to edit this training plan cycle')
else: else:
obj.type = 'userdefined' obj.type = 'userdefined'
@@ -16862,7 +16879,7 @@ class TrainingMesoCycleUpdate(UpdateView):
if obj.plan.plan.manager is not None and self.request.user.rower != obj.plan.plan.manager: 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') 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') raise PermissionDenied('You are not allowed to edit this training plan cycle')
else: else:
obj.type = 'userdefined' obj.type = 'userdefined'
@@ -16943,7 +16960,7 @@ class TrainingMicroCycleUpdate(UpdateView):
if obj.plan.plan.plan.manager is not None and self.request.user.rower != obj.plan.plan.plan.manager: 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') 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') raise PermissionDenied('You are not allowed to edit this training plan cycle')
else: else:
obj.type = 'userdefined' obj.type = 'userdefined'
@@ -17006,11 +17023,9 @@ class TrainingPlanUpdate(UpdateView):
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
obj = super(TrainingPlanUpdate, self).get_object(*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') 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 return obj
class TrainingTargetUpdate(UpdateView): class TrainingTargetUpdate(UpdateView):
@@ -17018,22 +17033,53 @@ class TrainingTargetUpdate(UpdateView):
template_name = 'trainingplan_edit.html' template_name = 'trainingplan_edit.html'
form_class = TrainingTargetForm 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): def get_success_url(self):
return reverse(rower_create_trainingplan) return reverse(rower_create_trainingplan)
def form_valid(self, form): def form_valid(self, form):
form.instance.user = self.request.user form.instance.user = self.request.user
form.instance.post_date = datetime.datetime.now() form.instance.post_date = datetime.datetime.now()
plan = form.save() target = form.save()
return super(TrainingTargetUpdate, self).form_valid(form) return super(TrainingTargetUpdate, self).form_valid(form)
def get_object(self, *args, **kwargs): def get_object(self, *args, **kwargs):
obj = super(TrainingTargetUpdate, self).get_object(*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.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') 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 return obj
def allsundays(startdate,enddate): def allsundays(startdate,enddate):