Merge branch 'feature/shareplans' into develop
This commit is contained in:
@@ -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):
|
||||
@@ -983,9 +1001,19 @@ 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',
|
||||
verbose_name='Athletes')
|
||||
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)
|
||||
startdate = models.DateField(default=timezone.now)
|
||||
enddate = models.DateField(
|
||||
@@ -995,10 +1023,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 +1042,34 @@ 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:
|
||||
otherplans = TrainingPlan.objects.filter(
|
||||
status=True).exclude(
|
||||
pk=self.pk).order_by(
|
||||
"-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:
|
||||
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 +1087,7 @@ class TrainingPlan(models.Model):
|
||||
class TrainingPlanForm(ModelForm):
|
||||
class Meta:
|
||||
model = TrainingPlan
|
||||
fields = ['name','target','startdate','enddate']
|
||||
fields = ['name','target','startdate','enddate','status','rowers']
|
||||
|
||||
widgets = {
|
||||
'startdate': AdminDateWidget(),
|
||||
@@ -1058,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')
|
||||
|
||||
@@ -366,7 +366,7 @@
|
||||
|
||||
<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"
|
||||
cycles are generated, adjusted and deleted automatically to
|
||||
ensure the entire plan
|
||||
|
||||
@@ -62,6 +62,7 @@
|
||||
<th> Start Date</th>
|
||||
<th> End Date</th>
|
||||
<th> Name</th>
|
||||
<th> Status</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -70,9 +71,18 @@
|
||||
<td> {{ plan.startdate }} </td>
|
||||
<td> {{ plan.enddate }}</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/deleteplan/{{ plan.id }}">Delete</a></td>
|
||||
<td>
|
||||
{% if request.user == plan.manager %}
|
||||
<a href="/rowers/deleteplan/{{ plan.id }}">Delete</a>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
108
rowers/views.py
108
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,12 +16156,15 @@ def rower_create_trainingplan(request,userid=0):
|
||||
date = targetform.cleaned_data['date']
|
||||
notes = targetform.cleaned_data['notes']
|
||||
|
||||
t = TrainingTarget(rower=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,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()
|
||||
|
||||
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 = [
|
||||
{
|
||||
@@ -16564,13 +16578,18 @@ 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):
|
||||
raise PermissionDenied("Access denied")
|
||||
if not checkaccessuser(request.user,plan.manager):
|
||||
if request.user.rower not in plan.rowers.all():
|
||||
raise PermissionDenied("Access denied")
|
||||
|
||||
createmacrofillers(plan)
|
||||
macrocycles = TrainingMacroCycle.objects.filter(
|
||||
@@ -16677,8 +16696,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 +16804,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 +16879,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 +16960,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 +17023,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):
|
||||
@@ -17018,22 +17033,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.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')
|
||||
|
||||
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):
|
||||
|
||||
Reference in New Issue
Block a user