diff --git a/rowers/courses.py b/rowers/courses.py
index 2cd1280d..495deee0 100644
--- a/rowers/courses.py
+++ b/rowers/courses.py
@@ -28,7 +28,7 @@ from rowers.models import (
Rower, Workout,
GeoPoint,GeoPolygon, GeoCourse,
course_length,course_coord_center,course_coord_maxmin,
- polygon_coord_center
+ polygon_coord_center,PlannedSession
)
# low level methods
@@ -307,3 +307,13 @@ def get_time_course(ws,course):
coursemeters = coursemeters-coursemetersfirst
return coursetimeseconds,coursemeters,coursecompleted
+
+def replacecourse(course1,course2):
+ ps = PlannedSession.objects.filter(course=course1)
+ for p in ps:
+ p.course = course2
+ p.save()
+
+ course1.delete()
+
+ return 1
diff --git a/rowers/forms.py b/rowers/forms.py
index f4d4e457..1231a1d7 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -1,6 +1,6 @@
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
-from rowers.models import Workout,Rower,Team,PlannedSession
+from rowers.models import Workout,Rower,Team,PlannedSession,GeoCourse
from rowers.rows import validate_file_extension,must_be_csv,validate_image_extension,validate_kml
from django.contrib.auth.forms import UserCreationForm
from django.contrib.auth.models import User
@@ -536,6 +536,9 @@ class StatsOptionsForm(forms.Form):
coastal = forms.BooleanField(initial=False,required=False)
other = forms.BooleanField(initial=False,required=False)
+class CourseSelectForm(forms.Form):
+ course = forms.ModelChoiceField(queryset=GeoCourse.objects.all())
+
class WorkoutMultipleCompareForm(forms.Form):
workouts = forms.ModelMultipleChoiceField(queryset=Workout.objects.all(),
widget=forms.CheckboxSelectMultiple())
diff --git a/rowers/templates/course_edit_view.html b/rowers/templates/course_edit_view.html
index 64c46e59..50668820 100644
--- a/rowers/templates/course_edit_view.html
+++ b/rowers/templates/course_edit_view.html
@@ -13,7 +13,8 @@
{% if nosessions %}
Delete
{% else %}
-
+
+ Update
{% endif %}
diff --git a/rowers/templates/course_replace.html b/rowers/templates/course_replace.html
new file mode 100644
index 00000000..c1420323
--- /dev/null
+++ b/rowers/templates/course_replace.html
@@ -0,0 +1,51 @@
+{% extends "base.html" %}
+{% load staticfiles %}
+{% load rowerfilters %}
+{% block scripts %}
+{% include "monitorjobs.html" %}
+{% endblock %}
+
+{% block title %}{{ course.name }} {% endblock %}
+{% block og_title %}{{ course.name }} {% endblock %}
+{% block content %}
+
+
+ {% if course.manager == rower %}
+
View Course
+ {% else %}
+
+ {% endif %}
+
+
+
+
+
+
Replace {{ course.name }}
+
+
+
+ This replaces the course {{ course.name }} with the course you select below for all
+ planned sessions and virtual races, and then deletes this course.
+
+
+
+
+ {{ mapdiv|safe }}
+
+
+ {{ mapscript|safe }}
+
+
+
+
+{% endblock %}
diff --git a/rowers/templates/coursemap.html b/rowers/templates/coursemap.html
new file mode 100644
index 00000000..f1ac2f9a
--- /dev/null
+++ b/rowers/templates/coursemap.html
@@ -0,0 +1,7 @@
+
+ {{ mapscript|safe }}
+ {{ mapdiv|safe }}
+
+
+
+
diff --git a/rowers/urls.py b/rowers/urls.py
index 21618817..a5000cd0 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -513,7 +513,9 @@ urlpatterns = [
url(r'^courses/(?P
\d+)/edit$',views.course_edit_view,
name='course_edit_view'),
url(r'^courses/(?P\d+)/delete$',views.course_delete_view),
+ url(r'^courses/(?P\d+)/replace$',views.course_replace_view),
url(r'^courses/(?P\d+)$',views.course_view),
+ url(r'^courses/(?P\d+)/map$',views.course_map_view),
]
if settings.DEBUG:
diff --git a/rowers/views.py b/rowers/views.py
index c1bb84d1..113c8a1b 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -34,7 +34,7 @@ from rowers.forms import (
WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement,
LandingPageForm,PlannedSessionSelectForm,WorkoutSessionSelectForm,
PlannedSessionTeamForm,PlannedSessionTeamMemberForm,
- VirtualRaceSelectForm,WorkoutRaceSelectForm,
+ VirtualRaceSelectForm,WorkoutRaceSelectForm,CourseSelectForm,
)
from django.core.urlresolvers import reverse
from django.core.exceptions import PermissionDenied
@@ -8841,6 +8841,66 @@ def workout_comment_view(request,id=0):
'form':form,
})
+# for ajax calls
+def course_map_view(request,id=0):
+ if id != 0:
+ try:
+ course = GeoCourse.objects.get(id=id)
+ except GeoCourse.DoesNotExist:
+ return Http404("Course doesn't exist")
+
+ script,div = course_map(course)
+
+ return render(request,
+ 'coursemap.html',
+ {
+ 'mapdiv':div,
+ 'mapscript':script
+ })
+
+ else:
+ return ""
+
+@login_required()
+def course_replace_view(request,id=0):
+ try:
+ course = GeoCourse.objects.get(id=id)
+ except GeoCourse.DoesNotExist:
+ return Http404("Course doesn't exist")
+
+ r = getrower(request.user)
+
+ if course.manager != r:
+ raise PermissionDenied("Access denied")
+
+ thecourses = GeoCourse.objects.filter(manager=r).exclude(id=id)
+
+ if request.method == 'POST':
+ form = CourseSelectForm(request.POST)
+ if form.is_valid():
+ course2 = form.cleaned_data['course']
+ res = courses.replacecourse(course,course2)
+
+ url = reverse(course_view,
+ kwargs = {
+ 'id':course2.id
+ })
+
+ return HttpResponseRedirect(url)
+ else:
+
+ form = CourseSelectForm()
+ form.fields["course"].queryset = thecourses
+
+ script,div = course_map(course)
+
+ return render(request,
+ 'course_replace.html',
+ {'course':course,
+ 'mapdiv':div,
+ 'mapscript':script,
+ 'form':form})
+
@login_required()
def course_delete_view(request,id=0):
try: