From 0f8a9f285b828ba3f1dfdc312bdd4e19e011d52b Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 15 May 2019 15:40:51 +0200 Subject: [PATCH] added freecoach to coach priviliges --- rowers/dataprep.py | 10 ++++++++-- rowers/forms.py | 6 +++--- rowers/models.py | 2 +- rowers/stravastuff.py | 5 ++++- rowers/teams.py | 8 ++++---- .../templates/freecoach_registration_form.html | 2 +- rowers/templates/paidplans.html | 10 ++++++++++ rowers/views/paymentviews.py | 3 +++ rowers/views/statements.py | 2 +- rowers/views/teamviews.py | 16 +++++++++++++--- templates/newbase.html | 2 +- templates/newbasefront.html | 2 +- 12 files changed, 50 insertions(+), 18 deletions(-) diff --git a/rowers/dataprep.py b/rowers/dataprep.py index b8a197f6..a04e0e76 100644 --- a/rowers/dataprep.py +++ b/rowers/dataprep.py @@ -3,6 +3,8 @@ from __future__ import division from __future__ import print_function from __future__ import unicode_literals + + # All the data preparation, data cleaning and data mangling should # be defined here from __future__ import unicode_literals, absolute_import @@ -28,6 +30,7 @@ from pandas import DataFrame, Series from django.utils import timezone from django.utils.timezone import get_current_timezone from django_mailbox.models import Message,Mailbox,MessageAttachment +from django.core.exceptions import ValidationError from time import strftime import arrow @@ -1100,8 +1103,11 @@ def save_workout_database(f2, r, dosmooth=True, workouttype='rower', try: w.save() except ValidationError: - w.startdatetime = timezone.now() - w.save() + try: + w.startdatetime = timezone.now() + w.save() + except ValidationError: + return (0,'Unable to create your workout') if privacy == 'visible': ts = Team.objects.filter(rower=r) diff --git a/rowers/forms.py b/rowers/forms.py index fcc54568..3c3cef2d 100644 --- a/rowers/forms.py +++ b/rowers/forms.py @@ -632,16 +632,16 @@ class RegistrationFormSex(RegistrationFormUniqueEmail): raise forms.ValidationError('Must be at least 16 years old to register') return self.cleaned_data['birthdate'] - sex = forms.ChoiceField(required=True, + sex = forms.ChoiceField(required=False, choices=sexcategories, initial='not specified', label='Sex') weightcategory = forms.ChoiceField(label='Weight Category', - choices=weightcategories) + choices=weightcategories,initial='hwt',required=False) adaptiveclass = forms.ChoiceField(label='Adaptive Classification', - choices=adaptivecategories) + choices=adaptivecategories,initial='None',required=False) # def __init__(self, *args, **kwargs): # self.fields['sex'].initial = 'not specified' diff --git a/rowers/models.py b/rowers/models.py index b44fc6c7..21f3ae10 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -2580,7 +2580,7 @@ class Workout(models.Model): def save(self, *args, **kwargs): user = self.user if self.user.rowerplan == 'freecoach': - raise ValidationError("Free Coach User cannot have any workouts") + raise forms.ValidationError("Free Coach User cannot have any workouts") super(Workout, self).save(*args, **kwargs) diff --git a/rowers/stravastuff.py b/rowers/stravastuff.py index 156e14a3..4a4c8c75 100644 --- a/rowers/stravastuff.py +++ b/rowers/stravastuff.py @@ -701,7 +701,10 @@ def handle_strava_import_stroke_data(title, coords = get_strava_stream(r,'latlng',stravaid) power = get_strava_stream(r,'power',stravaid) - nr_rows = len(t) + if nr_rows is not None: + nr_rows = len(t) + else: + return 0 if nr_rows == 0: return 0 diff --git a/rowers/teams.py b/rowers/teams.py index 3dc3f310..95073998 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -77,7 +77,7 @@ def create_team(name,manager,private='open',notes='',viewing='allmembers'): if manager.rower.rowerplan == 'basic': if manager.rower.protrialexpires < timezone.now().date() and manager.rower.plantrialexpires < timezone.now().date(): return (0,'You need to upgrade to a paid plan to establish a team') - if manager.rower.rowerplan != 'coach': + if manager.rower.rowerplan not in ('coach','freecoach'): ts = Team.objects.filter(manager=manager) if len(ts)>=1: return (0,'You need to upgrade to the Coach plan to have more than one team') @@ -180,7 +180,7 @@ def rower_get_coaches(rower): def coach_getcoachees(coach): - if coach.mycoachgroup and coach.rowerplan == 'coach': + if coach.mycoachgroup and coach.rowerplan in ('coach','freecoach'): return Rower.objects.filter( coachinggroups__in=[coach.mycoachgroup] ).distinct().order_by("user__last_name","user__first_name") @@ -237,7 +237,7 @@ def create_coaching_request(coach,user): while code in codes: code = uuid.uuid4().hex[:10].upper() - if coach.rowerplan == 'coach': + if 'coach' in coach.rowerplan: rekwest = CoachRequest(coach=coach,user=user,code=code) rekwest.save() @@ -316,7 +316,7 @@ def create_coaching_offer(coach,user): while code in codes: code = uuid.uuid4().hex[:10].upper() - if coach.rowerplan == 'coach' and get_coach_club_size(coach) {% if rower.rowerplan == 'coach' %}

COACH ({{ rower.paymenttype }})

+ {% elif rower.rowerplan == 'freecoach' %} +

Free COACH

{% else %}   {% endif %} @@ -298,6 +300,14 @@ can purchase upgrades to "Pro" and "Self-Coach" plans.

+

+ The Coach plans come in two versions: free and paid. On the free coach plan, + you can only have athletes who are on the PRO paid plans or higher, and you + cannot upload any workouts to your own account. On the paid + plans, your athletes can be on the free plan, and you have full access to the + site functionality for your own workouts and those of 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.

diff --git a/rowers/views/paymentviews.py b/rowers/views/paymentviews.py index d1016571..d325c42e 100644 --- a/rowers/views/paymentviews.py +++ b/rowers/views/paymentviews.py @@ -638,6 +638,9 @@ def freecoach_register_view(request): 'next':nextpage,}) else: form = RegistrationFormSex() + form.fields.pop('sex') + form.fields.pop('weightcategory') + form.fields.pop('adaptiveclass') return render(request, "freecoach_registration_form.html", {'form':form, diff --git a/rowers/views/statements.py b/rowers/views/statements.py index 420b560c..20670983 100644 --- a/rowers/views/statements.py +++ b/rowers/views/statements.py @@ -1041,7 +1041,7 @@ def hasplannedsessions(user): r = Rower(user=user) r.save() - result = user.is_authenticated and (r.rowerplan=='coach' or r.rowerplan=='plan') + result = user.is_authenticated and (r.rowerplan=='coach' or r.rowerplan=='freecoach' or r.rowerplan=='plan') if not result and r.plantrialexpires: result = user.is_authenticated and r.plantrialexpires >= datetime.date.today() else: diff --git a/rowers/views/teamviews.py b/rowers/views/teamviews.py index 226316d7..b1c730a4 100644 --- a/rowers/views/teamviews.py +++ b/rowers/views/teamviews.py @@ -200,10 +200,10 @@ def rower_teams_view(request,message='',successmessage=''): coaches = teams.rower_get_coaches(r) - potentialcoaches = [t.manager for t in memberteams if t.manager not in coaches and t.manager.rower.rowerplan == 'coach'] + potentialcoaches = [t.manager for t in memberteams if t.manager not in coaches and 'coach' in t.manager.rower.rowerplan] offercoaches = [ r.user for r in Rower.objects.filter( - offercoaching=True,rowerplan='coach').exclude(user=request.user) + offercoaching=True,rowerplan__in='coach').exclude(user=request.user) ] potentialcoaches = list(set(potentialcoaches+offercoaches)) potentialcoaches = [c for c in potentialcoaches if c.rower not in invitedcoaches+coaches] @@ -218,6 +218,16 @@ def rower_teams_view(request,message='',successmessage=''): user__in=invitedathletes).exclude( user=request.user ).exclude(coachinggroups__in=[request.user.rower.mycoachgroup]) + elif request.user.rower.rowerplan == 'freecoach': + potentialathletes = Rower.objects.filter( + team__in=myteams).exclude( + user__in=invitedathletes).exclude( + user=request.user + ).exclude( + coachinggroups__in=[request.user.rower.mycoachgroup] + ).exclude( + rowerplan__in=['basic','freecoach'] + ) else: potentialathletes = [] @@ -437,7 +447,7 @@ def request_coaching_view(request,coachid): coach = User.objects.get(id=coachid).rower - if coach.rowerplan == 'coach': + if 'coach' in coach.rowerplan: res,text = teams.create_coaching_request(coach,request.user) if res: messages.info(request,text) diff --git a/templates/newbase.html b/templates/newbase.html index 16dffcd2..d3005ba7 100644 --- a/templates/newbase.html +++ b/templates/newbase.html @@ -161,7 +161,7 @@ {% if user.rower.rowerplan == 'pro' %} - {% elif user.rower.rowerplan == 'coach' %} + {% elif 'coach' in user.rower.rowerplan %} {% elif user.rower.rowerplan == 'plan' %} diff --git a/templates/newbasefront.html b/templates/newbasefront.html index 5e761149..f04c6466 100644 --- a/templates/newbasefront.html +++ b/templates/newbasefront.html @@ -169,7 +169,7 @@ {% if user.rower.rowerplan == 'pro' %} - {% elif user.rower.rowerplan == 'coach' %} + {% elif 'coach' in user.rower.rowerplan %} {% elif user.rower.rowerplan == 'plan' %}