Skip to content

Commit eba657a

Browse files
authored
fix: Use primary address for ballot email from for non ietf-stream docs (ietf-tools#11119)
* fix: Use primary address for ballot email from for non ietf-stream docs * chore: remove unintended whitespace
1 parent ea7406f commit eba657a

5 files changed

Lines changed: 52 additions & 7 deletions

File tree

ietf/doc/tests_draft.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2836,3 +2836,43 @@ def _post_json(self, url, json_to_post):
28362836
]:
28372837
self.assertIn(snippet, response["text"])
28382838

2839+
# Non-IETF stream: from address uses balloter.formatted_email(), not role_email("ad").
2840+
# Give the balloter a chair role (in a different RG) with a distinct email to prove
2841+
# that chair role address is not used; formatted_email() uses the primary email.
2842+
irtf_doc = RgDraftFactory()
2843+
non_ad_balloter = PersonFactory(name="Some Irsgmember")
2844+
other_rg = GroupFactory(type_id="rg")
2845+
chair_role_email = EmailFactory(
2846+
person=non_ad_balloter, address="chair-role@example.com"
2847+
)
2848+
RoleFactory(
2849+
name_id="chair",
2850+
group=other_rg,
2851+
person=non_ad_balloter,
2852+
email=chair_role_email,
2853+
)
2854+
response = _post_json(
2855+
self,
2856+
url,
2857+
{
2858+
"post_data": {
2859+
"discuss": "",
2860+
"comment": "cccccc",
2861+
"position": "yes",
2862+
"balloter": non_ad_balloter.pk,
2863+
"docname": irtf_doc.name,
2864+
"cc_choices": [],
2865+
"additional_cc": "",
2866+
}
2867+
},
2868+
)
2869+
self.assertTrue(response["success"])
2870+
from_line = next(
2871+
line for line in response["text"].split("\n") if line.startswith("From: ")
2872+
)
2873+
# formatted_email() uses the primary email, not the chair role email
2874+
self.assertIn(non_ad_balloter.email().address, from_line)
2875+
self.assertNotIn(chair_role_email.address, from_line)
2876+
for snippet in ["cccccc", non_ad_balloter.plain_name(), irtf_doc.name]:
2877+
self.assertIn(snippet, response["text"])
2878+

ietf/doc/views_ballot.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -425,7 +425,10 @@ def build_position_email_from_dict(pos_dict):
425425
pos=pos_name,
426426
blocking_name=blocking_name,
427427
settings=settings))
428-
frm = balloter.role_email("ad").formatted_email()
428+
if doc.stream_id == "ietf":
429+
frm = balloter.role_email("ad").formatted_email()
430+
else:
431+
frm = balloter.formatted_email()
429432

430433
if doc.stream_id == "irtf":
431434
addrs = gather_address_lists('irsg_ballot_saved',doc=doc)

ietf/nomcom/tests.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,8 +1190,8 @@ def setUp(self):
11901190
today = datetime_today()
11911191
t_minus_3 = today - datetime.timedelta(days=3)
11921192
t_minus_4 = today - datetime.timedelta(days=4)
1193-
e1 = EmailFactory(address="nominee1@example.org", person=PersonFactory(name="Nominee 1"), origin='test')
1194-
e2 = EmailFactory(address="nominee2@example.org", person=PersonFactory(name="Nominee 2"), origin='test')
1193+
e1 = EmailFactory(address="nominee1@example.org", person__name="Nominee 1", origin='test', primary=True)
1194+
e2 = EmailFactory(address="nominee2@example.org", person__name="Nominee 2", origin='test', primary=True)
11951195
n = make_nomineeposition(self.nomcom,e1.person,gen,None)
11961196
np = n.nomineeposition_set.get(position=gen)
11971197
np.time = t_minus_3

ietf/person/factories.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ def default_emails(obj, create, extracted, **kwargs): # pylint: disable=no-self-
9595
extracted = True
9696
if create and extracted:
9797
make_email = getattr(EmailFactory, 'create' if create else 'build')
98-
make_email(person=obj, address=obj.user.email)
98+
make_email(person=obj, address=obj.user.email, primary=True, **kwargs)
9999

100100
@factory.post_generation
101101
def default_photo(obj, create, extracted, **kwargs): # pylint: disable=no-self-argument
@@ -151,7 +151,7 @@ class Meta:
151151
django_get_or_create = ('address',)
152152

153153
address = factory.Sequence(fake_email_address)
154-
person = factory.SubFactory(PersonFactory)
154+
person = factory.SubFactory(PersonFactory, default_emails=False)
155155

156156
active = True
157157
primary = False

ietf/person/tests.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,9 @@ def test_ajax_person_email_json(self):
7878

7979
def test_default_email(self):
8080
person = PersonFactory()
81-
primary = EmailFactory(person=person, primary=True, active=True)
81+
primary = person.email_set.get()
82+
self.assertEqual(primary.primary, True)
83+
self.assertEqual(primary.active, True)
8284
EmailFactory(person=person, primary=False, active=True)
8385
EmailFactory(person=person, primary=False, active=False)
8486
self.assertTrue(primary.address in person.formatted_email())
@@ -358,7 +360,7 @@ def test_get_extra_primary(self):
358360
source = PersonFactory()
359361
target = PersonFactory()
360362
extra = get_extra_primary(source, target)
361-
self.assertTrue(extra == list(source.email_set.filter(primary=True)))
363+
self.assertEqual(set(extra), set(source.email_set.filter(primary=True)))
362364

363365
def test_dedupe_aliases(self):
364366
person = PersonFactory()

0 commit comments

Comments
 (0)