From d6c01d7a486a892552eab634980f5c4f9edad421 Mon Sep 17 00:00:00 2001 From: Ole Laursen Date: Fri, 26 Aug 2011 18:40:36 +0000 Subject: [PATCH] Port one branch of delegate adding and add test for it - Legacy-Id: 3388 --- ietf/wgchairs/forms.py | 73 +++++++++++++++++++++-------------------- ietf/wgchairs/tests.py | 31 +++++++++++++++-- redesign/group/proxy.py | 7 ++-- 3 files changed, 70 insertions(+), 41 deletions(-) diff --git a/ietf/wgchairs/forms.py b/ietf/wgchairs/forms.py index 9373a0873..819deefd1 100644 --- a/ietf/wgchairs/forms.py +++ b/ietf/wgchairs/forms.py @@ -12,9 +12,11 @@ from ietf.ietfworkflows.utils import (get_default_workflow_for_wg, get_workflow_ update_tags, FOLLOWUP_TAG, get_state_by_name) from ietf.ietfworkflows.models import AnnotationTag, State from ietf.idtracker.models import PersonOrOrgInfo +from ietf.utils.mail import send_mail_text from workflows.models import Transition +from redesign.person.models import Person class RelatedWGForm(forms.Form): @@ -191,26 +193,30 @@ class AddDelegateForm(RelatedWGForm): def get_next_form(self): return self.next_form - def get_person(self, email): - persons = PersonOrOrgInfo.objects.filter(emailaddress__address=email).distinct() - if not persons: - raise PersonOrOrgInfo.DoesNotExist - if len(persons) > 1: - raise PersonOrOrgInfo.MultipleObjectsReturned - return persons[0] - def save(self): email = self.cleaned_data.get('email') - try: - person = self.get_person(email) - except PersonOrOrgInfo.DoesNotExist: - self.next_form = NotExistDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) - self.next_form.set_message('doesnotexist', 'There is no user with this email allowed to login to the system') - return - except PersonOrOrgInfo.MultipleObjectsReturned: - self.next_form = MultipleDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) - self.next_form.set_message('multiple', 'There are multiple users with this email in the system') - return + if settings.USE_DB_REDESIGN_PROXY_CLASSES: + try: + person = Person.objects.filter(email__address=email).distinct().get() + except Person.DoesNotExist: + self.next_form = NotExistDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) + self.next_form.set_message('doesnotexist', 'There is no user with this email allowed to login to the system') + return + except Person.MultipleObjectsReturned: + self.next_form = MultipleDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) + self.next_form.set_message('multiple', 'There are multiple users with this email in the system') + return + else: + try: + person = PersonOrOrgInfo.objects.filter(emailaddress__address=email).distinct().get() + except PersonOrOrgInfo.DoesNotExist: + self.next_form = NotExistDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) + self.next_form.set_message('doesnotexist', 'There is no user with this email allowed to login to the system') + return + except PersonOrOrgInfo.MultipleObjectsReturned: + self.next_form = MultipleDelegateForm(wg=self.wg, user=self.user, email=email, shepherd=self.shepherd) + self.next_form.set_message('multiple', 'There are multiple users with this email in the system') + return if self.shepherd: self.assign_shepherd(person) else: @@ -282,12 +288,15 @@ class NotExistDelegateForm(MultipleDelegateForm): info = render_to_string('wgchairs/notexistdelegate.html', {'email_list': email_list, 'shepherd': self.shepherd}) return info + super(NotExistDelegateForm, self).as_p() - def send_email(self, email, template): + def send_email(self, to_email, template): if self.shepherd: subject = 'WG shepherd needs system credentials' else: subject = 'WG Delegate needs system credentials' - persons = PersonOrOrgInfo.objects.filter(emailaddress__address=self.email).distinct() + if settings.USE_DB_REDESIGN_PROXY_CLASSES: + persons = Person.objects.filter(email__address=self.email).distinct() + else: + persons = PersonOrOrgInfo.objects.filter(emailaddress__address=self.email).distinct() body = render_to_string(template, {'chair': get_person_for_user(self.user), 'delegate_email': self.email, @@ -295,20 +304,8 @@ class NotExistDelegateForm(MultipleDelegateForm): 'delegate_persons': persons, 'wg': self.wg, }) - mail = EmailMessage(subject=subject, - body=body, - to=email, - from_email=settings.DEFAULT_FROM_EMAIL) - mail.send() - def send_email_to_delegate(self, email): - self.send_email(email, 'wgchairs/notexistsdelegate_delegate_email.txt') - - def send_email_to_secretariat(self, email): - self.send_email(email, 'wgchairs/notexistsdelegate_secretariat_email.txt') - - def send_email_to_wgchairs(self, email): - self.send_email(email, 'wgchairs/notexistsdelegate_wgchairs_email.txt') + send_mail_text(None, to_email, settings.DEFAULT_FROM_EMAIL, subject, body) def save(self): self.next_form = AddDelegateForm(wg=self.wg, user=self.user) @@ -316,9 +313,13 @@ class NotExistDelegateForm(MultipleDelegateForm): self.next_form.set_message('warning', 'Email was not sent cause tool is in DEBUG mode') else: email_list = self.get_email_list() - self.send_email_to_delegate([email_list[0]]) - self.send_email_to_secretariat([email_list[1]]) - self.send_email_to_wgchairs(email_list[2:]) + # this is ugly... + delegate = email_list[0] + secretariat = email_list[1] + wgchairs = email_list[2:] + self.send_email(delegate, 'wgchairs/notexistsdelegate_delegate_email.txt') + self.send_email(secretariat, 'wgchairs/notexistsdelegate_secretariat_email.txt') + self.send_email(wgchairs, 'wgchairs/notexistsdelegate_wgchairs_email.txt') self.next_form.set_message('success', 'Email sent successfully') diff --git a/ietf/wgchairs/tests.py b/ietf/wgchairs/tests.py index 9f61eb9ef..bc5aba079 100644 --- a/ietf/wgchairs/tests.py +++ b/ietf/wgchairs/tests.py @@ -42,8 +42,35 @@ class ManageDelegatesTestCase(django.test.TestCase): self.assertEquals(len(q('form input[name=delete]')), 0) self.assertEquals(Role.objects.filter(name="delegate", group__acronym="mars").count(), 0) - - + def test_add_not_existing_delegate(self): + make_test_data() + + url = urlreverse('manage_delegates', kwargs=dict(acronym="mars")) + login_testing_unauthorized(self, "secretary", url) + + # get + r = self.client.get(url) + self.assertEquals(r.status_code, 200) + q = PyQuery(r.content) + self.assertEquals(len(q('form input[name=email]')), 1) + + # add non-existing + r = self.client.post(url, + dict(email="unknown@example.com", + form_type="single")) + self.assertEquals(r.status_code, 200) + self.assertTrue("unknown@example.com" in r.content) + q = PyQuery(r.content) + self.assertEquals(len(q('form input[type=submit][value*="Send email"]')), 1) + + # we get back a warning and offer to send email, do that + mailbox_before = len(mail_outbox) + r = self.client.post(url, + dict(email="unknown@example.com", + form_type="notexist")) + self.assertEquals(r.status_code, 200) + self.assertTrue("Email sent" in r.content) + self.assertEquals(len(mail_outbox), mailbox_before + 3) if not settings.USE_DB_REDESIGN_PROXY_CLASSES: diff --git a/redesign/group/proxy.py b/redesign/group/proxy.py index 4f992538c..c746a2b7e 100644 --- a/redesign/group/proxy.py +++ b/redesign/group/proxy.py @@ -1,4 +1,4 @@ -from redesign.proxy_utils import TranslatingManager +from redesign.proxy_utils import TranslatingManager, proxy_role_email from models import * @@ -87,7 +87,7 @@ class Area(Group): def proxied_role_emails(emails): for e in emails: - e.person.email = { 1: e } + proxy_role_email(e) return emails class IETFWG(Group): @@ -203,11 +203,12 @@ class IETFWG(Group): return self.groupurl_set.all().order_by("name") def clean_email_archive(self): return self.list_archive + @property def wgchair_set(self): # gross hack ... class Dummy: pass d = Dummy() - d.all = self.chairs() + d.all = self.chairs return d @property def wgdelegate_set(self):