William Grant has proposed merging lp:~wgrant/launchpad/bug-1169441 into 
lp:launchpad.

Commit message:
Ensure that we create the email address during account reactivation if it 
doesn't already exist.

Requested reviews:
  Launchpad code reviewers (launchpad-reviewers)
Related bugs:
  Bug #1169441 in Launchpad itself: "PersonSet.getOrCreateByOpenIDIdentifier 
fails to set preferredemail when reactivating an account with a new address"
  https://bugs.launchpad.net/launchpad/+bug/1169441

For more details, see:
https://code.launchpad.net/~wgrant/launchpad/bug-1169441/+merge/159086

PersonSet.getOrCreateByOpenIDIdentifier will only create a new EmailAddress as 
part of a new Person. This proves problematic when we're reactivating an 
account using an address that isn't already on the account, as the 
person.setPreferredEmail(email) call does nothing. We end up with an active 
account with no preferredemail, which crashes.
-- 
https://code.launchpad.net/~wgrant/launchpad/bug-1169441/+merge/159086
Your team Launchpad code reviewers is requested to review the proposed merge of 
lp:~wgrant/launchpad/bug-1169441 into lp:launchpad.
=== modified file 'lib/lp/registry/model/person.py'
--- lib/lp/registry/model/person.py	2013-03-12 08:18:57 +0000
+++ lib/lp/registry/model/person.py	2013-04-16 06:56:40 +0000
@@ -3370,6 +3370,9 @@
             elif person.account.status in [AccountStatus.DEACTIVATED,
                                            AccountStatus.NOACCOUNT]:
                 removeSecurityProxy(person.account).reactivate(comment)
+                if email is None:
+                    email = getUtility(IEmailAddressSet).new(
+                        email_address, person)
                 removeSecurityProxy(person).setPreferredEmail(email)
                 db_updated = True
             else:

=== modified file 'lib/lp/registry/tests/test_personset.py'
--- lib/lp/registry/tests/test_personset.py	2013-01-10 06:46:52 +0000
+++ lib/lp/registry/tests/test_personset.py	2013-04-16 06:56:40 +0000
@@ -885,6 +885,20 @@
             u'other-openid-identifier', '[email protected]', 'New Name',
             PersonCreationRationale.UNKNOWN, 'No Comment')
 
+    def testDeactivatedAccount(self):
+        # Logging into a deactivated account with a new email address
+        # reactivates the account, adds that email address, and sets it
+        # as preferred.
+        addr = '[email protected]'
+        self.person.preDeactivate('I hate life.')
+        self.assertEqual(AccountStatus.DEACTIVATED, self.person.account_status)
+        self.assertIs(None, self.person.preferredemail)
+        found, updated = self.person_set.getOrCreateByOpenIDIdentifier(
+            self.identifier.identifier, addr, 'New Name',
+            PersonCreationRationale.UNKNOWN, 'No Comment')
+        self.assertEqual(AccountStatus.ACTIVE, self.person.account_status)
+        self.assertEqual(addr, self.person.preferredemail.email)
+
 
 class TestCreatePersonAndEmail(TestCase):
     """Test `IPersonSet`.createPersonAndEmail()."""

_______________________________________________
Mailing list: https://launchpad.net/~launchpad-reviewers
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~launchpad-reviewers
More help   : https://help.launchpad.net/ListHelp

Reply via email to