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(
+ '[email protected]', '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 <[email protected]>',
+ 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(
+ '[email protected]', '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 <[email protected]>',
+ 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
[email protected]
Unsubscribe:
https://mail.python.org/mailman/options/mailman-checkins/archive%40jab.org