~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/soyuz/adapters/notification.py

[r=adeuring][bug=817106] Make notification emails cope with UTF8 in
        the message.

Show diffs side-by-side

added added

removed removed

Lines of Context:
13
13
 
14
14
from email.mime.multipart import MIMEMultipart
15
15
from email.mime.text import MIMEText
 
16
from email.utils import formataddr
16
17
import os
17
18
 
18
19
from zope.component import getUtility
218
219
        body = assemble_body(
219
220
            blamer, spr, bprs, archive, distroseries, summarystring, changes,
220
221
            action)
 
222
        body = body.encode("utf8")
221
223
        send_mail(
222
224
            spr, archive, recipients, subject, body, dry_run,
223
225
            changesfile_content=changesfile_content,
226
228
 
227
229
    build_and_send_mail(action, recipients)
228
230
 
229
 
    (changesfile, date, from_addr, maintainer) = fetch_information(
230
 
        spr, bprs, changes)
 
231
    info = fetch_information(spr, bprs, changes)
 
232
    from_addr = info['changedby']
231
233
    if announce_from_person is not None:
232
234
        email = announce_from_person.preferredemail
233
235
        if email:
261
263
    """Assemble the e-mail notification body."""
262
264
    if changes is None:
263
265
        changes = {}
264
 
    (changesfile, date, changedby, maintainer) = fetch_information(
265
 
        spr, bprs, changes)
 
266
    info = fetch_information(spr, bprs, changes)
266
267
    information = {
267
268
        'STATUS': ACTION_DESCRIPTIONS[action],
268
269
        'SUMMARY': summary,
269
 
        'DATE': 'Date: %s' % date,
270
 
        'CHANGESFILE': changesfile,
 
270
        'DATE': 'Date: %s' % info['date'],
 
271
        'CHANGESFILE': info['changesfile'],
271
272
        'DISTRO': distroseries.distribution.title,
272
273
        'ANNOUNCE': 'No announcement sent',
273
274
        'CHANGEDBY': '',
279
280
        }
280
281
    if spr:
281
282
        information['SPR_URL'] = canonical_url(spr)
282
 
    if changedby:
283
 
        information['CHANGEDBY'] = '\nChanged-By: %s' % changedby
 
283
    changedby_displayname = info['changedby_displayname']
 
284
    if changedby_displayname:
 
285
        information['CHANGEDBY'] = '\nChanged-By: %s' % changedby_displayname
284
286
    origin = changes.get('Origin')
285
287
    if origin:
286
288
        information['ORIGIN'] = '\nOrigin: %s' % origin
291
293
        information['ANNOUNCE'] = "Announcing to %s" % (
292
294
            distroseries.changeslist)
293
295
    try:
294
 
        changedby_person = email_to_person(changedby)
 
296
        changedby_person = email_to_person(info['changedby'])
295
297
    except ParseMaintError:
296
298
        # Some syncs (e.g. from Debian) will involve packages whose
297
299
        # changed-by person was auto-created in LP and hence does not
299
301
        changedby_person = None
300
302
    if blamer is not None and blamer != changedby_person:
301
303
        signer_signature = person_to_email(blamer)
302
 
        if signer_signature != changedby:
 
304
        if signer_signature != info['changedby']:
303
305
            information['SIGNER'] = '\nSigned-By: %s' % signer_signature
304
306
    # Add maintainer if present and different from changed-by.
 
307
    maintainer = info['maintainer']
 
308
    changedby = info['changedby']
305
309
    if maintainer and maintainer != changedby:
306
310
        information['MAINTAINER'] = '\nMaintainer: %s' % maintainer
307
311
    return get_template(archive, action) % information
443
447
    """Return a list of recipients for notification emails."""
444
448
    candidate_recipients = []
445
449
    debug(logger, "Building recipients list.")
446
 
    (changesfile, date, changedby, maint) = fetch_information(
447
 
        spr, bprs, changes)
 
450
    info = fetch_information(spr, bprs, changes)
448
451
 
449
 
    if changedby:
 
452
    if info['changedby']:
450
453
        try:
451
 
            changer = email_to_person(changedby)
 
454
            changer = email_to_person(info['changedby'])
452
455
        except ParseMaintError:
453
456
            changer = None
454
457
    else:
455
458
        changer = None
456
459
 
457
 
    if maint:
 
460
    if info['maintainer']:
458
461
        try:
459
 
            maintainer = email_to_person(maint)
 
462
            maintainer = email_to_person(info['maintainer'])
460
463
        except ParseMaintError:
461
464
            maintainer = None
462
465
    else:
567
570
 
568
571
def person_to_email(person):
569
572
    """Return a string of full name <e-mail address> given an IPerson."""
 
573
    # This will use email.Header to encode any unicode.
570
574
    if person and person.preferredemail:
571
575
        return format_address_for_person(person)
572
576
 
590
594
 
591
595
def fetch_information(spr, bprs, changes):
592
596
    changedby = None
 
597
    changedby_displayname = None
593
598
    maintainer = None
 
599
    maintainer_displayname = None
 
600
 
594
601
    if changes:
595
602
        changesfile = ChangesFile.formatChangesComment(
596
603
            sanitize_string(changes.get('Changes')))
597
604
        date = changes.get('Date')
598
605
        changedby = sanitize_string(changes.get('Changed-By'))
599
606
        maintainer = sanitize_string(changes.get('Maintainer'))
 
607
        changedby_displayname = changedby
 
608
        maintainer_displayname = maintainer
600
609
    elif spr or bprs:
601
610
        if not spr and bprs:
602
611
            spr = bprs[0].build.source_package_release
604
613
        date = spr.dateuploaded
605
614
        changedby = person_to_email(spr.creator)
606
615
        maintainer = person_to_email(spr.maintainer)
 
616
        if changedby:
 
617
            addr = formataddr((spr.creator.displayname,
 
618
                               spr.creator.preferredemail.email))
 
619
            changedby_displayname = sanitize_string(addr)
 
620
        if maintainer:
 
621
            addr = formataddr((spr.maintainer.displayname,
 
622
                               spr.maintainer.preferredemail.email))
 
623
            maintainer_displayname = sanitize_string(addr)
607
624
    else:
608
625
        changesfile = date = None
609
 
    return (changesfile, date, changedby, maintainer)
 
626
 
 
627
    return {
 
628
        'changesfile': changesfile,
 
629
        'date': date,
 
630
        'changedby': changedby,
 
631
        'changedby_displayname': changedby_displayname,
 
632
        'maintainer': maintainer,
 
633
        'maintainer_displayname': maintainer_displayname,
 
634
        }
610
635
 
611
636
 
612
637
class LanguagePackEncountered(Exception):