diff options
| -rw-r--r-- | Mailman/database/listmanager.py | 2 | ||||
| -rw-r--r-- | Mailman/database/model/member.py | 5 | ||||
| -rw-r--r-- | Mailman/database/model/pending.py | 22 | ||||
| -rw-r--r-- | Mailman/database/model/roster.py | 16 | ||||
| -rw-r--r-- | Mailman/docs/decorate.txt | 42 | ||||
| -rw-r--r-- | Mailman/docs/digests.txt | 20 | ||||
| -rw-r--r-- | Mailman/docs/file-recips.txt | 6 | ||||
| -rw-r--r-- | Mailman/docs/filtering.txt | 4 | ||||
| -rw-r--r-- | Mailman/docs/lifecycle.txt | 36 | ||||
| -rw-r--r-- | Mailman/docs/membership.txt | 72 | ||||
| -rw-r--r-- | Mailman/docs/registration.txt | 6 | ||||
| -rw-r--r-- | Mailman/docs/reply-to.txt | 44 |
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' |
