diff --git a/rowers/courses.py b/rowers/courses.py index 34a7b379..25a23d11 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -14,6 +14,8 @@ from utils import myqueue from matplotlib import path import xml.etree.ElementTree as et +import pandas as pd + ns = {'opengis': 'http://www.opengis.net/kml/2.2'} import django_rq @@ -34,8 +36,59 @@ class InvalidTrajectoryError(Exception): def __str__(self): return repr(self.value) +def polygon_coord_center(polygon): + + points = GeoPoint.objects.filter(polygon=polygon).order_by("order_in_poly") + + latitudes = pd.Series([p.latitude for p in points]) + longitudes = pd.Series([p.longitude for p in points]) + + return latitudes.mean(), longitudes.mean() + +def course_coord_center(course): + + polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") + + latitudes = [] + longitudes = [] + + for p in polygons: + latitude,longitude = polygon_coord_center(p) + latitudes.append(latitude) + longitudes.append(longitude) + + latitude = pd.Series(latitudes).median() + longitude = pd.Series(longitudes).median() + + coordinates = pd.DataFrame({ + 'latitude':latitudes, + 'longitude':longitudes, + }) + + return latitude,longitude,coordinates + +def course_coord_maxmin(course): + + polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") + + latitudes = [] + longitudes = [] + + for p in polygons: + latitude,longitude = polygon_coord_center(p) + latitudes.append(latitude) + longitudes.append(longitude) + + lat_min = pd.Series(latitudes).min() + lat_max = pd.Series(latitudes).max() + long_min = pd.Series(longitudes).min() + long_max = pd.Series(longitudes).max() + + + return lat_min,lat_max,long_min,long_max + def polygon_to_path(polygon): - points = GeoPoint.objects.filter(polygon==polygon).order_by(order_in_polygon) + points = GeoPoint.objects.filter(polygon==polygon).order_by("order_in_polygon") s = [] for point in points: s.append([point.latitude,point.longitude]) diff --git a/rowers/interactiveplots.py b/rowers/interactiveplots.py index cbe08d1e..9ec4834e 100644 --- a/rowers/interactiveplots.py +++ b/rowers/interactiveplots.py @@ -1,5 +1,8 @@ import colorsys -from rowers.models import Workout, User, Rower, WorkoutForm,RowerForm,GraphImage +from rowers.models import ( + Workout, User, Rower, WorkoutForm,RowerForm, + GraphImage,GeoPolygon,GeoCourse,GeoPoint + ) from rowingdata import rower as rrower from rowingdata import main as rmain from rowingdata import cumcpdata,histodata @@ -35,6 +38,10 @@ from bokeh.core.properties import value from collections import OrderedDict from django.conf import settings +from courses import ( + course_coord_center,course_coord_maxmin, + ) + import datetime import math import numpy as np @@ -707,6 +714,124 @@ def interactive_histoall(theworkouts): script, div = components(plot) return [script,div] +def course_map(course): + latmean,lonmean,coordinates = course_coord_center(course) + lat_min, lat_max, long_min, long_max = course_coord_maxmin(course) + + scoordinates = "[" + + for index,row in coordinates.iterrows(): + scoordinates += """[{x},{y}], + """.format( + x=row['latitude'], + y=row['longitude'] + ) + + scoordinates +="]" + + polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") + + + pcoordinates = """[ + """ + + for p in polygons: + pcoordinates += """[ + [""" + + points = GeoPoint.objects.filter(polygon=p).order_by("order_in_poly") + + for pt in points: + pcoordinates += "[{x},{y}],".format( + x = pt.latitude, + y = pt.longitude + ) + + # remove last comma + pcoordinates = pcoordinates[:-1] + pcoordinates += """] + ], + """ + + pcoordinates += """ + ]""" + + + print pcoordinates + + script = """ + + """.format( + latmean=latmean, + lonmean=lonmean, + scoordinates=scoordinates, + pcoordinates=pcoordinates + ) + + div = """ +

 

+ """ + + return script,div def leaflet_chart(lat,lon,name=""): if lat.empty or lon.empty: diff --git a/rowers/templates/.#workout_view.html b/rowers/templates/.#workout_view.html new file mode 100644 index 00000000..e5eeb942 --- /dev/null +++ b/rowers/templates/.#workout_view.html @@ -0,0 +1 @@ +E408191@CZ27LT9RCGN72.9092:1519040360 \ No newline at end of file diff --git a/rowers/templates/course_view.html b/rowers/templates/course_view.html new file mode 100644 index 00000000..68884203 --- /dev/null +++ b/rowers/templates/course_view.html @@ -0,0 +1,24 @@ +{% 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 %} +
+ + +

{{ course.name }}

+ + {{ mapdiv|safe }} + + + {{ mapscript|safe }} + + +
+ +{% endblock %} diff --git a/rowers/templates/list_courses.html b/rowers/templates/list_courses.html index 4f9db35e..54795b69 100644 --- a/rowers/templates/list_courses.html +++ b/rowers/templates/list_courses.html @@ -32,8 +32,14 @@ {% for course in courses %} - {{ course.country }} - {{ course.name }} + {{ course.country }} + + {% if course.manager.user == user %} + {{ course.name }} + {% else %} + {{ course.name }} + {% endif %} + diff --git a/rowers/urls.py b/rowers/urls.py index e980ffd8..21a12f56 100644 --- a/rowers/urls.py +++ b/rowers/urls.py @@ -485,6 +485,8 @@ urlpatterns = [ url(r'^sessions/rower/(?P\d+)$',views.plannedsessions_view), url(r'^sessions/(?P[\w\ ]+.*)/rower/(?P\d+)$',views.plannedsessions_view), url(r'^sessions/(?P[\w\ ]+.*)$',views.plannedsessions_view), + url(r'^courses/(?P\d+)/edit$',views.course_edit_view, + name='course_edit_view'), ] if settings.DEBUG: diff --git a/rowers/views.py b/rowers/views.py index 432dd9c8..fdc9fd43 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -8404,7 +8404,25 @@ def workout_comment_view(request,id=0): 'comments':comments, 'form':form, }) - + +@login_required() +def course_edit_view(request,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, 'course_view.html', + { + 'course':course, + 'mapscript':script, + 'mapdiv':div, + } + ) + # The basic edit page @login_required()