From cca04b63303447b09401683dbe2ba7636706c4a5 Mon Sep 17 00:00:00 2001
From: Robert Sparks <rjsparks@nostrum.com>
Date: Tue, 22 Oct 2019 18:24:57 +0000
Subject: [PATCH] Correct construction for a reverse URL in an edge case. Fixes
 #2815. Commit ready for merge.  - Legacy-Id: 16907

---
 ietf/nomcom/forms.py |  2 +-
 ietf/nomcom/tests.py | 61 ++++++++++++++++++++++++++------------------
 2 files changed, 37 insertions(+), 26 deletions(-)

diff --git a/ietf/nomcom/forms.py b/ietf/nomcom/forms.py
index b4d3c3287..30ef70176 100644
--- a/ietf/nomcom/forms.py
+++ b/ietf/nomcom/forms.py
@@ -382,7 +382,7 @@ class NominateNewPersonForm(forms.ModelForm):
     def clean_candidate_email(self):
         candidate_email = self.cleaned_data['candidate_email']
         if Email.objects.filter(address=candidate_email).exists():
-            normal_url_name = 'ietf.nomcom.views.%s_nominate' % 'public' if self.public else 'private'
+            normal_url_name = 'ietf.nomcom.views.%s_nominate' % ('public' if self.public else 'private')
             msg = (('%s is already in the datatracker. '
                     'Use the <a href="%s">normal nomination form</a> to nominate the person '
                     'with this address. ') % 
diff --git a/ietf/nomcom/tests.py b/ietf/nomcom/tests.py
index 7b13ee897..be45c0d94 100644
--- a/ietf/nomcom/tests.py
+++ b/ietf/nomcom/tests.py
@@ -584,6 +584,11 @@ class NomcomViewsTest(TestCase):
         return self.nominate_newperson_view(public=False)
         self.client.logout()
 
+    def test_private_nominate_newperson_who_already_exists(self):
+        EmailFactory(address='nominee@example.com')
+        self.access_member_url(self.private_nominate_newperson_url)
+        return self.nominate_newperson_view(public=False)       
+
     def test_public_nominate_with_automatic_questionnaire(self):
         nomcom = get_nomcom_by_year(self.year)
         nomcom.send_questionnaire = True
@@ -715,34 +720,40 @@ class NomcomViewsTest(TestCase):
         if not public:
             test_data['nominator_email'] = nominator_email
 
-        response = self.client.post(nominate_url, test_data,follow=True)
-        self.assertTrue(response.redirect_chain)
-        self.assertEqual(response.status_code, 200)
-        q = PyQuery(response.content)
-        self.assertContains(response, "alert-success")
+        if Email.objects.filter(address=nominee_email).exists():
+            response = self.client.post(nominate_url, test_data,follow=True)
+            self.assertFalse(response.redirect_chain)
+            self.assertEqual(response.status_code, 200)
+            self.assertIn('already in the datatracker',unicontent(response))
+        else:
+            response = self.client.post(nominate_url, test_data,follow=True)
+            self.assertTrue(response.redirect_chain)
+            self.assertEqual(response.status_code, 200)
+            q = PyQuery(response.content)
+            self.assertContains(response, "alert-success")
 
-        # check objects
-        email = Email.objects.get(address=candidate_email)
-        Person.objects.get(name=candidate_name)
-        nominee = Nominee.objects.get(email=email)
-        NomineePosition.objects.get(position=position, nominee=nominee)
-        feedback = Feedback.objects.filter(positions__in=[position],
-                                           nominees__in=[nominee],
-                                           type=FeedbackTypeName.objects.get(slug='nomina')).latest('id')
-        if public:
-            self.assertEqual(feedback.author, nominator_email)
+            # check objects
+            email = Email.objects.get(address=candidate_email)
+            Person.objects.get(name=candidate_name)
+            nominee = Nominee.objects.get(email=email)
+            NomineePosition.objects.get(position=position, nominee=nominee)
+            feedback = Feedback.objects.filter(positions__in=[position],
+                                               nominees__in=[nominee],
+                                               type=FeedbackTypeName.objects.get(slug='nomina')).latest('id')
+            if public:
+                self.assertEqual(feedback.author, nominator_email)
 
-        # to check feedback comments are saved like enrypted data
-        self.assertNotEqual(feedback.comments, comment_text)
+            # to check feedback comments are saved like enrypted data
+            self.assertNotEqual(feedback.comments, comment_text)
 
-        self.assertEqual(check_comments(feedback.comments, comment_text, self.privatekey_file), True)
-        Nomination.objects.get(position=position,
-                               candidate_name=candidate_name,
-                               candidate_email=candidate_email,
-                               candidate_phone=candidate_phone,
-                               nominee=nominee,
-                               comments=feedback,
-                               nominator_email="%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
+            self.assertEqual(check_comments(feedback.comments, comment_text, self.privatekey_file), True)
+            Nomination.objects.get(position=position,
+                                   candidate_name=candidate_name,
+                                   candidate_email=candidate_email,
+                                   candidate_phone=candidate_phone,
+                                   nominee=nominee,
+                                   comments=feedback,
+                                   nominator_email="%s%s" % (COMMUNITY_USER, EMAIL_DOMAIN))
 
     def test_add_questionnaire(self):
         self.access_chair_url(self.add_questionnaire_url)