summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Mailman/database/listmanager.py2
-rw-r--r--Mailman/database/model/member.py5
-rw-r--r--Mailman/database/model/pending.py22
-rw-r--r--Mailman/database/model/roster.py16
-rw-r--r--Mailman/docs/decorate.txt42
-rw-r--r--Mailman/docs/digests.txt20
-rw-r--r--Mailman/docs/file-recips.txt6
-rw-r--r--Mailman/docs/filtering.txt4
-rw-r--r--Mailman/docs/lifecycle.txt36
-rw-r--r--Mailman/docs/membership.txt72
-rw-r--r--Mailman/docs/registration.txt6
-rw-r--r--Mailman/docs/reply-to.txt44
12 files changed, 146 insertions, 129 deletions
diff --git a/Mailman/database/listmanager.py b/Mailman/database/listmanager.py
index cd1f03fe2..eb1ce6ba2 100644
--- a/Mailman/database/listmanager.py
+++ b/Mailman/database/listmanager.py
@@ -46,7 +46,7 @@ class ListManager(object):
return mlist
def delete(self, mlist):
- mlist.delete()
+ config.db.store.remove(mlist)
def get(self, fqdn_listname):
# Avoid circular imports.
diff --git a/Mailman/database/model/member.py b/Mailman/database/model/member.py
index 0a852f991..3f9775d3c 100644
--- a/Mailman/database/model/member.py
+++ b/Mailman/database/model/member.py
@@ -19,6 +19,7 @@ from storm.locals import *
from zope.interface import implements
from Mailman.Utils import split_listname
+from Mailman.configuration import config
from Mailman.constants import SystemDefaultPreferences
from Mailman.database import Model
from Mailman.database.types import Enum
@@ -90,5 +91,5 @@ class Member(Model):
return 'http://example.com/' + self.address.address
def unsubscribe(self):
- self.preferences.delete()
- self.delete()
+ config.db.store.remove(self.preferences)
+ config.db.store.remove(self)
diff --git a/Mailman/database/model/pending.py b/Mailman/database/model/pending.py
index 058b5de09..970e3c16e 100644
--- a/Mailman/database/model/pending.py
+++ b/Mailman/database/model/pending.py
@@ -38,6 +38,10 @@ class PendedKeyValue(Model):
implements(IPendedKeyValue)
+ def __init__(self, key, value):
+ self.key = key
+ self.value = value
+
id = Int(primary=True)
key = Unicode()
value = Unicode()
@@ -48,10 +52,14 @@ class Pended(Model):
implements(IPended)
+ def __init__(self, token, expiration_date):
+ self.token = token
+ self.expiration_date = expiration_date
+
id = Int(primary=True)
- token = Unicode()
+ token = RawStr()
expiration_date = DateTime()
- key_values = Reference(id, PendedKeyValue.id)
+ key_values = ReferenceSet(id, PendedKeyValue.id)
@@ -83,7 +91,7 @@ class Pendings(object):
token = hashlib.sha1(repr(x)).hexdigest()
# In practice, we'll never get a duplicate, but we'll be anal
# about checking anyway.
- if Pended.query.filter_by(token=token).count() == 0:
+ if config.db.store.find(Pended, token=token).count() == 0:
break
else:
raise AssertionError('Could not find a valid pendings token')
@@ -92,7 +100,13 @@ class Pendings(object):
token=token,
expiration_date=datetime.datetime.now() + lifetime)
for key, value in pendable.items():
- PendedKeyValue(key=key, value=value, pended=pending)
+ if isinstance(key, str):
+ key = unicode(key, 'utf-8')
+ if isinstance(value, str):
+ value = unicode(value, 'utf-8')
+ keyval = PendedKeyValue(key=key, value=value)
+ pending.key_values.add(keyval)
+ config.db.store.add(pending)
return token
def confirm(self, token, expunge=True):
diff --git a/Mailman/database/model/roster.py b/Mailman/database/model/roster.py
index 0c8c3bd87..55723893d 100644
--- a/Mailman/database/model/roster.py
+++ b/Mailman/database/model/roster.py
@@ -133,12 +133,13 @@ class AdministratorRoster(AbstractRoster):
yield member
def get_member(self, address):
- results = Member.query.filter(
- and_(Member.c.mailing_list == self._mlist.fqdn_listname,
- or_(Member.c.role == MemberRole.moderator,
- Member.c.role == MemberRole.owner),
- Address.c.address == address,
- Member.c.address_id == Address.c.id))
+ results = config.db.store.find(
+ Member,
+ Member.mailing_list == self._mlist.fqdn_listname,
+ Or(Member.role == MemberRole.moderator,
+ Member.role == MemberRole.owner),
+ Address.address == address,
+ Member.address_id == Address.id)
if results.count() == 0:
return None
elif results.count() == 1:
@@ -202,6 +203,7 @@ class Subscribers(AbstractRoster):
@property
def members(self):
- for member in Member.query.filter_by(
+ for member in config.db.store.find(
+ Member,
mailing_list=self._mlist.fqdn_listname):
yield member
diff --git a/Mailman/docs/decorate.txt b/Mailman/docs/decorate.txt
index df4d76451..6f05c6982 100644
--- a/Mailman/docs/decorate.txt
+++ b/Mailman/docs/decorate.txt
@@ -7,7 +7,7 @@ of the mailing list and the type of message being processed.
>>> from Mailman.Handlers.Decorate import process
>>> from Mailman.configuration import config
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
>>> msg_text = """\
... From: aperson@example.org
...
@@ -46,9 +46,9 @@ placeholder variables, the message's payload will be prepended by the verbatim
header, and appended with the verbatim footer.
>>> msg = message_from_string(msg_text)
- >>> mlist.msg_header = 'header\n'
- >>> mlist.msg_footer = 'footer'
- >>> mlist.preferred_language = 'en'
+ >>> mlist.msg_header = u'header\n'
+ >>> mlist.msg_footer = u'footer'
+ >>> mlist.preferred_language = u'en'
>>> process(mlist, msg, {})
>>> print msg.as_string()
From: aperson@example.org
@@ -64,9 +64,9 @@ data. An example of such information is the mailing list's "real name" (a
short descriptive name for the mailing list).
>>> msg = message_from_string(msg_text)
- >>> mlist.msg_header = '$real_name header\n'
- >>> mlist.msg_footer = '$real_name footer'
- >>> mlist.real_name = 'XTest'
+ >>> mlist.msg_header = u'$real_name header\n'
+ >>> mlist.msg_footer = u'$real_name footer'
+ >>> mlist.real_name = u'XTest'
>>> process(mlist, msg, {})
>>> print msg.as_string()
From: aperson@example.org
@@ -79,8 +79,8 @@ You can't just pick any interpolation variable though; if you do, the variable
will remain in the header or footer unchanged.
>>> msg = message_from_string(msg_text)
- >>> mlist.msg_header = '$dummy header\n'
- >>> mlist.msg_footer = '$dummy footer'
+ >>> mlist.msg_header = u'$dummy header\n'
+ >>> mlist.msg_footer = u'$dummy footer'
>>> process(mlist, msg, {})
>>> print msg.as_string()
From: aperson@example.org
@@ -103,9 +103,9 @@ When Mailman sees text/plain messages with such RFC 3676 parameters, it
preserves these parameters when it concatenates headers and footers to the
message payload.
- >>> mlist.msg_header = 'header'
- >>> mlist.msg_footer = 'footer'
- >>> mlist.preferred_language = 'en'
+ >>> mlist.msg_header = u'header'
+ >>> mlist.msg_footer = u'footer'
+ >>> mlist.preferred_language = u'en'
>>> msg = message_from_string("""\
... From: aperson@example.org
... Content-Type: text/plain; format=flowed; delsp=no
@@ -132,9 +132,9 @@ set, Mailman will still try to concatenate the header and footer, but it will
convert the text to utf-8 and base-64 encode the message payload.
# 'ja' = Japanese; charset = 'euc-jp'
- >>> mlist.preferred_language = 'ja'
- >>> mlist.msg_header = '$description header'
- >>> mlist.msg_footer = '$description footer'
+ >>> mlist.preferred_language = u'ja'
+ >>> mlist.msg_header = u'$description header'
+ >>> mlist.msg_footer = u'$description footer'
>>> mlist.description = u'\u65e5\u672c\u8a9e'
>>> from email.message import Message
@@ -159,9 +159,9 @@ Sometimes the message even has an unknown character set. In this case,
Mailman has no choice but to decorate the original message with MIME
attachments.
- >>> mlist.preferred_language = 'en'
- >>> mlist.msg_header = 'header'
- >>> mlist.msg_footer = 'footer'
+ >>> mlist.preferred_language = u'en'
+ >>> mlist.msg_header = u'header'
+ >>> mlist.msg_footer = u'footer'
>>> msg = message_from_string("""\
... From: aperson@example.org
... Content-Type: text/plain; charset=unknown
@@ -210,9 +210,9 @@ When the outerpart is multipart/mixed, the header and footer can have a
Content-Disposition of 'inline' so that MUAs can display these headers as if
they were simply concatenated.
- >>> mlist.preferred_language = 'en'
- >>> mlist.msg_header = 'header'
- >>> mlist.msg_footer = 'footer'
+ >>> mlist.preferred_language = u'en'
+ >>> mlist.msg_header = u'header'
+ >>> mlist.msg_footer = u'footer'
>>> part_1 = message_from_string("""\
... From: aperson@example.org
...
diff --git a/Mailman/docs/digests.txt b/Mailman/docs/digests.txt
index 486d64098..aaef4c18b 100644
--- a/Mailman/docs/digests.txt
+++ b/Mailman/docs/digests.txt
@@ -9,11 +9,11 @@ digests, although only two are currently supported: MIME digests and RFC 1153
>>> from Mailman.Handlers.ToDigest import process
>>> from Mailman.queue import Switchboard
>>> from Mailman.configuration import config
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
- >>> mlist.preferred_language = 'en'
- >>> mlist.web_page_url = 'http://www.example.com/'
- >>> mlist.real_name = 'XTest'
- >>> mlist.subject_prefix = '[_XTest] '
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
+ >>> mlist.preferred_language = u'en'
+ >>> mlist.web_page_url = u'http://www.example.com/'
+ >>> mlist.real_name = u'XTest'
+ >>> mlist.subject_prefix = u'[_XTest] '
>>> mlist.one_last_digest = set()
>>> switchboard = Switchboard(config.VIRGINQUEUE_DIR)
@@ -266,7 +266,7 @@ digest and an RFC 1153 plain text digest. The size threshold is in KB.
>>> sorted(mimedata.items())
[('_parsemsg', False),
('isdigest', True),
- ('listname', '_xtest@example.com'),
+ ('listname', u'_xtest@example.com'),
('received_time', ...),
('recips', set([])), ('version', 3)]
>>> print rfc1153msg.as_string()
@@ -401,7 +401,7 @@ digest and an RFC 1153 plain text digest. The size threshold is in KB.
>>> sorted(rfc1153data.items())
[('_parsemsg', False),
('isdigest', True),
- ('listname', '_xtest@example.com'),
+ ('listname', u'_xtest@example.com'),
('received_time', ...),
('recips', set([])), ('version', 3)]
@@ -418,7 +418,7 @@ English template will be found and the masthead won't be translated.
>>> config.languages.enable_language('fr')
>>> config.DEFAULT_SERVER_LANGUAGE = u'fr'
- >>> mlist.preferred_language = 'fr'
+ >>> mlist.preferred_language = u'fr'
>>> msg = message_from_string("""\
... From: aperson@example.org
... To: _xtest@example.com
@@ -512,7 +512,7 @@ Set the digest threshold to zero so that the digests will be sent immediately.
>>> sorted(mimedata.items())
[('_parsemsg', False),
('isdigest', True),
- ('listname', '_xtest@example.com'),
+ ('listname', u'_xtest@example.com'),
('received_time', ...),
('recips', set([])), ('version', 3)]
>>> print rfc1153msg.as_string()
@@ -531,7 +531,7 @@ Set the digest threshold to zero so that the digests will be sent immediately.
>>> sorted(rfc1153data.items())
[('_parsemsg', False),
('isdigest', True),
- ('listname', '_xtest@example.com'),
+ ('listname', u'_xtest@example.com'),
('received_time', ...),
('recips', set([])), ('version', 3)]
diff --git a/Mailman/docs/file-recips.txt b/Mailman/docs/file-recips.txt
index c30dee608..c7528a1d1 100644
--- a/Mailman/docs/file-recips.txt
+++ b/Mailman/docs/file-recips.txt
@@ -7,7 +7,7 @@ list's data directory.
>>> from Mailman.Handlers.FileRecips import process
>>> from Mailman.configuration import config
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
Short circuiting
@@ -45,7 +45,7 @@ empty.
Traceback (most recent call last):
...
IOError: [Errno ...]
- No such file or directory: '.../_xtest@example.com/members.txt'
+ No such file or directory: u'.../_xtest@example.com/members.txt'
>>> msgdata = {}
>>> process(mlist, msg, msgdata)
>>> sorted(msgdata['recips'])
@@ -81,7 +81,7 @@ in the recipients list.
>>> from Mailman.interfaces import MemberRole
>>> address_1 = config.db.user_manager.create_address(
- ... 'cperson@example.com')
+ ... u'cperson@example.com')
>>> address_1.subscribe(mlist, MemberRole.member)
<Member: cperson@example.com on _xtest@example.com as MemberRole.member>
diff --git a/Mailman/docs/filtering.txt b/Mailman/docs/filtering.txt
index 49d717cbc..67bef2f8e 100644
--- a/Mailman/docs/filtering.txt
+++ b/Mailman/docs/filtering.txt
@@ -8,8 +8,8 @@ handlers can potentially do other kinds of finer level content filtering.
>>> from Mailman.Handlers.MimeDel import process
>>> from Mailman.configuration import config
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
- >>> mlist.preferred_language = 'en'
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
+ >>> mlist.preferred_language = u'en'
Several mailing list options control content filtering. First, the feature
must be enabled, then there are two options that control which MIME types get
diff --git a/Mailman/docs/lifecycle.txt b/Mailman/docs/lifecycle.txt
index 9ac19eb48..1a3dfa2bf 100644
--- a/Mailman/docs/lifecycle.txt
+++ b/Mailman/docs/lifecycle.txt
@@ -63,9 +63,9 @@ Start by registering a test style.
Using the higher level interface for creating a list, applies all matching
list styles.
- >>> mlist_1 = create_list('test_1@example.com')
+ >>> mlist_1 = create_list(u'test_1@example.com')
>>> mlist_1.fqdn_listname
- 'test_1@example.com'
+ u'test_1@example.com'
>>> mlist_1.msg_footer
u'test footer'
@@ -77,16 +77,16 @@ You can also specify a list of owner email addresses. If these addresses are
not yet known, they will be registered, and new users will be linked to them.
However the addresses are not verified.
- >>> owners = ['aperson@example.com', 'bperson@example.com',
- ... 'cperson@example.com', 'dperson@example.com']
- >>> mlist_2 = create_list('test_2@example.com', owners)
+ >>> owners = [u'aperson@example.com', u'bperson@example.com',
+ ... u'cperson@example.com', u'dperson@example.com']
+ >>> mlist_2 = create_list(u'test_2@example.com', owners)
>>> mlist_2.fqdn_listname
- 'test_2@example.com'
+ u'test_2@example.com'
>>> mlist_2.msg_footer
u'test footer'
>>> sorted(addr.address for addr in mlist_2.owners.addresses)
- ['aperson@example.com', 'bperson@example.com',
- 'cperson@example.com', 'dperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com',
+ u'cperson@example.com', u'dperson@example.com']
None of the owner addresses are verified.
@@ -104,18 +104,18 @@ the system, they won't be created again.
>>> from Mailman.configuration import config
>>> usermgr = config.db.user_manager
- >>> user_a = usermgr.get_user('aperson@example.com')
- >>> user_b = usermgr.get_user('bperson@example.com')
- >>> user_c = usermgr.get_user('cperson@example.com')
- >>> user_d = usermgr.get_user('dperson@example.com')
- >>> user_a.real_name = 'Anne Person'
- >>> user_b.real_name = 'Bart Person'
- >>> user_c.real_name = 'Caty Person'
- >>> user_d.real_name = 'Dirk Person'
+ >>> user_a = usermgr.get_user(u'aperson@example.com')
+ >>> user_b = usermgr.get_user(u'bperson@example.com')
+ >>> user_c = usermgr.get_user(u'cperson@example.com')
+ >>> user_d = usermgr.get_user(u'dperson@example.com')
+ >>> user_a.real_name = u'Anne Person'
+ >>> user_b.real_name = u'Bart Person'
+ >>> user_c.real_name = u'Caty Person'
+ >>> user_d.real_name = u'Dirk Person'
- >>> mlist_3 = create_list('test_3@example.com', owners)
+ >>> mlist_3 = create_list(u'test_3@example.com', owners)
>>> sorted(user.real_name for user in mlist_3.owners.users)
- ['Anne Person', 'Bart Person', 'Caty Person', 'Dirk Person']
+ [u'Anne Person', u'Bart Person', u'Caty Person', u'Dirk Person']
Removing a list
diff --git a/Mailman/docs/membership.txt b/Mailman/docs/membership.txt
index 01c86ac3f..21084d194 100644
--- a/Mailman/docs/membership.txt
+++ b/Mailman/docs/membership.txt
@@ -15,7 +15,7 @@ store mailing list data in a different database than user data.
When we create a mailing list, it starts out with no members...
>>> from Mailman.configuration import config
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
>>> mlist
<mailing list "_xtest@example.com" at ...>
>>> sorted(member.address.address for member in mlist.members.members)
@@ -64,11 +64,11 @@ assigning roles to users. First we have to create the user, because there are
no users in the user database yet.
>>> usermgr = config.db.user_manager
- >>> user_1 = usermgr.create_user('aperson@example.com', 'Anne Person')
+ >>> user_1 = usermgr.create_user(u'aperson@example.com', u'Anne Person')
>>> user_1.real_name
- 'Anne Person'
+ u'Anne Person'
>>> sorted(address.address for address in user_1.addresses)
- ['aperson@example.com']
+ [u'aperson@example.com']
We can add Anne as an owner of the mailing list, by creating a member role for
her.
@@ -76,22 +76,22 @@ her.
>>> from Mailman.interfaces import MemberRole
>>> address_1 = list(user_1.addresses)[0]
>>> address_1.address
- 'aperson@example.com'
+ u'aperson@example.com'
>>> address_1.subscribe(mlist, MemberRole.owner)
<Member: Anne Person <aperson@example.com> on
_xtest@example.com as MemberRole.owner>
>>> sorted(member.address.address for member in mlist.owners.members)
- ['aperson@example.com']
+ [u'aperson@example.com']
>>> sorted(user.real_name for user in mlist.owners.users)
- ['Anne Person']
+ [u'Anne Person']
>>> sorted(address.address for address in mlist.owners.addresses)
- ['aperson@example.com']
+ [u'aperson@example.com']
Adding Anne as a list owner also makes her an administrator, but does not make
her a moderator. Nor does it make her a member of the list.
>>> sorted(user.real_name for user in mlist.administrators.users)
- ['Anne Person']
+ [u'Anne Person']
>>> sorted(user.real_name for user in mlist.moderators.users)
[]
>>> sorted(user.real_name for user in mlist.members.users)
@@ -100,31 +100,31 @@ her a moderator. Nor does it make her a member of the list.
We can add Ben as a moderator of the list, by creating a different member role
for him.
- >>> user_2 = usermgr.create_user('bperson@example.com', 'Ben Person')
+ >>> user_2 = usermgr.create_user(u'bperson@example.com', u'Ben Person')
>>> user_2.real_name
- 'Ben Person'
+ u'Ben Person'
>>> address_2 = list(user_2.addresses)[0]
>>> address_2.address
- 'bperson@example.com'
+ u'bperson@example.com'
>>> address_2.subscribe(mlist, MemberRole.moderator)
<Member: Ben Person <bperson@example.com>
on _xtest@example.com as MemberRole.moderator>
>>> sorted(member.address.address for member in mlist.moderators.members)
- ['bperson@example.com']
+ [u'bperson@example.com']
>>> sorted(user.real_name for user in mlist.moderators.users)
- ['Ben Person']
+ [u'Ben Person']
>>> sorted(address.address for address in mlist.moderators.addresses)
- ['bperson@example.com']
+ [u'bperson@example.com']
Now, both Anne and Ben are list administrators.
>>> sorted(member.address.address
... for member in mlist.administrators.members)
- ['aperson@example.com', 'bperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com']
>>> sorted(user.real_name for user in mlist.administrators.users)
- ['Anne Person', 'Ben Person']
+ [u'Anne Person', u'Ben Person']
>>> sorted(address.address for address in mlist.administrators.addresses)
- ['aperson@example.com', 'bperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com']
Members
@@ -137,12 +137,12 @@ delivery. Without a preference, Mailman will fall back first to the address's
preference, then the user's preference, then the list's preference. Start
without any member preference to see the system defaults.
- >>> user_3 = usermgr.create_user('cperson@example.com', 'Claire Person')
+ >>> user_3 = usermgr.create_user(u'cperson@example.com', u'Claire Person')
>>> user_3.real_name
- 'Claire Person'
+ u'Claire Person'
>>> address_3 = list(user_3.addresses)[0]
>>> address_3.address
- 'cperson@example.com'
+ u'cperson@example.com'
>>> address_3.subscribe(mlist, MemberRole.member)
<Member: Claire Person <cperson@example.com>
on _xtest@example.com as MemberRole.member>
@@ -150,9 +150,9 @@ without any member preference to see the system defaults.
Claire will be a regular delivery member but not a digest member.
>>> sorted(address.address for address in mlist.members.addresses)
- ['cperson@example.com']
+ [u'cperson@example.com']
>>> sorted(address.address for address in mlist.regular_members.addresses)
- ['cperson@example.com']
+ [u'cperson@example.com']
>>> sorted(address.address for address in mlist.digest_members.addresses)
[]
@@ -168,9 +168,9 @@ It's easy to make the list administrators members of the mailing list too.
<Member: Ben Person <bperson@example.com> on
_xtest@example.com as MemberRole.member>]
>>> sorted(address.address for address in mlist.members.addresses)
- ['aperson@example.com', 'bperson@example.com', 'cperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com', u'cperson@example.com']
>>> sorted(address.address for address in mlist.regular_members.addresses)
- ['aperson@example.com', 'bperson@example.com', 'cperson@example.com']
+ [u'aperson@example.com', u'bperson@example.com', u'cperson@example.com']
>>> sorted(address.address for address in mlist.digest_members.addresses)
[]
@@ -181,24 +181,24 @@ Finding members
You can find the IMember object that is a member of a roster for a given text
email address by using an IRoster's .get_member() method.
- >>> mlist.owners.get_member('aperson@example.com')
+ >>> mlist.owners.get_member(u'aperson@example.com')
<Member: Anne Person <aperson@example.com> on
_xtest@example.com as MemberRole.owner>
- >>> mlist.administrators.get_member('aperson@example.com')
+ >>> mlist.administrators.get_member(u'aperson@example.com')
<Member: Anne Person <aperson@example.com> on
_xtest@example.com as MemberRole.owner>
- >>> mlist.members.get_member('aperson@example.com')
+ >>> mlist.members.get_member(u'aperson@example.com')
<Member: Anne Person <aperson@example.com> on
_xtest@example.com as MemberRole.member>
However, if the address is not subscribed with the appropriate role, then None
is returned.
- >>> print mlist.administrators.get_member('zperson@example.com')
+ >>> print mlist.administrators.get_member(u'zperson@example.com')
None
- >>> print mlist.moderators.get_member('aperson@example.com')
+ >>> print mlist.moderators.get_member(u'aperson@example.com')
None
- >>> print mlist.members.get_member('zperson@example.com')
+ >>> print mlist.members.get_member(u'zperson@example.com')
None
@@ -212,11 +212,11 @@ regardless of their role.
... return (member.address.address, int(member.role))
>>> [(member.address.address, str(member.role))
... for member in sorted(mlist.subscribers.members, key=sortkey)]
- [('aperson@example.com', 'MemberRole.member'),
- ('aperson@example.com', 'MemberRole.owner'),
- ('bperson@example.com', 'MemberRole.member'),
- ('bperson@example.com', 'MemberRole.moderator'),
- ('cperson@example.com', 'MemberRole.member')]
+ [(u'aperson@example.com', 'MemberRole.member'),
+ (u'aperson@example.com', 'MemberRole.owner'),
+ (u'bperson@example.com', 'MemberRole.member'),
+ (u'bperson@example.com', 'MemberRole.moderator'),
+ (u'cperson@example.com', 'MemberRole.member')]
Double subscriptions
diff --git a/Mailman/docs/registration.txt b/Mailman/docs/registration.txt
index ef2b622e5..1db60722e 100644
--- a/Mailman/docs/registration.txt
+++ b/Mailman/docs/registration.txt
@@ -104,16 +104,16 @@ is complete. No IUser or IAddress is created at registration time, but a
record is added to the pending database, and the token for that record is
returned.
- >>> token = registrar.register('aperson@example.com', 'Anne Person')
+ >>> token = registrar.register(u'aperson@example.com', u'Anne Person')
>>> check_token(token)
ok
There should be no records in the user manager for this address yet.
>>> usermgr = config.db.user_manager
- >>> print usermgr.get_user('aperson@example.com')
+ >>> print usermgr.get_user(u'aperson@example.com')
None
- >>> print usermgr.get_address('aperson@example.com')
+ >>> print usermgr.get_address(u'aperson@example.com')
None
But this address is waiting for confirmation.
diff --git a/Mailman/docs/reply-to.txt b/Mailman/docs/reply-to.txt
index 51fd5a143..537681f93 100644
--- a/Mailman/docs/reply-to.txt
+++ b/Mailman/docs/reply-to.txt
@@ -9,7 +9,7 @@ is getting sent through the system. We'll take things one-by-one.
>>> from Mailman.Handlers.CookHeaders import process
>>> from Mailman.configuration import config
- >>> mlist = config.db.list_manager.create('_xtest@example.com')
+ >>> mlist = config.db.list_manager.create(u'_xtest@example.com')
>>> mlist.subject_prefix = u''
Reply-to munging refers to the behavior where a mailing list can be configured
@@ -39,47 +39,47 @@ message, the list's posting address simply gets inserted.
>>> from Mailman.interfaces import ReplyToMunging
>>> mlist.reply_goes_to_list = ReplyToMunging.point_to_list
- >>> mlist.preferred_language = 'en'
- >>> mlist.description = ''
- >>> msg = message_from_string("""\
+ >>> mlist.preferred_language = u'en'
+ >>> mlist.description = u''
+ >>> msg = message_from_string(u"""\
... From: aperson@example.com
...
- ... """, Message)
+ ... """)
>>> process(mlist, msg, {})
>>> len(msg.get_all('reply-to'))
1
>>> msg['reply-to']
- '_xtest@example.com'
+ u'_xtest@example.com'
It's also possible to strip any existing Reply-To header first, before adding
the list's posting address.
>>> mlist.first_strip_reply_to = True
- >>> msg = message_from_string("""\
+ >>> msg = message_from_string(u"""\
... From: aperson@example.com
... Reply-To: bperson@example.com
...
- ... """, Message)
+ ... """)
>>> process(mlist, msg, {})
>>> len(msg.get_all('reply-to'))
1
>>> msg['reply-to']
- '_xtest@example.com'
+ u'_xtest@example.com'
If you don't first strip the header, then the list's posting address will just
get appended to whatever the original version was.
>>> mlist.first_strip_reply_to = False
- >>> msg = message_from_string("""\
+ >>> msg = message_from_string(u"""\
... From: aperson@example.com
... Reply-To: bperson@example.com
...
- ... """, Message)
+ ... """)
>>> process(mlist, msg, {})
>>> len(msg.get_all('reply-to'))
1
>>> msg['reply-to']
- 'bperson@example.com, _xtest@example.com'
+ u'bperson@example.com, _xtest@example.com'
Explicit Reply-To
@@ -88,41 +88,41 @@ Explicit Reply-To
The list can also be configured to have an explicit Reply-To header.
>>> mlist.reply_goes_to_list = ReplyToMunging.explicit_header
- >>> mlist.reply_to_address = 'my-list@example.com'
- >>> msg = message_from_string("""\
+ >>> mlist.reply_to_address = u'my-list@example.com'
+ >>> msg = message_from_string(u"""\
... From: aperson@example.com
...
- ... """, Message)
+ ... """)
>>> process(mlist, msg, {})
>>> len(msg.get_all('reply-to'))
1
>>> msg['reply-to']
- 'my-list@example.com'
+ u'my-list@example.com'
And as before, it's possible to either strip any existing Reply-To header...
>>> mlist.first_strip_reply_to = True
- >>> msg = message_from_string("""\
+ >>> msg = message_from_string(u"""\
... From: aperson@example.com
... Reply-To: bperson@example.com
...
- ... """, Message)
+ ... """)
>>> process(mlist, msg, {})
>>> len(msg.get_all('reply-to'))
1
>>> msg['reply-to']
- 'my-list@example.com'
+ u'my-list@example.com'
...or not.
>>> mlist.first_strip_reply_to = False
- >>> msg = message_from_string("""\
+ >>> msg = message_from_string(u"""\
... From: aperson@example.com
... Reply-To: bperson@example.com
...
- ... """, Message)
+ ... """)
>>> process(mlist, msg, {})
>>> len(msg.get_all('reply-to'))
1
>>> msg['reply-to']
- 'my-list@example.com, bperson@example.com'
+ u'my-list@example.com, bperson@example.com'