diff --git a/rowers/models.py b/rowers/models.py index 9980e7ab..69f1dade 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -1535,12 +1535,28 @@ class InstantPlan(models.Model): uuid = models.UUIDField(primary_key=False,editable=True,default=uuid.uuid4) owner = models.ForeignKey(User,on_delete=models.SET_NULL,null=True) name = models.CharField(max_length=150,blank=True) - goal = models.CharField(max_length=150,blank=True) - description = models.TextField(max_length=300,blank=True) - duration = models.IntegerField(default=6) - target = models.TextField(max_length=300,blank=True) - hoursperweek = models.IntegerField(default=4) + goal = models.CharField(max_length=150,blank=True,verbose_name="Goal (one sentence)") + description = models.TextField(max_length=450,blank=True) + duration = models.IntegerField(default=6,verbose_name='Duration in Calendar Days') + target = models.TextField(max_length=450,blank=True,verbose_name='What the plan will achieve') + hoursperweek = models.IntegerField(default=4,verbose_name='Hours Per Week') + yaml = models.FileField(upload_to=get_file_path,verbose_name="Plan YAML file",null=True,blank=True) + def save(self, *args, **kwargs): + super(InstantPlan, self).save(*args, **kwargs) + +class InstantPlanForm(ModelForm): + class Meta: + model = InstantPlan + fields = [ + 'name', + 'goal', + 'description', + 'duration', + 'target', + 'hoursperweek', + 'yaml', + ] @python_2_unicode_compatible class TrainingPlan(models.Model): diff --git a/rowers/templates/add_instantplan.html b/rowers/templates/add_instantplan.html new file mode 100644 index 00000000..4fb4e298 --- /dev/null +++ b/rowers/templates/add_instantplan.html @@ -0,0 +1,32 @@ +{% extends "newbase.html" %} +{% load staticfiles %} +{% load rowerfilters %} + +{% block title %}Add Instant Plan{% endblock %} + + +{% block main %} +

{{ plan.name }}

+ +
    +
  • +
    + {% if form.errors %} +

    + Please correct the error{{ form.errors|pluralize }} below. +

    + {% endif %} + + {{ form.as_table }} +
    + {% csrf_token %} +

    +
    +
  • +
+ +{% endblock %} + +{% block sidebar %} +{% include 'menu_plan.html' %} +{% endblock %} diff --git a/rowers/templates/instantplans.html b/rowers/templates/instantplans.html index b421fd6b..5a6a3be1 100644 --- a/rowers/templates/instantplans.html +++ b/rowers/templates/instantplans.html @@ -15,6 +15,11 @@

{{ plan.plan|lookup:"duration"}}

{% endfor %} + {% if user.is_authenticated and user.is_staff %} +
  • + Add a New Training Plan +
  • + {% endif %} {% endblock %} diff --git a/rowers/urls.py b/rowers/urls.py index 89ee2771..fc82f282 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -743,6 +743,7 @@ urlpatterns = [ re_path(r'^plans/$', views.rower_select_instantplan, name='rower_select_instantplan'), re_path(r'^plans/(?P[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12})/$', views.rower_view_instantplan, name='rower_view_instantplan'), + re_path(r'^addinstantplan/$', views.add_instantplan_view, name='add_instantplan_view'), re_path(r'^deleteplan/(?P\d+)/$',login_required( views.TrainingPlanDelete.as_view()),name='trainingplan_delete_view'), re_path(r'^deletemicrocycle/(?P\d+)/$',login_required( diff --git a/rowers/views/planviews.py b/rowers/views/planviews.py index bf925e49..bde0c3dd 100644 --- a/rowers/views/planviews.py +++ b/rowers/views/planviews.py @@ -2497,6 +2497,54 @@ def rower_view_instantplan(request,id='',userid=0): 'trainingdays':trainingdays2, }) +@login_required() +def add_instantplan_view(request): + if not request.user.is_staff: + raise PermissionDenied("Not Allowed") + + r = getrequestrower(request) + + if request.method == 'POST': + form = InstantPlanForm(request.POST,request.FILES) + if form.is_valid(): + ip = form.save(commit=False) + ip.manager = r.user + ip.save() + + url = reverse(rower_select_instantplan) + + return HttpResponseRedirect(url) + else: + form = InstantPlanForm() + + breadcrumbs = [ + { + 'url':reverse('plannedsessions_view'), + 'name': 'Sessions' + }, + { + 'url':reverse(rower_create_trainingplan), + 'name': 'Manage Plans and Targets' + }, + { + 'url':reverse('rower_select_instantplan'), + 'name': 'Select Existing Plans' + }, + { + 'url': reverse(add_instantplan_view), + 'name': 'Add New Instant Plan' + } + ] + + return render(request,'add_instantplan.html', + { + 'form':form, + 'rower':r, + 'active':'nav-plan', + 'breadcrumbs':breadcrumbs, + } + ) + @user_passes_test(can_plan,login_url="/rowers/paidplans", message="This functionality requires a Coach or Self-Coach plan", redirect_field_name=None) diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 304a1ea9..398a1ed1 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -133,7 +133,7 @@ from rowers.models import ( IndoorVirtualRaceResultForm,IndoorVirtualRaceResult, IndoorVirtualRaceForm,PlannedSessionCommentForm, Alert, Condition, StaticChartRowerForm, - FollowerForm,VirtualRaceAthleteForm, + FollowerForm,VirtualRaceAthleteForm,InstantPlanForm, ) from rowers.models import ( FavoriteForm,BaseFavoriteFormSet,SiteAnnouncement,BasePlannedSessionFormSet,