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 }}
+
+
+
+{% 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,