diff --git a/rowers/dataprep.py b/rowers/dataprep.py index 9c891dd9..e738b735 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -2226,11 +2226,11 @@ def workout_trimp(workout): return trimp def workout_rscore(w): - r = workout.user - df,row = getrowdata_db(id=workout.id) + r = w.user + df,row = getrowdata_db(id=w.id) df = clean_df_stats(df) if df.empty: - df,row = getrowdata_db(id=workout.id) + df,row = getrowdata_db(id=w.id) df = clean_df_stats(df,workstrokesonly=False) duration = df['time'].max()-df['time'].min() diff --git a/rowers/forms.py b/rowers/forms.py index faa5d108..b6191619 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 +from rowers.models import Workout,Rower,Team from rowers.rows import validate_file_extension,must_be_csv,validate_image_extension from django.contrib.auth.forms import UserCreationForm from django.contrib.auth.models import User @@ -629,3 +629,26 @@ class WorkoutSessionSelectForm(forms.Form): widget = forms.CheckboxSelectMultiple, ) +class PlannedSessionTeamForm(forms.Form): + team = forms.ModelMultipleChoiceField( + queryset=Team.objects.all(), + required=False, + widget=forms.CheckboxSelectMultiple()) + + def __init__(self, user, *args, **kwargs): + super(PlannedSessionTeamForm,self).__init__(*args, **kwargs) + + self.fields['team'].queryset = Team.objects.filter(manager=user) + + +class PlannedSessionTeamMemberForm(forms.Form): + members = forms.ModelMultipleChoiceField( + queryset=Rower.objects.all(), + widget=forms.CheckboxSelectMultiple()) + + def __init__(self, thesession, *args, **kwargs): + super(PlannedSessionTeamMemberForm,self).__init__(*args,**kwargs) + + self.fields['members'].queryset = thesession.rower.all() + + diff --git a/rowers/models.py b/rowers/models.py index 74373e98..60dbce2e 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -502,6 +502,8 @@ class Rower(models.Model): planexpires = models.DateField(default=timezone.now) teamplanexpires = models.DateField(default=timezone.now) clubsize = models.IntegerField(default=0) + protrialexpires = models.DateField(blank=True,null=True) + plantrialexpires = models.DateField(blank=True,null=True) # Friends/Team @@ -521,8 +523,11 @@ class Rower(models.Model): verbose_name='Show Notes for Favorite Charts') def __str__(self): - return self.user.username + return self.user.firstname+' '+self.user.last_name + def __unicode__(self): + return self.user.first_name+' '+self.user.last_name + def clean_email(self): return self.user.email.lower() diff --git a/rowers/plannedsessions.py b/rowers/plannedsessions.py index caca9821..1f9c708d 100644 --- a/rowers/plannedsessions.py +++ b/rowers/plannedsessions.py @@ -215,8 +215,19 @@ def get_sessions(r,startdate=date.today(), rower__in=[r], startdate__lte=enddate, enddate__gte=startdate, - ).order_by("startdate","enddate") + ).order_by("startdate","enddate") + + return sps +def get_sessions_manager(manager,startdate=date.today(), + enddate=date.today()+timezone.timedelta(+1000)): + + sps = PlannedSession.objects.filter( + manager=manager, + startdate__lte=enddate, + enddate__gte=startdate, + ).order_by("startdate","enddate").exclude(team__isnull=True) + return sps def get_workouts_session(r,ps): diff --git a/rowers/templates/advancededit.html b/rowers/templates/advancededit.html index be762e3d..e8a7e2e0 100644 --- a/rowers/templates/advancededit.html +++ b/rowers/templates/advancededit.html @@ -60,7 +60,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Edit Intervals {% else %} Edit Intervals @@ -97,7 +97,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Dist Metrics Plot {% else %} Dist Metrics Plot @@ -109,7 +109,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Time Metrics Plot {% else %} Time Metrics Plot @@ -121,7 +121,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Power Histogram {% else %} Power Histogram @@ -135,7 +135,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Glue {% else %} Glue @@ -148,7 +148,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Sensor Fusion {% else %} Sensor Fusion @@ -160,7 +160,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Split Workout {% else %} Split Workout diff --git a/rowers/templates/advancedotw.html b/rowers/templates/advancedotw.html index e6ace0a9..f22a9a44 100644 --- a/rowers/templates/advancedotw.html +++ b/rowers/templates/advancedotw.html @@ -56,7 +56,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Compare Workouts {% else %} Compare Workouts @@ -78,7 +78,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Edit Intervals {% else %} Edit Intervals @@ -95,7 +95,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} CrewNerd Summary {% else %} CrewNerd Summary @@ -109,7 +109,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Stroke Profile (Empower) {% else %} Stroke Profile (Empower) @@ -122,7 +122,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} OTW Power Plot {% else %} OTW Power Plot @@ -142,7 +142,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Geeky Stuff {% else %} Geeky Stuff @@ -157,7 +157,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Smooth out Pace Data {% else %} Smooth out Pace Data @@ -174,7 +174,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Raw Data {% else %} Reset Smoothing @@ -189,7 +189,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Glue {% else %} Glue @@ -201,7 +201,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Sensor Fusion {% else %} Sensor Fusion @@ -213,7 +213,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Split Workout {% else %} Split Workout diff --git a/rowers/templates/analysis.html b/rowers/templates/analysis.html index 6f7a3531..da1726ee 100644 --- a/rowers/templates/analysis.html +++ b/rowers/templates/analysis.html @@ -41,7 +41,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Power Histogram {% else %} Power Histogram @@ -53,7 +53,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Statistics {% else %} Statistics @@ -65,7 +65,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Box Chart {% else %} Box Chart @@ -90,7 +90,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} OTW Critical Power {% else %} OTW Critical Power @@ -102,7 +102,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Multi Compare {% else %} Multi Compare @@ -114,7 +114,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Trend Flex {% else %} Trend Flex @@ -128,7 +128,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} OTE Critical Power {% else %} OTE Critical Power diff --git a/rowers/templates/bases.html b/rowers/templates/bases.html index 8daf8b52..6b242cf2 100644 --- a/rowers/templates/bases.html +++ b/rowers/templates/bases.html @@ -1,3 +1,4 @@ +{% load rowerfilters %}
@@ -19,7 +20,7 @@Free Data and Analysis. For Rowers. By Rowers.
diff --git a/rowers/templates/histo.html b/rowers/templates/histo.html index 95980f07..5de2516b 100644 --- a/rowers/templates/histo.html +++ b/rowers/templates/histo.html @@ -56,24 +56,24 @@ {{ interactiveplot |safe }} - + // Set things up to resize the plot on a window resize. You can play with + // the arguments of resize_width_height() to change the plot's behavior. + var plot_resize_setup = function () { + var plotid = Object.keys(Bokeh.index)[0]; // assume we have just one plot + var plot = Bokeh.index[plotid]; + var plotresizer = function() { + // arguments: use width, use height, maintain aspect ratio + plot.resize_width_height(true, false, false); + }; + window.addEventListener('resize', plotresizer); + plotresizer(); + }; + window.addEventListener('load', plot_resize_setup); + +
Summary for {{ theuser.first_name }} {{ theuser.last_name }} @@ -153,9 +153,9 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Edit Wind Data {% else %} Edit Wind Data @@ -70,7 +70,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Edit Stream Data {% else %} Edit Stream Data @@ -83,7 +83,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} OTW Power {% else %} OTW Power @@ -100,7 +100,7 @@
- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %} Corrected Pace Plot {% else %} Corrected Pace Plot diff --git a/rowers/templates/planmembership.html b/rowers/templates/planmembership.html index 55d599e8..6a3dc73c 100644 --- a/rowers/templates/planmembership.html +++ b/rowers/templates/planmembership.html @@ -1,6 +1,6 @@ {% extends "base.html" %} - {% block title %}About us{% endblock title %} + {% block title %}Rowsandall Plan Membership{% endblock title %} {% block content %}
| Date | +Time | +Name | +Type | +Distance | +Duration | +Avg HR | +Max HR | +|||
|---|---|---|---|---|---|---|---|---|---|---|
| {{ workout.date|date:"Y-m-d" }} | +{{ workout.starttime|date:"H:i" }} | + {% if workout.user.user == user or user == team.manager %} + {% if workout.name != '' %} ++ + {{ workout.name }} + + | + {% else %} ++ No Name + | + {% endif %} + {% else %} + {% if workout.name != '' %} +{{ workout.name }} | + {% else %} +No Name | + {% endif %} + {% endif %} +{{ workout.workouttype }} | +{{ workout.distance }}m | +{{ workout.duration |durationprint:"%H:%M:%S.%f" }} | +{{ workout.averagehr }} | +{{ workout.maxhr }} | +
Select one session on the left, and one or more workouts on the right to match the workouts to the session. For tests and training sessions, @@ -92,8 +92,6 @@ {% csrf_token %}
{% if timeperiod and rower %} Add Session @@ -32,3 +32,15 @@ {% endif %}
+ You qualify for a 14 day free trial. No credit card needed. + Try out Pro membership for two weeks. Click the button below to + sign up for the trial. After your trial period expires, you will be + automatically reset to the Basic plan, unless you upgrade to Pro. +
+ +{% endif %}You need a Paypal account for this
- +Only a credit card needed. Will not automatically renew
- +After you do the payment, we will manually change your membership to
diff --git a/rowers/templatetags/rowerfilters.py b/rowers/templatetags/rowerfilters.py
index 8661e00f..bfdf2751 100644
--- a/rowers/templatetags/rowerfilters.py
+++ b/rowers/templatetags/rowerfilters.py
@@ -3,7 +3,7 @@ from django.utils.safestring import mark_safe
from time import strftime
import dateutil.parser
import json
-
+import datetime
register = template.Library()
def strfdelta(tdelta):
@@ -41,6 +41,10 @@ def secondstotimestring(tdelta):
return res
+@register.filter
+def ddays(ddelta):
+ return ddelta.days+1
+
@register.filter
def spacetohtml(t):
return t.replace(" ","%20")
@@ -107,6 +111,11 @@ def get_field_id(id,s,form):
from rowers.models import Rower,Team
+from rowers.views import ispromember
+@register.filter
+def is_promember(user):
+ return ispromember(user)
+
@register.filter
def is_manager(user):
r = Rower.objects.get(user=user)
@@ -183,3 +192,25 @@ def verbosetimeperiod(timeperiod):
return verbose
+from datetime import date
+
+@ register.filter
+def future_date_only(the_date):
+ if the_date > date.today():
+ return the_date
+ else:
+ return None
+
+
+@register.filter
+def is_future_date(the_date):
+ return the_date >= date.today()
+
+@register.filter
+def date_dif(the_date):
+ if the_date:
+ return the_date - date.today()
+ else:
+ return 1
+
+
diff --git a/rowers/urls.py b/rowers/urls.py
index 2d42ea30..d502a7d2 100644
--- a/rowers/urls.py
+++ b/rowers/urls.py
@@ -382,6 +382,7 @@ urlpatterns = [
url(r'^videos', TemplateView.as_view(template_name='videos.html'),name='videos'),
url(r'^analysis', TemplateView.as_view(template_name='analysis.html'),name='analysis'),
url(r'^promembership', TemplateView.as_view(template_name='promembership.html'),name='promembership'),
+ url(r'^starttrial$',views.start_trial_view),
url(r'^planmembership', TemplateView.as_view(template_name='planmembership.html'),name='planmembership'),
url(r'^paypaltest', TemplateView.as_view(template_name='paypaltest.html'),name='paypaltest'),
url(r'^legal', TemplateView.as_view(template_name='legal.html'),name='legal'),
@@ -397,6 +398,18 @@ urlpatterns = [
url(r'^workout/compare/(?P