diff --git a/rowers/models.py b/rowers/models.py index 74373e98..bed877e9 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 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 %} Compare Workouts {% else %} Compare Workouts @@ -80,7 +80,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 @@

Pro

- {% 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 @@

- {% if user.rower.rowerplan == 'pro' or user.rower.rowerplan == 'coach' %} + {% if user|is_promember %}
Pro Member
{% else %}

 

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); + +
@@ -97,8 +97,8 @@
{% else %}   - {% endif %}
+ {% endif %}
@@ -144,7 +144,7 @@
- +

Summary for {{ theuser.first_name }} {{ theuser.last_name }} @@ -153,9 +153,9 @@

- - {{ the_div|safe }} - + + {{ the_div|safe }} +
{% endblock %} diff --git a/rowers/templates/otwgeeky.html b/rowers/templates/otwgeeky.html index 14699098..aecd9c95 100644 --- a/rowers/templates/otwgeeky.html +++ b/rowers/templates/otwgeeky.html @@ -57,7 +57,7 @@

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

diff --git a/rowers/templates/promembership.html b/rowers/templates/promembership.html index bb89c13d..bd98a21f 100644 --- a/rowers/templates/promembership.html +++ b/rowers/templates/promembership.html @@ -1,7 +1,8 @@ {% extends "base.html" %} - {% block title %}About us{% endblock title %} + {% block title %}Rowsandall Pro Membership{% endblock title %} {% block content %} +{% load rowerfilters %}

Pro Membership

@@ -24,12 +25,21 @@ website.

Your payment will be valid for one year with automatic renewal which you can stop at any time. You will be taken to the secure PayPal payment site.

+{% if user.rower.rowerplan == 'basic' and user.rower.protrialexpires|date_dif == 1 %} +

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

Recurring Payment

You need a Paypal account for this

-
+

{% if user.is_authenticated %} @@ -38,16 +48,16 @@ You will be taken to the secure PayPal payment site. {% endif %} -

+

One Year Subscription

Only a credit card needed. Will not automatically renew

-
+

-

+

Payment Processing

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..aa23fbc8 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'), diff --git a/rowers/views.py b/rowers/views.py index f16dcdae..a056ad00 100644 --- a/rowers/views.py +++ b/rowers/views.py @@ -800,6 +800,8 @@ def ispromember(user): r.save() result = user.is_authenticated() and (r.rowerplan=='pro' or r.rowerplan=='coach' or r.rowerplan=='plan') + if not result and r.protrialexpires: + result = user.is_authenticated() and r.rowerplan=='basic' and r.protrialexpires >= datetime.date.today() else: result = False return result @@ -930,6 +932,33 @@ def sendmail(request): else: return HttpResponseRedirect('/rowers/email/') +@login_required() +def start_trial_view(request): + r = getrower(request.user) + + if r.protrialexpires is not None: + messages.error(request,'You do not qualify for a trial') + url = '/rowers/promembership' + return HttpResponseRedirect(url) + + r.protrialexpires = datetime.date.today()+datetime.timedelta(13) + r.save() + + url = reverse(workouts_view) + + messages.info(request,'We have started your 14 day trial period') + + subject2 = "User started Pro Trial" + message2 = "User Started Pro Trial.\n" + message2 += request.user.email + "\n" + message2 += "User name: "+request.user.username + + send_mail(subject2, message2, + 'Rowsandall Server ', + ['roosendaalsander@gmail.com']) + + return HttpResponseRedirect(url) + # Create workout data from Strava or Concept2 # data and create the associated Workout object and save it def add_workout_from_strokedata(user,importid,data,strokedata, @@ -5060,7 +5089,8 @@ def team_comparison_select(request, theteam = 0 if r.rowerplan == 'basic' and theteam==0: - raise Http404("Not allowed") + if r.protrialexpires is None or r.protrialexpires

@@ -238,6 +241,11 @@ {{ WARNING_MESSAGE }}

{% endif %} + {% if user.rower.protrialexpires and user.rower.protrialexpires|is_future_date %} +

+ {{ user.rower.protrialexpires|date_dif|ddays }} days left in Pro trial +

+ {% endif %} {% if messages %} {% for message in messages %} {% if message.level == DEFAULT_MESSAGE_LEVELS.ERROR %}