]> git.ozlabs.org Git - patchwork/commitdiff
Defer Person creation/linkage until registration is confirmed
authorJeremy Kerr <jk@ozlabs.org>
Tue, 22 Apr 2014 12:48:19 +0000 (20:48 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 22 Apr 2014 13:05:47 +0000 (21:05 +0800)
We currently create Person objects when a registration is submitted, not
when it is confirmed. This can lead to stale Person objects for
unconfirmed registrations.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
apps/patchwork/models.py
apps/patchwork/tests/registration.py
apps/patchwork/tests/user.py
apps/patchwork/tests/utils.py
apps/patchwork/views/user.py

index 7371d8fcd1b65ca15887ce5c2f783ad73b648225..9de2a22d7e3fca857b53420fa597b781fd5b1bfb 100644 (file)
@@ -112,18 +112,6 @@ class UserProfile(models.Model):
                          .values('pk').query)
         return qs
 
-    def save(self):
-        super(UserProfile, self).save()
-        people = Person.objects.filter(email = self.user.email)
-        if not people:
-            person = Person(email = self.user.email,
-                    name = self.name(), user = self.user)
-            person.save()
-        else:
-            for person in people:
-                 person.link_to_user(self.user)
-                 person.save()
-
     def __unicode__(self):
         return self.name()
 
index 08ed66acc1620f5b6760b8546bb228f9c3d869cd..845b60b152576ab809a160f1172e5b5c315b9b32 100644 (file)
@@ -155,12 +155,15 @@ class RegistrationConfirmationTest(TestCase):
         self.assertEqual(EmailConfirmation.objects.count(), 0)
         response = self.client.post('/register/', self.default_data)
         self.assertEquals(response.status_code, 200)
+        self.assertFalse(Person.objects.exists())
 
         # confirm
         conf = EmailConfirmation.objects.filter()[0]
         response = self.client.get(_confirmation_url(conf))
         self.assertEquals(response.status_code, 200)
 
+        qs = Person.objects.filter(email = self.user.email)
+        self.assertTrue(qs.exists())
         person = Person.objects.get(email = self.user.email)
 
         self.assertEquals(person.name,
@@ -188,3 +191,20 @@ class RegistrationConfirmationTest(TestCase):
 
         self.assertEquals(person.name, fullname)
 
+    def testRegistrationExistingPersonUnmodified(self):
+        """ Check that an unconfirmed registration can't modify an existing
+            Person object"""
+
+        fullname = self.user.firstname + ' '  + self.user.lastname
+        person = Person(name = fullname, email = self.user.email)
+        person.save()
+
+        # register
+        data = self.default_data.copy()
+        data['first_name'] = 'invalid'
+        data['last_name'] = 'invalid'
+        self.assertEquals(data['email'], person.email)
+        response = self.client.post('/register/', data)
+        self.assertEquals(response.status_code, 200)
+
+        self.assertEquals(Person.objects.get(pk = person.pk).name, fullname)
index d35eacd18226fca3981fe4f48d124d590a1eeb55..08b9fa5791e948f81bd9464ffe0d75d3d9873d51 100644 (file)
@@ -105,12 +105,12 @@ class UserPersonConfirmTest(TestCase):
         self.conf.save()
 
     def testUserPersonConfirm(self):
-        self.assertEquals(Person.objects.count(), 1)
+        self.assertEquals(Person.objects.count(), 0)
         response = self.client.get(_confirmation_url(self.conf))
         self.assertEquals(response.status_code, 200)
 
         # check that the Person object has been created and linked
-        self.assertEquals(Person.objects.count(), 2)
+        self.assertEquals(Person.objects.count(), 1)
         person = Person.objects.get(email = self.user.secondary_email)
         self.assertEquals(person.email, self.user.secondary_email)
         self.assertEquals(person.user, self.user.user)
index d4708aa590fb22c673d617c12f6c040177669f98..ec6a9ce366c85b79eea2f0e86278359a022ed4f1 100644 (file)
@@ -71,6 +71,9 @@ def create_user():
     user = User.objects.create_user(userid, email, userid)
     user.save()
 
+    person = Person(email = email, name = userid, user = user)
+    person.save()
+
     return user
 
 def create_maintainer(project):
index 4a0e8458721ed62013310cc6475e4f760f7135a8..a9d6c4c67f8bc0abf45a0c26ea042fd5cc6aae80 100644 (file)
@@ -82,6 +82,14 @@ def register_confirm(request, conf):
     conf.user.is_active = True
     conf.user.save()
     conf.deactivate()
+    try:
+        person = Person.objects.get(email__iexact = conf.user.email)
+    except Person.DoesNotExist:
+        person = Person(email = conf.user.email,
+                name = conf.user.get_profile().name())
+    person.user = conf.user
+    person.save()
+
     return render_to_response('patchwork/registration-confirm.html')
 
 @login_required