def find_author(mail):
from_header = clean_header(mail.get('From'))
- (name, email) = (None, None)
+ name, email = (None, None)
# tuple of (regex, fn)
# - where fn returns a (name, email) tuple from the match groups resulting
if name is not None:
name = name.strip()
- save_required = False
try:
person = Person.objects.get(email__iexact=email)
+ if name: # use the latest provided name
+ person.name = name
except Person.DoesNotExist:
person = Person(name=name, email=email)
- save_required = True
- return person, save_required
+ return person
def find_date(mail):
return # nothing to work with
msgid = mail.get('Message-Id').strip()
- author, save_required = find_author(mail)
+ author = find_author(mail)
name, prefixes = clean_subject(mail.get('Subject'), [project.linkname])
x, n = parse_series_marker(prefixes)
refs = find_references(mail)
if diff or pull_url: # patches or pull requests
# we delay the saving until we know we have a patch.
- if save_required:
- author.save()
+ author.save()
delegate = find_delegate(mail)
if not delegate and diff:
is_cover_letter = True
if is_cover_letter:
- if save_required:
- author.save()
+ author.save()
cover_letter = CoverLetter(
msgid=msgid,
if not submission:
return
- # ...and we only save the author if we're saving the comment
- if save_required:
- author.save()
+ author.save()
comment = Comment(
submission=submission,
'Subject: test\n\n' + \
'test'
self.email = message_from_string(mail)
- self.person, _ = find_author(self.email)
+ self.person = find_author(self.email)
self.person.save()
def tearDown(self):
class SenderCorrelationTest(TestCase):
+ """Validate correct behavior of the find_author case.
+
+ Relies of checking the internal state of a Django model object.
+
+ http://stackoverflow.com/a/19379636/613428
+ """
existing_sender = 'Existing Sender <existing@example.com>'
non_existing_sender = 'Non-existing Sender <nonexisting@example.com>'
def setUp(self):
self.existing_sender_mail = self.mail(self.existing_sender)
self.non_existing_sender_mail = self.mail(self.non_existing_sender)
- self.person, _ = find_author(self.existing_sender_mail)
+ self.person = find_author(self.existing_sender_mail)
self.person.save()
- def testExisingSender(self):
- person, save_required = find_author(self.existing_sender_mail)
- self.assertEqual(save_required, False)
+ def testExistingSender(self):
+ person = find_author(self.existing_sender_mail)
+ self.assertEqual(person._state.adding, False)
self.assertEqual(person.id, self.person.id)
- def testNonExisingSender(self):
- person, save_required = find_author(self.non_existing_sender_mail)
- self.assertEqual(save_required, True)
+ def testNonExistingSender(self):
+ person = find_author(self.non_existing_sender_mail)
+ self.assertEqual(person._state.adding, True)
self.assertEqual(person.id, None)
def testExistingDifferentFormat(self):
mail = self.mail('existing@example.com')
- person, save_required = find_author(mail)
- self.assertEqual(save_required, False)
+ person = find_author(mail)
+ self.assertEqual(person._state.adding, False)
self.assertEqual(person.id, self.person.id)
def testExistingDifferentCase(self):
mail = self.mail(self.existing_sender.upper())
- person, save_required = find_author(mail)
- self.assertEqual(save_required, False)
+ person = find_author(mail)
+ self.assertEqual(person._state.adding, False)
self.assertEqual(person.id, self.person.id)
def tearDown(self):