diff --git a/rowers/courses.py b/rowers/courses.py
index 25a23d11..060ab246 100644
--- a/rowers/courses.py
+++ b/rowers/courses.py
@@ -162,8 +162,10 @@ from geopy.geocoders import Nominatim
geolocator = Nominatim()
-def createcourse(manager,name,polygons):
- c = GeoCourse(manager=manager,name=name)
+def createcourse(
+ manager,name,polygons,notes=''):
+
+ c = GeoCourse(manager=manager,name=name,notes=notes)
c.save()
i = 0
@@ -186,4 +188,5 @@ def createcourse(manager,name,polygons):
obj.save()
j += 1
i += 1
-
+
+ return c
diff --git a/rowers/forms.py b/rowers/forms.py
index 3d5281d5..c5ffa552 100644
--- a/rowers/forms.py
+++ b/rowers/forms.py
@@ -1,7 +1,7 @@
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from rowers.models import Workout,Rower,Team,PlannedSession
-from rowers.rows import validate_file_extension,must_be_csv,validate_image_extension
+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
from django.contrib.admin.widgets import AdminDateWidget
@@ -55,7 +55,21 @@ class ImageForm(forms.Form):
from django.forms.widgets import HiddenInput
super(ImageForm, self).__init__(*args, **kwargs)
-
+
+# The form used for uploading images
+class CourseForm(forms.Form):
+ name = forms.CharField(max_length=150,label='Course Name')
+ file = forms.FileField(required=False,
+ validators=[validate_kml])
+ notes = forms.CharField(required=False,
+ max_length=200,label='Course Notes',
+ widget=forms.Textarea)
+
+ def __init__(self, *args, **kwargs):
+ from django.forms.widgets import HiddenInput
+ super(CourseForm, self).__init__(*args, **kwargs)
+
+
# The form used for uploading files
class DocumentsForm(forms.Form):
title = forms.CharField(required=False)
diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py
index 9ec4834e..cf9bbdd1 100644
--- a/rowers/interactiveplots.py
+++ b/rowers/interactiveplots.py
@@ -757,7 +757,6 @@ def course_map(course):
]"""
- print pcoordinates
script = """
+
+
+{% endblock %}
+
+{% block content %}
+
+
Drag and drop files here
+
+
+{% endblock %}
+
+ {% block scripts %}
+
+
+
+ {% endblock %}
diff --git a/rowers/templates/course_view.html b/rowers/templates/course_view.html
index 68884203..88c74081 100644
--- a/rowers/templates/course_view.html
+++ b/rowers/templates/course_view.html
@@ -9,7 +9,13 @@
{% block og_title %}{{ course.name }} {% endblock %}
{% block content %}
-
+ {% if nosessions %}
+
+ {% endif %}
+
+
{{ course.name }}
diff --git a/rowers/templates/list_courses.html b/rowers/templates/list_courses.html
index 54795b69..84255ebd 100644
--- a/rowers/templates/list_courses.html
+++ b/rowers/templates/list_courses.html
@@ -85,26 +85,12 @@
- {% if rankingonly and not team %}
- {% elif not team %}
-
- {% endif %}
-
- {% if team %}
-
-
- {% if courses.has_previous %}
- {% if request.GET.q %}
- <
- {% else %}
- <
- {% endif %}
- {% endif %}
-
-
- Page {{ courses.number }} of {{ courses.paginator.num_pages }}.
-
-
- {% if courses.has_next %}
- {% if request.GET.q %}
- >
- {% else %}
- >
- {% endif %}
- {% endif %}
-
-
+
+
{% endblock %}
diff --git a/rowers/urls.py b/rowers/urls.py
index 21a12f56..acf5dfa2 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -144,6 +144,7 @@ urlpatterns = [
url(r'^list-workouts/(?P
\w+.*)/(?P\w+.*)$',views.workouts_view),
url(r'^list-workouts/$',views.workouts_view),
url(r'^list-courses/$',views.courses_view),
+ url(r'^courses/upload$',views.course_upload_view),
url(r'^addmanual/$',views.addmanual_view),
url(r'^team-compare-select/team/(?P\d+)/(?P\w+.*)/(?P\w+.*)$',views.team_comparison_select),
url(r'^team-compare-select/team/(?P\d+)/$',views.team_comparison_select),
@@ -487,6 +488,7 @@ urlpatterns = [
url(r'^sessions/(?P[\w\ ]+.*)$',views.plannedsessions_view),
url(r'^courses/(?P\d+)/edit$',views.course_edit_view,
name='course_edit_view'),
+ url(r'^courses/(?P\d+)/delete$',views.course_delete_view),
]
if settings.DEBUG:
diff --git a/rowers/views.py b/rowers/views.py
index fdc9fd43..c9578471 100644
--- a/rowers/views.py
+++ b/rowers/views.py
@@ -27,7 +27,7 @@ from django.http import (
)
from django.contrib.auth import authenticate, login, logout
from rowers.forms import (
- LoginForm,DocumentsForm,UploadOptionsForm,ImageForm,
+ LoginForm,DocumentsForm,UploadOptionsForm,ImageForm,CourseForm,
TeamUploadOptionsForm,WorkFlowLeftPanelForm,WorkFlowMiddlePanelForm,
WorkFlowLeftPanelElement,WorkFlowMiddlePanelElement,
LandingPageForm,PlannedSessionSelectForm,WorkoutSessionSelectForm,
@@ -69,6 +69,7 @@ from rowers.models import (
)
from rowers.metrics import rowingmetrics,defaultfavoritecharts
from rowers import metrics
+from rowers import courses
import rowers.uploads as uploads
from django.forms.formsets import formset_factory
from django.forms import modelformset_factory
@@ -6052,6 +6053,8 @@ def courses_view(request):
courses = GeoCourse.objects.all().order_by("country")
+ # add search processing
+
return render(request,'list_courses.html',
{'courses':courses,
'rower':r,
@@ -8405,6 +8408,28 @@ def workout_comment_view(request,id=0):
'form':form,
})
+@login_required()
+def course_delete_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")
+
+ ps = PlannedSession.objects.filter(course=course)
+ nosessions = len(ps) == 0
+
+ if nosessions:
+ course.delete()
+
+ url = reverse(courses_view)
+
+ return HttpResponseRedirect(url)
+
@login_required()
def course_edit_view(request,id=0):
try:
@@ -8412,7 +8437,15 @@ def course_edit_view(request,id=0):
except GeoCourse.DoesNotExist:
return Http404("Course doesn't exist")
+ r = getrower(request.user)
+
+ if course.manager != r:
+ raise PermissionDenied("Access denied")
+ ps = PlannedSession.objects.filter(course=course)
+ nosessions = len(ps) == 0
+
+
script,div = course_map(course)
return render(request, 'course_view.html',
@@ -8420,6 +8453,7 @@ def course_edit_view(request,id=0):
'course':course,
'mapscript':script,
'mapdiv':div,
+ 'nosessions':nosessions,
}
)
@@ -8892,6 +8926,58 @@ def workout_uploadimage_view(request,id):
else:
return {'result':0}
+# Image upload
+@login_required()
+def course_upload_view(request):
+ is_ajax = False
+ if request.is_ajax():
+ is_ajax = True
+
+ r = getrower(request.user)
+
+ if request.method == 'POST':
+ form = CourseForm(request.POST,request.FILES)
+
+ if form.is_valid():
+ f = form.cleaned_data['file']
+ name = form.cleaned_data['name']
+ notes = form.cleaned_data['notes']
+ if f is not None:
+ filename,path_and_filename = handle_uploaded_file(f)
+
+ polygons = courses.kmltocourse(path_and_filename)
+
+ course = courses.createcourse(r,name,polygons,notes=notes)
+ os.remove(path_and_filename)
+
+ url = reverse(courses_view)
+ if is_ajax:
+ return JSONResponse({'result':1,'url':url})
+ else:
+ return HttpResponseRedirect(url)
+ else:
+ messages.error(request,'Something went wrong - no file attached')
+ url = reverse(course_upload_view)
+
+ if is_ajax:
+ return JSONResponse({'result':0,'url':0})
+ else:
+ return HttpResponseRedirect(url)
+ else:
+ messages.error(request,'Form is not valid')
+ return render(request,'course_form.html',
+ {'form':form,
+ })
+
+ else:
+ if not is_ajax:
+ form = CourseForm()
+ return render(request,'course_form.html',
+ {'form':form,
+ })
+ else:
+ return {'result':0}
+
# Generic chart creation