From 8f34de8ff0b93f8c74ffada24e5a39237083bafe Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 20 Feb 2019 13:11:33 +0100 Subject: [PATCH 1/6] notification emails for rejected and accepted coaching offers and requests --- rowers/tasks.py | 94 ++++++++++++++++++- rowers/teams.py | 50 +++++++++- rowers/templates/coachofferacceptedemail.html | 21 +++++ rowers/templates/coachofferrejectedemail.html | 14 +++ .../templates/coachrequestacceptedemail.html | 20 ++++ .../templates/coachrequestrejectedemail.html | 14 +++ 6 files changed, 210 insertions(+), 3 deletions(-) create mode 100644 rowers/templates/coachofferacceptedemail.html create mode 100644 rowers/templates/coachofferrejectedemail.html create mode 100644 rowers/templates/coachrequestacceptedemail.html create mode 100644 rowers/templates/coachrequestrejectedemail.html 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..78e51d0a 100644 --- a/rowers/teams.py +++ b/rowers/teams.py @@ -362,8 +362,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 +378,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 +625,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 +646,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 + " " + rekwst.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 + " " + rekwst.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 + " " + rekwst.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 + " " + rekwst.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..33f7e77a --- /dev/null +++ b/rowers/templates/coachofferacceptedemail.html @@ -0,0 +1,21 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ coachname }},

+ +

+ {{ 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..b40d5cd6 --- /dev/null +++ b/rowers/templates/coachofferrejectedemail.html @@ -0,0 +1,14 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ coachname }},

+ +

+ {{ 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..7c19fd04 --- /dev/null +++ b/rowers/templates/coachrequestacceptedemail.html @@ -0,0 +1,20 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ name }},

+ +

+ {{ coachname }} 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..bdc1b3e2 --- /dev/null +++ b/rowers/templates/coachrequestrejectedemail.html @@ -0,0 +1,14 @@ +{% extends "emailbase.html" %} + +{% block body %} +

Dear {{ name }},

+ +

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

+ +

+ Best Regards, the Rowsandall Team +

+{% endblock %} From ee7a83a76b5d226491a6e3b3e55c0981f37917fd Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 20 Feb 2019 20:10:39 +0100 Subject: [PATCH 2/6] error fixes plus new coachoffer attribute --- rowers/models.py | 8 +++++++- rowers/teams.py | 13 +++++++++---- rowers/templates/coachofferacceptedemail.html | 2 +- rowers/templates/coachofferrejectedemail.html | 2 +- .../templates/coachrequestacceptedemail.html | 2 +- .../templates/coachrequestrejectedemail.html | 2 +- rowers/tests/testdata/testdata.csv.gz | Bin 12525 -> 12525 bytes rowers/views/userviews.py | 5 +++++ 8 files changed, 25 insertions(+), 9 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 500c5ad9..97cad63b 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,6 +3196,10 @@ 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') diff --git a/rowers/teams.py b/rowers/teams.py index 78e51d0a..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 @@ -657,7 +662,7 @@ 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 + " " + rekwst.user.last_name + name = rekwest.user.first_name + " " + rekwest.user.last_name res = myqueue(queuehigh, handle_sendemail_coachoffer_rejected, @@ -667,7 +672,7 @@ 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 + " " + rekwst.user.last_name + name = rekwest.user.first_name + " " + rekwest.user.last_name res = myqueue(queuehigh, handle_sendemail_coachrequest_rejected, @@ -677,7 +682,7 @@ 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 + " " + rekwst.user.last_name + name = rekwest.user.first_name + " " + rekwest.user.last_name res = myqueue(queuehigh, handle_sendemail_coachrequest_accepted, @@ -688,7 +693,7 @@ 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 + " " + rekwst.user.last_name + name = rekwest.user.first_name + " " + rekwest.user.last_name res = myqueue(queuehigh, handle_sendemail_coachoffer_accepted, diff --git a/rowers/templates/coachofferacceptedemail.html b/rowers/templates/coachofferacceptedemail.html index 33f7e77a..dbba5cf9 100644 --- a/rowers/templates/coachofferacceptedemail.html +++ b/rowers/templates/coachofferacceptedemail.html @@ -1,7 +1,7 @@ {% extends "emailbase.html" %} {% block body %} -

Dear {{ coachname }},

+

Dear {{ coach }},

{{ name }} has accepted your coaching offer on diff --git a/rowers/templates/coachofferrejectedemail.html b/rowers/templates/coachofferrejectedemail.html index b40d5cd6..786af88d 100644 --- a/rowers/templates/coachofferrejectedemail.html +++ b/rowers/templates/coachofferrejectedemail.html @@ -1,7 +1,7 @@ {% extends "emailbase.html" %} {% block body %} -

Dear {{ coachname }},

+

Dear {{ coach }},

{{ name }} has rejected your offer to become his coach on diff --git a/rowers/templates/coachrequestacceptedemail.html b/rowers/templates/coachrequestacceptedemail.html index 7c19fd04..7a4b8ecc 100644 --- a/rowers/templates/coachrequestacceptedemail.html +++ b/rowers/templates/coachrequestacceptedemail.html @@ -4,7 +4,7 @@

Dear {{ name }},

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

diff --git a/rowers/templates/coachrequestrejectedemail.html b/rowers/templates/coachrequestrejectedemail.html index bdc1b3e2..bf871307 100644 --- a/rowers/templates/coachrequestrejectedemail.html +++ b/rowers/templates/coachrequestrejectedemail.html @@ -4,7 +4,7 @@

Dear {{ name }},

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

diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 530c56cf709e5534284f0cfbadac8e5d8aa8a250..5ba2851fe5d3a6d8bf42ab52726878b5b4523f33 100644 GIT binary patch delta 16 XcmaEx_%@MUzMF%Cby4m{_GbnFIQ9lW delta 16 XcmaEx_%@MUzMF%?KPhJ;`!fRoId=w0 diff --git a/rowers/views/userviews.py b/rowers/views/userviews.py index 45bf65b4..06540e41 100644 --- a/rowers/views/userviews.py +++ b/rowers/views/userviews.py @@ -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 From 1052c61589c81cb302ae07b006106b0b091d16e3 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 20 Feb 2019 20:15:44 +0100 Subject: [PATCH 3/6] offercoaching form works --- rowers/models.py | 17 ----------------- rowers/tests/testdata/testdata.csv.gz | Bin 12525 -> 12525 bytes rowers/views/userviews.py | 2 +- 3 files changed, 1 insertion(+), 18 deletions(-) diff --git a/rowers/models.py b/rowers/models.py index 97cad63b..93dcfa58 100644 --- a/rowers/models.py +++ b/rowers/models.py @@ -3201,23 +3201,6 @@ class AccountRowerForm(ModelForm): 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/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index 5ba2851fe5d3a6d8bf42ab52726878b5b4523f33..f63def677ff45f1d5f50840b33c527433dbdb765 100644 GIT binary patch delta 15 WcmaEx_%@MEzMF$XX!%CA=LP^XD+S~L delta 15 WcmaEx_%@MEzMF%Cb Date: Wed, 20 Feb 2019 20:39:21 +0100 Subject: [PATCH 4/6] team invite form --- rowers/views/teamviews.py | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) 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] From 8219dab1afc1885a0c70ba06ac42e367e9e0cff1 Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 20 Feb 2019 20:49:00 +0100 Subject: [PATCH 5/6] tested --- rowers/tests/testdata/testdata.csv.gz | Bin 12525 -> 12525 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index f63def677ff45f1d5f50840b33c527433dbdb765..b25fbde1ec06acd366ce027a6629823520518922 100644 GIT binary patch delta 15 WcmaEx_%@MEzMF$%$-0ef&kX=Jx(0m! delta 15 WcmaEx_%@MEzMF$XX!%CA=LP^XD+S~L From 916c09776240c925c79e2070cd46314e3df15dbf Mon Sep 17 00:00:00 2001 From: Sander Roosendaal Date: Wed, 20 Feb 2019 20:54:39 +0100 Subject: [PATCH 6/6] tested --- rowers/tests/testdata/testdata.csv.gz | Bin 12525 -> 12525 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/rowers/tests/testdata/testdata.csv.gz b/rowers/tests/testdata/testdata.csv.gz index b25fbde1ec06acd366ce027a6629823520518922..4856af8bcf5a1ca994cd4c0e872bd14395cd928f 100644 GIT binary patch delta 15 WcmaEx_%@MEzMF$Xal=No=LP^XvIYDA delta 15 WcmaEx_%@MEzMF$%$-0ef&kX=Jx(0m!