Mark Sapiro pushed to branch master at GNU Mailman / Mailman Core
Commits: bbba16eb by Mark Sapiro at 2018-03-02T01:02:06Z Fixed an AttributeError in mailman/handlers/decorate.py when member.subscriber is an ``IUser`` instance rather than an ``IAddress`` instance. - - - - - 7aba1621 by Mark Sapiro at 2018-03-02T02:22:40Z Merge branch 'decorate' into 'master' Fixed an AttributeError in mailman/handlers/decorate.py Closes #449 See merge request mailman/mailman!357 - - - - - 3 changed files: - src/mailman/docs/NEWS.rst - src/mailman/handlers/decorate.py - src/mailman/handlers/tests/test_decorate.py Changes: ===================================== src/mailman/docs/NEWS.rst ===================================== --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -55,6 +55,9 @@ Bugs * Messages with ``Subject`` headers encoded in an unknown character set no longer throw ``LookupError`` in subject prefixing. (Closes #445) * A list's ``last_post_at`` is now properly updated. (Closes #453) +* Fixed an AttributeError in mailman/handlers/decorate.py when + member.subscriber is an ``IUser`` instance rather than an ``IAddress`` + instance. (Closes #449) Command line ------------ ===================================== src/mailman/handlers/decorate.py ===================================== --- a/src/mailman/handlers/decorate.py +++ b/src/mailman/handlers/decorate.py @@ -46,11 +46,18 @@ def process(mlist, msg, msgdata): member = msgdata.get('member') if member is not None: # Calculate the extra personalization dictionary. - recipient = msgdata.get('recipient', member.address.original_email) + # member.subscriber can be a User instance or an Address instance, and + # member.address can be None and so can member._user.preferred_address. + if member._address is not None: + _address = member._address + else: + _address = (member._user.preferred_address or + list(member._user.addresses)[0]) + recipient = msgdata.get('recipient', _address.original_email) d['member'] = formataddr( - (member.subscriber.display_name, member.subscriber.email)) + (_address.display_name, _address.email)) d['user_email'] = recipient - d['user_delivered_to'] = member.address.original_email + d['user_delivered_to'] = _address.original_email d['user_language'] = member.preferred_language.description d['user_name'] = member.display_name # For backward compatibility. ===================================== src/mailman/handlers/tests/test_decorate.py ===================================== --- a/src/mailman/handlers/tests/test_decorate.py +++ b/src/mailman/handlers/tests/test_decorate.py @@ -24,7 +24,11 @@ from mailman.app.lifecycle import create_list from mailman.config import config from mailman.handlers import decorate from mailman.interfaces.archiver import IArchiver +from mailman.interfaces.member import MemberRole from mailman.interfaces.template import ITemplateManager +from mailman.interfaces.usermanager import IUserManager +from mailman.model.member import Member +from mailman.model.preferences import Preferences from mailman.testing.helpers import ( LogFileMark, specialized_message_from_string as mfs) from mailman.testing.layers import ConfigLayer @@ -95,6 +99,44 @@ This is a test message. self.assertIn('http://example.com/link_to_message', self._msg.as_string()) + def test_decorate_member_as_address(self): + site_dir = os.path.join(config.TEMPLATE_DIR, 'site', 'en') + os.makedirs(site_dir) + footer_path = os.path.join(site_dir, 'myfooter.txt') + with open(footer_path, 'w', encoding='utf-8') as fp: + print('$member', file=fp) + getUtility(ITemplateManager).set( + 'list:member:regular:footer', None, 'mailman:///myfooter.txt') + self._mlist.preferred_language = 'en' + address = getUtility(IUserManager).create_address( + 'aper...@example.com', 'Anne Person') + member = Member(MemberRole.member, self._mlist.list_id, address) + member.preferences = Preferences() + member.preferences.preferred_language = 'en' + msgdata = dict(member=member) + decorate.process(self._mlist, self._msg, msgdata) + self.assertIn('Anne Person <aper...@example.com>', + self._msg.as_string()) + + def test_decorate_member_as_user(self): + site_dir = os.path.join(config.TEMPLATE_DIR, 'site', 'en') + os.makedirs(site_dir) + footer_path = os.path.join(site_dir, 'myfooter.txt') + with open(footer_path, 'w', encoding='utf-8') as fp: + print('$member', file=fp) + getUtility(ITemplateManager).set( + 'list:member:regular:footer', None, 'mailman:///myfooter.txt') + self._mlist.preferred_language = 'en' + user = getUtility(IUserManager).make_user( + 'aper...@example.com', 'Anne Person') + member = Member(MemberRole.member, self._mlist.list_id, user) + member.preferences = Preferences() + member.preferences.preferred_language = 'en' + msgdata = dict(member=member) + decorate.process(self._mlist, self._msg, msgdata) + self.assertIn('Anne Person <aper...@example.com>', + self._msg.as_string()) + def test_list_id_allowed_in_template_uri(self): # Issue #196 - allow the list_id in the template uri expansion. list_dir = os.path.join( View it on GitLab: https://gitlab.com/mailman/mailman/compare/5bff9c43469eaa29ca26ccce1fca3662a8601c0f...7aba162101e35fd4c5dabcdc5f07b3b341445e66 --- View it on GitLab: https://gitlab.com/mailman/mailman/compare/5bff9c43469eaa29ca26ccce1fca3662a8601c0f...7aba162101e35fd4c5dabcdc5f07b3b341445e66 You're receiving this email because of your account on gitlab.com.
_______________________________________________ Mailman-checkins mailing list Mailman-checkins@python.org Unsubscribe: https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org