[damned-lies] Notify users when role changed or removed from team



commit 51df419d2521c1c6b483cb54ca1ca34bb4fdc6f1
Author: Claude Paroz <claude 2xlibre net>
Date:   Wed Aug 17 15:55:36 2016 +0200

    Notify users when role changed or removed from team
    
    Fixes bug #770033.

 people/forms.py |    2 +-
 teams/forms.py  |   36 ++++++++++++++++++++++++++++++++++++
 teams/tests.py  |   29 +++++++++++++++++++++++++++++
 teams/views.py  |   13 +------------
 4 files changed, 67 insertions(+), 13 deletions(-)
---
diff --git a/people/forms.py b/people/forms.py
index e95e481..76c580e 100644
--- a/people/forms.py
+++ b/people/forms.py
@@ -4,6 +4,7 @@ import hashlib, random
 from django import forms
 from django.conf import settings
 from django.contrib.sites.shortcuts import get_current_site
+from django.core.mail import send_mail
 from django.core.urlresolvers import reverse
 from django.utils.encoding import force_bytes
 from django.utils.translation import ugettext_lazy, ugettext as _
@@ -76,7 +77,6 @@ class RegistrationForm(forms.Form):
         new_user.is_active = False
         new_user.save()
         # Send activation email
-        from django.core.mail import send_mail
         current_site = get_current_site(request)
         subject = settings.EMAIL_SUBJECT_PREFIX + _(u'Account activation')
         message = _(u"This is a confirmation that your registration on %s succeeded. To activate your 
account, please click on the link below or copy and paste it in a browser.") % current_site.name
diff --git a/teams/forms.py b/teams/forms.py
index 27ceec2..c4fdaa7 100644
--- a/teams/forms.py
+++ b/teams/forms.py
@@ -1,5 +1,8 @@
 # -*- coding: utf-8 -*-
 from django import forms
+from django.conf import settings
+from django.contrib.sites.shortcuts import get_current_site
+from django.core.mail import send_mail
 from django.utils.translation import ugettext as _
 
 from common.utils import is_site_admin
@@ -50,6 +53,7 @@ class EditTeamDetailsForm(forms.ModelForm):
                 new_coord.role = 'coordinator'
                 new_coord.save()
 
+
 class EditMemberRoleForm(forms.Form):
 
     def __init__(self, roles, *args, **kwargs):
@@ -69,3 +73,35 @@ class EditMemberRoleForm(forms.Form):
         for key, field in self.fields.items():
             if key not in ('form_type',):
                 yield self[key]
+
+    def save(self, request):
+        current_site = get_current_site(request)
+        for key, field in self.fields.items():
+            form_value = self.cleaned_data[key]
+            if field.initial != form_value:
+                role = Role.objects.get(pk=key)
+                if form_value == "remove":
+                    team = role.team.description
+                    email = role.person.email
+                    role.delete()
+                    subject = settings.EMAIL_SUBJECT_PREFIX + ' ' + _('Removed from team')
+                    message = _("You have been removed from the %(team)s team on %(site)s") % {
+                        'team': team,
+                        'site': current_site,
+                    }
+                    message += "\n\n" + _("This is an automatic message sent from %(site)s. Please do not 
answer.") % {'site': current_site}
+                    send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [email])
+                elif form_value == "inactivate":
+                    role.is_active = False
+                    role.save()
+                else:
+                    role.role = form_value
+                    role.save()
+                    subject = settings.EMAIL_SUBJECT_PREFIX + ' ' + _('Role changed')
+                    message = _("Your role in the %(team)s team on %(site)s has been set to '%(role)s'") % {
+                        'team': role.team.description,
+                        'site': current_site,
+                        'role': role.get_role_display(),
+                    }
+                    message += "\n\n" + _("This is an automatic message sent from %(site)s. Please do not 
answer.") % {'site': current_site}
+                    send_mail(subject, message, settings.DEFAULT_FROM_EMAIL, [role.person.email])
diff --git a/teams/tests.py b/teams/tests.py
index 57de6fb..7f76dfa 100644
--- a/teams/tests.py
+++ b/teams/tests.py
@@ -167,6 +167,35 @@ class TeamTest(TeamsAndRolesTests):
         team = Team.objects.get(name='fr')
         self.assertEqual(team.webpage_url, "http://www.gnomefr.org/";)
 
+    def test_edit_team_roles(self):
+        team_url = reverse('team_slug', args = ['fr'])
+        # Login as team coordinator
+        response = self.client.post('/login/',
+            {'username': self.pcoo.username, 'password': 'password'})
+        # Team member role modification
+        response = self.client.post(team_url, {
+            'form_type': 'reviewer',
+            '%d' % Role.objects.get(team=self.t, person=self.pr).pk: 'committer',
+        })
+        self.assertEqual(len(mail.outbox), 1)
+        self.assertIn('Role changed', mail.outbox[0].subject)
+        self.assertIn(
+            "Your role in the French team on example.com has been set to 'Committer'",
+            mail.outbox[0].body
+        )
+        mail.outbox = []
+        # Team member removal
+        response = self.client.post(team_url, {
+            'form_type': 'translator',
+            '%d' % Role.objects.get(team=self.t, person=self.pt).pk: 'remove',
+        })
+        self.assertEqual(len(mail.outbox), 1)
+        self.assertIn('Removed from team', mail.outbox[0].subject)
+        self.assertIn(
+            "You have been removed from the French team on example.com",
+            mail.outbox[0].body
+        )
+
     def test_send_mail_to_coordinator(self):
         self.t.send_mail_to_coordinator(subject="foo", message="bar")
         self.assertEqual(len(mail.outbox), 1)
diff --git a/teams/views.py b/teams/views.py
index 1a15eab..aa67bd7 100644
--- a/teams/views.py
+++ b/teams/views.py
@@ -87,18 +87,7 @@ def team(request, team_slug):
             roles = Role.objects.filter(team=team, role=form_type, is_active=True)
             form = EditMemberRoleForm(roles, request.POST)
             if form.is_valid():
-                for key, field in form.fields.items():
-                    form_value = form.cleaned_data[key]
-                    if field.initial != form_value:
-                        role = Role.objects.get(pk=key)
-                        if form_value == "remove":
-                            role.delete()
-                        elif form_value == "inactivate":
-                            role.is_active = False
-                            role.save()
-                        else:
-                            role.role = form_value
-                            role.save()
+                form.save(request)
         # Create forms for template
         commit_roles = Role.objects.filter(team=team, role='committer', is_active=True)
         if commit_roles:


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]