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

Upload KML Course File

+ {% if form.errors %} +

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

+ {% endif %} + + + {{ form.as_table }} +
+ {% csrf_token %} +
+ +
+
+ + + + +
+
+{% 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 %} +
+ Delete +
+ {% 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 %} -
- {% else %} - - {% endif %}
@@ -116,26 +102,6 @@
- - {% 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