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

Reply via email to