diff --git a/rowers/courses.py b/rowers/courses.py index 397cc23a..138cdffa 100644 --- a/rowers/courses.py +++ b/rowers/courses.py @@ -18,6 +18,7 @@ import pandas as pd import numpy as np import dataprep +from rowers.utils import geo_distance ns = {'opengis': 'http://www.opengis.net/kml/2.2'} @@ -25,6 +26,8 @@ ns = {'opengis': 'http://www.opengis.net/kml/2.2'} from rowers.models import ( Rower, Workout, GeoPoint,GeoPolygon, GeoCourse, + course_length,course_coord_center,course_coord_maxmin, + polygon_coord_center ) # low level methods @@ -35,56 +38,6 @@ 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_poly") diff --git a/rowers/models.py b/rowers/models.py index ab4f613f..be015b0c 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -350,6 +350,79 @@ from utils import ( defaultleft,defaultmiddle,landingpages ) +from utils import geo_distance + +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 course_length(course): + polygons = GeoPolygon.objects.filter(course=course).order_by("order_in_course") + + totaldist = 0 + for i in range(len(polygons)-1): + latitude1,longitude1 = polygon_coord_center(polygons[i]) + latitude2,longitude2 = polygon_coord_center(polygons[i+1]) + + dist = geo_distance(latitude1,longitude1, + latitude2,longitude2,) + + totaldist += 1000.*dist[0] + + return int(totaldist) + # Extension of User with rowing specific data class Rower(models.Model): weightcategories = ( @@ -677,7 +750,7 @@ class GeoCourse(models.Model): class GeoCourseEditForm(ModelForm): class Meta: model = GeoCourse - fields = ['name','notes'] + fields = ['name','country','notes'] widgets = { 'notes': forms.Textarea, @@ -941,6 +1014,11 @@ class PlannedSession(models.Model): self.sessionmode = 'distance' self.sessionunit = 'm' self.criterium = 'none' + if self.course == None: + self.course = GeoCourse.objects.all()[0] + self.sessionvalue = course_length(self.course) + elif self.sessiontype != 'coursetest': + self.course = None super(PlannedSession,self).save(*args, **kwargs) @@ -977,8 +1055,7 @@ class PlannedSessionForm(ModelForm): def __init__(self,*args,**kwargs): super(PlannedSessionForm, self).__init__(*args, **kwargs) - if self.instance.sessiontype != 'coursetest': - del self.fields['course'] + self.fields['course'].queryset = GeoCourse.objects.all().order_by("country","name") class PlannedSessionFormSmall(ModelForm): diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index 02dc773b..1a5e42d1 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -336,7 +336,7 @@ def get_dates_timeperiod(timeperiod): elif timeperiod=='nextweek': today = date.today() enddate = today-timezone.timedelta(days=today.weekday())-timezone.timedelta(days=1)+timezone.timedelta(days=7) - startdate = enddate-timezone.timedelta(days=13) + startdate = enddate-timezone.timedelta(days=6) elif timeperiod=='lastmonth': today = date.today() startdate = today.replace(day=1) diff --git a/rowers/templates/planmembership.html b/rowers/templates/planmembership.html index 6a3dc73c..a1814935 100644 --- a/rowers/templates/planmembership.html +++ b/rowers/templates/planmembership.html @@ -7,23 +7,26 @@

Coach and Self-Coach Membership

You have arrived at this page, because you tried to create a - training plan for yourself.

+ training plan for yourself.

-

Currently, training planning is restricted to "coach" members with - "team" functionality.

+

This option is restricted to rowers on our "Self-Coach" plan or + coaches on our "Coach" plan.

-

If you are interested in becoming a coach and planning sessions - for a group of rowers on rowsandall.com, contact me through the contact - form. +

On the "Self-Coach" plan, you can plan your own sessions.

+ +

On the "Coach" plan, you can establish teams, see workouts done by + athletes on your team, and plan individual and group sessions for your + athletes.

If you would like to find a coach who helps you plan your training through rowsandall.com, contact me throught the contact form.

-

For self-coached rowers who would like to add the training planning - functionality, we will soon establish a "Self-Coach" plan, which will enable you to do so.

- + + + +
@@ -34,15 +37,15 @@

+
+
+

Subscriptions

+
+

Recurring Payment

+

You need a Paypal account for this

+

+

+ + + + + +
Plans
Your User Name
+ + + +
+

+

One Year Subscription

+

Only a credit card needed. Will not automatically renew

+ +

+ + + + + +
Plans
Your User Name
+ + + +
+

+
+
+

Payment Processing

+

After you do the payment, we will manually change your membership to + the selected plan. Depending on our availability, this may take some time + (typically one working day). If you upgrade or downgrade, we will stop the recurring payment + for the plan you were on before the change. + Don't hesitate to contact us + if you have any questions at this stage.

+ +

If, for any reason, you are not happy with your membership plan, please let me know through the contact form. I will contact you as soon as possible to discuss how we can make things better.

+
+
{% endblock content %} diff --git a/rowers/templates/plannedsessioncreate.html b/rowers/templates/plannedsessioncreate.html index 4b3830e8..f29b74df 100644 --- a/rowers/templates/plannedsessioncreate.html +++ b/rowers/templates/plannedsessioncreate.html @@ -145,6 +145,10 @@