diff --git a/rowers/models.py b/rowers/models.py index 500c5ad9..93dcfa58 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -706,6 +706,7 @@ class Rower(models.Model): clubsize = models.IntegerField(default=0) protrialexpires = models.DateField(default=datetime.date(1970,1,1)) plantrialexpires = models.DateField(default=datetime.date(1970,1,1)) + offercoaching = models.BooleanField(default=False, verbose_name='Offer Remote Coaching') # Privacy Data @@ -3186,7 +3187,8 @@ class AccountRowerForm(ModelForm): 'getemailnotifications', 'getimportantemails', 'defaulttimezone','showfavoritechartnotes', - 'defaultlandingpage'] + 'defaultlandingpage', + 'offercoaching'] widgets = { 'birthdate': SelectDateWidget( @@ -3194,24 +3196,11 @@ class AccountRowerForm(ModelForm): timezone.now().year-100,timezone.now().year-10)), } + def __init__(self, *args, **kwargs): + super(AccountRowerForm, self).__init__(*args, **kwargs) + if self.instance.rowerplan != 'coach': + self.fields.pop('offercoaching') - def clean_email(self): - email = self.cleaned_data.get('email') - - try: - validate_email(email) - except ValidationError: - raise forms.ValidationError( - 'Please enter a valid email address') - - try: - match = User.objects.get(email__iexact=email) - if self.instance.user == match: - return email - except User.DoesNotExist: - return email - - raise forms.ValidationError('This email address is not allowed') diff --git a/rowers/tasks.py b/rowers/tasks.py index fefe1b29..cbf98d8d 100644 --- a/rowers/tasks.py +++ b/rowers/tasks.py @@ -1725,6 +1725,98 @@ def handle_sendemail_coachrequest(email,name,code,coachname, return 1 +@app.task +def handle_sendemail_coachoffer_rejected(coachemail,coachname,name, + debug=False,**kwargs): + + fullemail = coachemail + subject = '{n} has rejected your offer to be his coach on rowsandall.com'.format(n=name) + from_email = 'Rowsandall ' + siteurl = SITE_URL + if debug: + siteurl = SITE_URL_DEV + + d = { + 'name':name, + 'coach':coachname, + 'siteurl':siteurl, + } + + res = send_template_email(from_email,[fullemail], + subject,'coachofferrejectedemail.html', + d, + **kwargs) + return 1 + +@app.task +def handle_sendemail_coachrequest_rejected(email,coachname,name, + debug=False,**kwargs): + + fullemail = email + subject = '{n} has rejected your coaching request on rowsandall.com'.format(n=coachname) + from_email = 'Rowsandall ' + siteurl = SITE_URL + if debug: + siteurl = SITE_URL_DEV + + d = { + 'name':name, + 'coach':coachname, + 'siteurl':siteurl, + } + + res = send_template_email(from_email,[fullemail], + subject,'coachrequestrejectedemail.html', + d, + **kwargs) + return 1 + +@app.task +def handle_sendemail_coachrequest_accepted(email,coachname,name, + debug=False,**kwargs): + + fullemail = email + subject = '{n} has accepted your coaching request on rowsandall.com'.format(n=coachname) + from_email = 'Rowsandall ' + siteurl = SITE_URL + if debug: + siteurl = SITE_URL_DEV + + d = { + 'name':name, + 'coach':coachname, + 'siteurl':siteurl, + } + + res = send_template_email(from_email,[fullemail], + subject,'coachrequestacceptedmail.html', + d, + **kwargs) + return 1 + +@app.task +def handle_sendemail_coachoffer_accepted(coachemail,coachname,name, + debug=False,**kwargs): + + fullemail = coachemail + subject = '{n} has accepted your coaching offer on rowsandall.com'.format(n=name) + from_email = 'Rowsandall ' + siteurl = SITE_URL + if debug: + siteurl = SITE_URL_DEV + + d = { + 'name':name, + 'coach':coachname, + 'siteurl':siteurl, + } + + res = send_template_email(from_email,[fullemail], + subject,'coachofferacceptedemail.html', + d, + **kwargs) + return 1 + @app.task def handle_sendemail_coacheerequest(email,name,code,coachname, debug=False,**kwargs): @@ -1743,8 +1835,6 @@ def handle_sendemail_coacheerequest(email,name,code,coachname, 'siteurl':siteurl } - form_email = 'Rowsandall ' - res = send_template_email(from_email,[fullemail], subject,'coacheerequestemail.html',d, **kwargs) diff --git a/rowers/teams.py b/rowers/teams.py index 25500897..7f0e01a6 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -1,3 +1,4 @@ + # All the Team related methods # Python @@ -28,6 +29,10 @@ from rowers.tasks import ( handle_sendemail_request_reject,handle_sendemail_invite_reject, handle_sendemail_invite_accept,handle_sendemail_team_removed, handle_sendemail_coachrequest,handle_sendemail_coacheerequest, + handle_sendemail_coachoffer_rejected, + handle_sendemail_coachoffer_accepted, + handle_sendemail_coachrequest_rejected, + handle_sendemail_coachrequest_accepted, ) from rowers.models import ValidationError @@ -362,8 +367,10 @@ def reject_revoke_coach_offer(user,id): if rekwest.coach.user == user: rekwest.delete() + return (1,'Request removed') elif rekwest.user == user: + send_coachoffer_rejected_email(rekwest) rekwest.delete() return (1,'Request removed') else: @@ -376,6 +383,7 @@ def reject_revoke_coach_request(user,id): return (0,'The request is invalid') if rekwest.coach.user == user: + send_coachrequest_rejected_email(rekwest) rekwest.delete() return (1,'Request rejected') elif rekwest.user == user: @@ -622,6 +630,8 @@ def process_coachrequest_code(coach,code): result = add_coach(coach,rekwest.user.rower) if not result: return (result,"Something went wrong") + else: + send_coachrequest_accepted_email(rekwest) rekwest.delete() @@ -641,9 +651,52 @@ def process_coachoffer_code(user,code): result = add_coach(rekwest.coach,rekwest.user.rower) if not result: return (result,"Something went wrong") - + else: + send_coachoffer_accepted_email(rekwest) + rekwest.delete() return result +def send_coachoffer_rejected_email(rekwest): + coachname = rekwest.coach.user.first_name + " " + rekwest.coach.user.last_name + coachemail = rekwest.coach.user.email + + name = rekwest.user.first_name + " " + rekwest.user.last_name + + res = myqueue(queuehigh, + handle_sendemail_coachoffer_rejected, + coachemail,coachname,name) + +def send_coachrequest_rejected_email(rekwest): + coachname = rekwest.coach.user.first_name + " " + rekwest.coach.user.last_name + email = rekwest.user.email + + name = rekwest.user.first_name + " " + rekwest.user.last_name + + res = myqueue(queuehigh, + handle_sendemail_coachrequest_rejected, + email,coachname,name) + +def send_coachrequest_accepted_email(rekwest): + coachname = rekwest.coach.user.first_name + " " + rekwest.coach.user.last_name + email = rekwest.user.email + + name = rekwest.user.first_name + " " + rekwest.user.last_name + + res = myqueue(queuehigh, + handle_sendemail_coachrequest_accepted, + email,coachname,name) + + +def send_coachoffer_accepted_email(rekwest): + coachname = rekwest.coach.user.first_name + " " + rekwest.coach.user.last_name + coachemail = rekwest.coach.user.email + + name = rekwest.user.first_name + " " + rekwest.user.last_name + + res = myqueue(queuehigh, + handle_sendemail_coachoffer_accepted, + coachemail,coachname,name) + diff --git a/rowers/templates/coachofferacceptedemail.html b/rowers/templates/coachofferacceptedemail.html new file mode 100644 index 00000000..dbba5cf9 --- /dev/null +++ b/rowers/templates/coachofferacceptedemail.html @@ -0,0 +1,21 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ coach }},

+ +

+ {{ name }} has accepted your coaching offer on + rowsandall.com +

+ +

+ Until you remove {{ name }} from your list of athletes, {{ name }}, + you + will be able to upload workouts on behalf of {{ name }}, run analysis for + and change power and heart rate zone settings for {{ name }}. +

+ +

+ Best Regards, the Rowsandall Team +

+{% endblock %} diff --git a/rowers/templates/coachofferrejectedemail.html b/rowers/templates/coachofferrejectedemail.html new file mode 100644 index 00000000..786af88d --- /dev/null +++ b/rowers/templates/coachofferrejectedemail.html @@ -0,0 +1,14 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ coach }},

+ +

+ {{ name }} has rejected your offer to become his coach on + rowsandall.com +

+ +

+ Best Regards, the Rowsandall Team +

+{% endblock %} diff --git a/rowers/templates/coachrequestacceptedemail.html b/rowers/templates/coachrequestacceptedemail.html new file mode 100644 index 00000000..7a4b8ecc --- /dev/null +++ b/rowers/templates/coachrequestacceptedemail.html @@ -0,0 +1,20 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ name }},

+ +

+ {{ coach }} has accepted your coaching request on + rowsandall.com +

+ +

+ Until you remove {{ coachname }} from your list of coaches, {{ coachname }} + will be able to upload workouts on your behalf, run analysis for you + and change your power and heart rate zone settings. +

+ +

+ Best Regards, the Rowsandall Team +

+{% endblock %} diff --git a/rowers/templates/coachrequestrejectedemail.html b/rowers/templates/coachrequestrejectedemail.html new file mode 100644 index 00000000..bf871307 --- /dev/null +++ b/rowers/templates/coachrequestrejectedemail.html @@ -0,0 +1,14 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ name }},

+ +

+ {{ coach }} has rejected your coaching request on + rowsandall.com +

+ +

+ Best Regards, the Rowsandall Team +

+{% endblock %} diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 530c56cf..4856af8b 100644 Binary files a/rowers/tests/testdata/testdata.csv.gz and b/rowers/tests/testdata/testdata.csv.gz differ diff --git a/rowers/views/teamviews.py b/rowers/views/teamviews.py index 2c393f85..224a2ef7 100644 --- a/rowers/views/teamviews.py +++ b/rowers/views/teamviews.py @@ -16,10 +16,16 @@ def team_view(request,id=0,userid=0): except Team.DoesNotExist: raise Http404("Team doesn't exist") + q = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct().exclude(rower__team__name=t.name) + mygroups = [request.user.rower.mycoachgroup] + q2 = User.objects.filter(rower__isnull=False,rower__coachinggroups__in=mygroups).distinct().exclude(rower__team__name=t.name) + + q = q | q2 if request.method == 'POST' and request.user == t.manager: inviteform = TeamInviteForm(request.POST) - inviteform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct().exclude(rower__team__name=t.name) + + inviteform.fields['user'].queryset = q if inviteform.is_valid(): cd = inviteform.cleaned_data newmember = cd['user'] @@ -37,7 +43,7 @@ def team_view(request,id=0,userid=0): elif request.user == t.manager: inviteform = TeamInviteForm() - inviteform.fields['user'].queryset = User.objects.filter(rower__isnull=False,rower__team__in=myteams).distinct().exclude(rower__team__name=t.name) + inviteform.fields['user'].queryset = q else: inviteform = '' @@ -186,9 +192,13 @@ def rower_teams_view(request,message='',successmessage=''): invitedcoaches = [rekwest.coach for rekwest in mycoachrequests] coaches = teams.rower_get_coaches(r) - print coaches,'aap' potentialcoaches = [t.manager for t in memberteams if t.manager not in coaches and t.manager.rower.rowerplan == 'coach'] + offercoaches = [ + r.user for r in Rower.objects.filter( + offercoaching=True,rowerplan='coach').exclude(user=request.user) + ] + potentialcoaches = list(set(potentialcoaches+offercoaches)) potentialcoaches = [c for c in potentialcoaches if c.rower not in invitedcoaches+coaches] diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index 45bf65b4..c80e7ab8 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -178,7 +178,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): if request.method == 'POST': - accountform = AccountRowerForm(request.POST) + accountform = AccountRowerForm(request.POST, instance=r) userform = UserForm(request.POST,instance=r.user) if accountform.is_valid() and userform.is_valid(): @@ -190,6 +190,10 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): last_name = ucd['last_name'] email = ucd['email'] sex = cd['sex'] + try: + offercoaching = cd['offercoaching'] + except KeyError: + offercoaching = False adaptiveclass = cd['adaptiveclass'] defaultlandingpage = cd['defaultlandingpage'] weightcategory = cd['weightcategory'] @@ -217,6 +221,7 @@ def rower_edit_view(request,rowerid=0,userid=0,message=""): r.adaptiveclass = adaptiveclass r.getemailnotifications = getemailnotifications r.getimportantemails = getimportantemails + r.offercoaching = offercoaching r.defaultlandingpage = defaultlandingpage r.showfavoritechartnotes = showfavoritechartnotes r.sex = sex