summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw2011-04-16 12:55:48 -0400
committerBarry Warsaw2011-04-16 12:55:48 -0400
commit3db11b8bcb7194b5672426ad057f965734134a59 (patch)
treef92386d56455d1325633eefce652b111598cda13
parentc894152772595a1acbd6dc4c1ac0e033888ea923 (diff)
downloadmailman-3db11b8bcb7194b5672426ad057f965734134a59.tar.gz
mailman-3db11b8bcb7194b5672426ad057f965734134a59.tar.zst
mailman-3db11b8bcb7194b5672426ad057f965734134a59.zip
-rw-r--r--src/mailman/app/lifecycle.py8
-rw-r--r--src/mailman/app/membership.py5
-rw-r--r--src/mailman/app/registrar.py2
-rw-r--r--src/mailman/interfaces/address.py10
-rw-r--r--src/mailman/interfaces/mailinglist.py16
-rw-r--r--src/mailman/model/address.py23
-rw-r--r--src/mailman/model/docs/addresses.txt41
-rw-r--r--src/mailman/model/docs/mailinglist.txt101
-rw-r--r--src/mailman/model/docs/membership.txt12
-rw-r--r--src/mailman/model/docs/requests.txt4
-rw-r--r--src/mailman/model/docs/users.txt8
-rw-r--r--src/mailman/model/mailinglist.py22
-rw-r--r--src/mailman/mta/docs/decorating.txt6
-rw-r--r--src/mailman/pipeline/docs/acknowledge.txt4
-rw-r--r--src/mailman/pipeline/docs/avoid-duplicates.txt4
-rw-r--r--src/mailman/pipeline/docs/calc-recips.txt12
-rw-r--r--src/mailman/pipeline/docs/file-recips.txt2
-rw-r--r--src/mailman/queue/docs/digester.txt2
-rw-r--r--src/mailman/rules/moderation.py2
-rw-r--r--src/mailman/testing/helpers.py6
20 files changed, 140 insertions, 150 deletions
diff --git a/src/mailman/app/lifecycle.py b/src/mailman/app/lifecycle.py
index b30266f3b..689fab484 100644
--- a/src/mailman/app/lifecycle.py
+++ b/src/mailman/app/lifecycle.py
@@ -80,11 +80,11 @@ def create_list(fqdn_listname, owners=None):
# owners of the mailing list.
user_manager = getUtility(IUserManager)
for owner_address in owners:
- addr = user_manager.get_address(owner_address)
- if addr is None:
+ address = user_manager.get_address(owner_address)
+ if address is None:
user = user_manager.create_user(owner_address)
- addr = list(user.addresses)[0]
- addr.subscribe(mlist, MemberRole.owner)
+ address = list(user.addresses)[0]
+ mlist.subscribe(address, MemberRole.owner)
return mlist
diff --git a/src/mailman/app/membership.py b/src/mailman/app/membership.py
index aaf7f05df..be2382a7f 100644
--- a/src/mailman/app/membership.py
+++ b/src/mailman/app/membership.py
@@ -99,7 +99,7 @@ def add_member(mlist, email, realname, password, delivery_mode, language):
# scheme is recorded in the hashed password string.
user.password = encrypt_password(password)
user.preferences.preferred_language = language
- member = address.subscribe(mlist, MemberRole.member)
+ member = mlist.subscribe(address, MemberRole.member)
member.preferences.delivery_mode = delivery_mode
else:
# The user exists and is linked to the address.
@@ -110,8 +110,7 @@ def add_member(mlist, email, realname, password, delivery_mode, language):
raise AssertionError(
'User should have had linked address: {0}'.format(address))
# Create the member and set the appropriate preferences.
- # pylint: disable-msg=W0631
- member = address.subscribe(mlist, MemberRole.member)
+ member = mlist.subscribe(address, MemberRole.member)
member.preferences.preferred_language = language
member.preferences.delivery_mode = delivery_mode
return member
diff --git a/src/mailman/app/registrar.py b/src/mailman/app/registrar.py
index ec899237a..f6f2e8679 100644
--- a/src/mailman/app/registrar.py
+++ b/src/mailman/app/registrar.py
@@ -138,7 +138,7 @@ class Registrar:
if list_name is not None:
mlist = getUtility(IListManager).get(list_name)
if mlist:
- address.subscribe(mlist, MemberRole.member)
+ mlist.subscribe(address, MemberRole.member)
return True
def discard(self, token):
diff --git a/src/mailman/interfaces/address.py b/src/mailman/interfaces/address.py
index c051c9b0c..be5443437 100644
--- a/src/mailman/interfaces/address.py
+++ b/src/mailman/interfaces/address.py
@@ -99,16 +99,6 @@ class IAddress(Interface):
None if the email address has not yet been validated. The specific
method of validation is not defined here.""")
- def subscribe(mailing_list, role):
- """Subscribe the address to the given mailing list with the given role.
-
- :param mailing_list: The IMailingList being subscribed to.
- :param role: A MemberRole enum value.
- :return: The IMember representing this subscription.
- :raises AlreadySubscribedError: If the address is already subscribed
- to the mailing list with the given role.
- """
-
preferences = Attribute(
"""This address's preferences.""")
diff --git a/src/mailman/interfaces/mailinglist.py b/src/mailman/interfaces/mailinglist.py
index d8c0ebb26..32f21a792 100644
--- a/src/mailman/interfaces/mailinglist.py
+++ b/src/mailman/interfaces/mailinglist.py
@@ -182,7 +182,7 @@ class IMailingList(Interface):
def confirm_address(cookie=''):
"""The address used for various forms of email confirmation."""
- # Rosters.
+ # Rosters and subscriptions.
owners = Attribute(
"""The IUser owners of this mailing list.
@@ -232,6 +232,20 @@ class IMailingList(Interface):
:rtype: Roster
"""
+ def subscribe(address, role):
+ """Subscribe the given address to the mailing list.
+
+ :param address: The address to subscribe.
+ :type address: `IAddress`
+ :param role: The role being subscribed to (e.g. a member, owner, or
+ moderator of a mailing list.
+ :type role: `MemberRole`
+ :return: The member object representing the subscription.
+ :rtype: `IMember`
+ :raises AlreadySubscribedError: If the address is already subscribed
+ to the mailing list with the given role.
+ """
+
# Posting history.
last_post_at = Attribute(
diff --git a/src/mailman/model/address.py b/src/mailman/model/address.py
index 6fa310c48..92f7f8986 100644
--- a/src/mailman/model/address.py
+++ b/src/mailman/model/address.py
@@ -26,14 +26,11 @@ __all__ = [
from email.utils import formataddr
-from storm.locals import DateTime, Int, Reference, Store, Unicode
+from storm.locals import DateTime, Int, Reference, Unicode
from zope.interface import implements
from mailman.database.model import Model
-from mailman.interfaces.member import AlreadySubscribedError
from mailman.interfaces.address import IAddress
-from mailman.model.member import Member
-from mailman.model.preferences import Preferences
@@ -73,24 +70,6 @@ class Address(Model):
return '<Address: {0} [{1}] key: {2} at {3:#x}>'.format(
address_str, verified, self.email, id(self))
- def subscribe(self, mailing_list, role):
- # This member has no preferences by default.
- store = Store.of(self)
- member = store.find(
- Member,
- Member.role == role,
- Member.mailing_list == mailing_list.fqdn_listname,
- Member.address == self).one()
- if member:
- raise AlreadySubscribedError(
- mailing_list.fqdn_listname, self.email, role)
- member = Member(role=role,
- mailing_list=mailing_list.fqdn_listname,
- address=self)
- member.preferences = Preferences()
- store.add(member)
- return member
-
@property
def original_email(self):
return (self.email if self._original is None else self._original)
diff --git a/src/mailman/model/docs/addresses.txt b/src/mailman/model/docs/addresses.txt
index fdcc993b5..ffbb897ab 100644
--- a/src/mailman/model/docs/addresses.txt
+++ b/src/mailman/model/docs/addresses.txt
@@ -153,47 +153,6 @@ And of course, you can also set the validation date.
2007-05-13 22:54:01
-Subscriptions
-=============
-
-Addresses get subscribed to mailing lists, not users. When the address is
-subscribed, a role is specified.
-::
-
- >>> address_5 = user_manager.create_address(
- ... 'eperson@example.com', 'Elly Person')
- >>> mlist = create_list('test@example.com')
-
- >>> from mailman.interfaces.member import MemberRole
- >>> address_5.subscribe(mlist, MemberRole.owner)
- <Member: Elly Person <eperson@example.com> on
- test@example.com as MemberRole.owner>
- >>> address_5.subscribe(mlist, MemberRole.member)
- <Member: Elly Person <eperson@example.com> on
- test@example.com as MemberRole.member>
-
-Now Elly is both an owner and a member of the mailing list.
-
- >>> def memberkey(member):
- ... return member.mailing_list, member.address.email, int(member.role)
- >>> dump_list(mlist.owners.members, key=memberkey)
- <Member: Elly Person <eperson@example.com> on
- test@example.com as MemberRole.owner>
- >>> dump_list(mlist.moderators.members, key=memberkey)
- *Empty*
- >>> dump_list(mlist.administrators.members, key=memberkey)
- <Member: Elly Person <eperson@example.com> on
- test@example.com as MemberRole.owner>
- >>> dump_list(mlist.members.members, key=memberkey)
- <Member: Elly Person <eperson@example.com> on
- test@example.com as MemberRole.member>
- >>> dump_list(mlist.regular_members.members, key=memberkey)
- <Member: Elly Person <eperson@example.com> on
- test@example.com as MemberRole.member>
- >>> dump_list(mlist.digest_members.members, key=memberkey)
- *Empty*
-
-
Case-preserved addresses
========================
diff --git a/src/mailman/model/docs/mailinglist.txt b/src/mailman/model/docs/mailinglist.txt
index 33d681762..cc95c077c 100644
--- a/src/mailman/model/docs/mailinglist.txt
+++ b/src/mailman/model/docs/mailinglist.txt
@@ -9,16 +9,16 @@ the system by its posting address, i.e. the email address you would send a
message to in order to post a message to the mailing list. This must be fully
qualified.
- >>> alpha = create_list('alpha@example.com')
- >>> print alpha.fqdn_listname
- alpha@example.com
+ >>> mlist = create_list('aardvark@example.com')
+ >>> print mlist.fqdn_listname
+ aardvark@example.com
The mailing list also has convenient attributes for accessing the list's short
name (i.e. local part) and host name.
- >>> print alpha.list_name
- alpha
- >>> print alpha.host_name
+ >>> print mlist.list_name
+ aardvark
+ >>> print mlist.host_name
example.com
@@ -29,46 +29,75 @@ Mailing list membership is represented by `rosters`. Each mailing list has
several rosters of members, representing the subscribers to the mailing list,
the owners, the moderators, and so on. The rosters are defined by a
membership role.
+
+Addresses can be explicitly subscribed to a mailing list. By default, a
+subscription puts the address in the `member` role, meaning that address will
+receive a copy of any message sent to the mailing list.
::
- >>> from mailman.interfaces.member import MemberRole
- >>> from mailman.testing.helpers import subscribe
+ >>> from mailman.interfaces.usermanager import IUserManager
+ >>> from zope.component import getUtility
+ >>> user_manager = getUtility(IUserManager)
- >>> subscribe(alpha, 'Anne')
- >>> subscribe(alpha, 'Bart')
- >>> subscribe(alpha, 'Cris')
- >>> subscribe(alpha, 'Anne', MemberRole.owner)
- >>> subscribe(alpha, 'Dave', MemberRole.owner)
- >>> subscribe(alpha, 'Elle', MemberRole.moderator)
+ >>> aperson = user_manager.create_address('aperson@example.com')
+ >>> bperson = user_manager.create_address('bperson@example.com')
+ >>> mlist.subscribe(aperson)
+ <Member: aperson@example.com on aardvark@example.com as MemberRole.member>
+ >>> mlist.subscribe(bperson)
+ <Member: bperson@example.com on aardvark@example.com as MemberRole.member>
-We can retrieve a roster directly...
+Both addresses appear on the roster of members.
- >>> for member in alpha.members.members:
- ... print member.address
- Anne Person <aperson@example.com>
- Bart Person <bperson@example.com>
- Cris Person <cperson@example.com>
+ >>> for member in mlist.members.members:
+ ... print member
+ <Member: aperson@example.com on aardvark@example.com as MemberRole.member>
+ <Member: bperson@example.com on aardvark@example.com as MemberRole.member>
-...or programmatically.
+By explicitly specifying the role of the subscription, an address can be added
+to the owner and moderator rosters.
- >>> roster = alpha.get_roster(MemberRole.member)
- >>> for member in roster.members:
- ... print member.address
- Anne Person <aperson@example.com>
- Bart Person <bperson@example.com>
- Cris Person <cperson@example.com>
+ >>> from mailman.interfaces.member import MemberRole
+ >>> mlist.subscribe(aperson, MemberRole.owner)
+ <Member: aperson@example.com on aardvark@example.com as MemberRole.owner>
+ >>> cperson = user_manager.create_address('cperson@example.com')
+ >>> mlist.subscribe(cperson, MemberRole.owner)
+ <Member: cperson@example.com on aardvark@example.com as MemberRole.owner>
+ >>> mlist.subscribe(cperson, MemberRole.moderator)
+ <Member: cperson@example.com on aardvark@example.com
+ as MemberRole.moderator>
+
+A Person is now both a member and an owner of the mailing list. C Person is
+an owner and a moderator.
+::
-This includes the roster of owners...
+ >>> for member in mlist.owners.members:
+ ... print member
+ <Member: aperson@example.com on aardvark@example.com as MemberRole.owner>
+ <Member: cperson@example.com on aardvark@example.com as MemberRole.owner>
- >>> roster = alpha.get_roster(MemberRole.owner)
+ >>> for member in mlist.moderators.members:
+ ... print member
+ <Member: cperson@example.com on aardvark@example.com
+ as MemberRole.moderator>
+
+
+All rosters can also be accessed indirectly.
+::
+
+ >>> roster = mlist.get_roster(MemberRole.member)
>>> for member in roster.members:
- ... print member.address
- Anne Person <aperson@example.com>
- Dave Person <dperson@example.com>
+ ... print member
+ <Member: aperson@example.com on aardvark@example.com as MemberRole.member>
+ <Member: bperson@example.com on aardvark@example.com as MemberRole.member>
-...and moderators.
+ >>> roster = mlist.get_roster(MemberRole.owner)
+ >>> for member in roster.members:
+ ... print member
+ <Member: aperson@example.com on aardvark@example.com as MemberRole.owner>
+ <Member: cperson@example.com on aardvark@example.com as MemberRole.owner>
- >>> roster = alpha.get_roster(MemberRole.moderator)
+ >>> roster = mlist.get_roster(MemberRole.moderator)
>>> for member in roster.members:
- ... print member.address
- Elle Person <eperson@example.com>
+ ... print member
+ <Member: cperson@example.com on aardvark@example.com
+ as MemberRole.moderator>
diff --git a/src/mailman/model/docs/membership.txt b/src/mailman/model/docs/membership.txt
index 6f5b82622..8a3f0da16 100644
--- a/src/mailman/model/docs/membership.txt
+++ b/src/mailman/model/docs/membership.txt
@@ -51,7 +51,7 @@ her.
>>> from mailman.interfaces.member import MemberRole
>>> address_1 = list(user_1.addresses)[0]
- >>> address_1.subscribe(mlist, MemberRole.owner)
+ >>> mlist.subscribe(address_1, MemberRole.owner)
<Member: Anne Person <aperson@example.com> on
test@example.com as MemberRole.owner>
>>> dump_list(member.address for member in mlist.owners.members)
@@ -73,7 +73,7 @@ Bart becomes a moderator of the list.
>>> print user_2
<User "Bart Person" (...) at ...>
>>> address_2 = list(user_2.addresses)[0]
- >>> address_2.subscribe(mlist, MemberRole.moderator)
+ >>> mlist.subscribe(address_2, MemberRole.moderator)
<Member: Bart Person <bperson@example.com>
on test@example.com as MemberRole.moderator>
>>> dump_list(member.address for member in mlist.moderators.members)
@@ -102,7 +102,7 @@ role.
>>> user_3 = user_manager.create_user(
... 'cperson@example.com', 'Cris Person')
>>> address_3 = list(user_3.addresses)[0]
- >>> member = address_3.subscribe(mlist, MemberRole.member)
+ >>> member = mlist.subscribe(address_3, MemberRole.member)
>>> member
<Member: Cris Person <cperson@example.com>
on test@example.com as MemberRole.member>
@@ -125,7 +125,7 @@ It's easy to make the list administrators members of the mailing list too.
>>> members = []
>>> for address in mlist.administrators.addresses:
- ... member = address.subscribe(mlist, MemberRole.member)
+ ... member = mlist.subscribe(address, MemberRole.member)
... members.append(member)
>>> dump_list(members, key=attrgetter('address.email'))
<Member: Anne Person <aperson@example.com> on
@@ -157,7 +157,7 @@ role.
>>> user_6 = user_manager.create_user('fperson@example.com', 'Fred Person')
>>> address_6 = list(user_6.addresses)[0]
- >>> member_6 = address_6.subscribe(mlist, MemberRole.nonmember)
+ >>> member_6 = mlist.subscribe(address_6, MemberRole.nonmember)
>>> member_6
<Member: Fred Person <fperson@example.com> on test@example.com
as MemberRole.nonmember>
@@ -233,7 +233,7 @@ Double subscriptions
It is an error to subscribe someone to a list with the same role twice.
- >>> address_1.subscribe(mlist, MemberRole.owner)
+ >>> mlist.subscribe(address_1, MemberRole.owner)
Traceback (most recent call last):
...
AlreadySubscribedError: aperson@example.com is already a MemberRole.owner
diff --git a/src/mailman/model/docs/requests.txt b/src/mailman/model/docs/requests.txt
index 2ff173422..bebb61259 100644
--- a/src/mailman/model/docs/requests.txt
+++ b/src/mailman/model/docs/requests.txt
@@ -716,12 +716,12 @@ notification.
>>> from mailman.interfaces.member import MemberRole
>>> user_1 = user_manager.create_user('gperson@example.com')
>>> address_1 = list(user_1.addresses)[0]
- >>> address_1.subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(address_1, MemberRole.member)
<Member: gperson@example.com on alist@example.com as MemberRole.member>
>>> user_2 = user_manager.create_user('hperson@example.com')
>>> address_2 = list(user_2.addresses)[0]
- >>> address_2.subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(address_2, MemberRole.member)
<Member: hperson@example.com on alist@example.com as MemberRole.member>
>>> id_5 = moderator.hold_unsubscription(mlist, 'gperson@example.com')
diff --git a/src/mailman/model/docs/users.txt b/src/mailman/model/docs/users.txt
index c8244c506..f15d5453b 100644
--- a/src/mailman/model/docs/users.txt
+++ b/src/mailman/model/docs/users.txt
@@ -207,14 +207,14 @@ membership role.
>>> mlist_3 = create_list('xtest_3@example.com')
>>> from mailman.interfaces.member import MemberRole
- >>> com.subscribe(mlist_1, MemberRole.member)
+ >>> mlist_1.subscribe(com, MemberRole.member)
<Member: Zoe Person <zperson@example.com> on xtest_1@example.com as
MemberRole.member>
- >>> org.subscribe(mlist_2, MemberRole.member)
+ >>> mlist_2.subscribe(org, MemberRole.member)
<Member: zperson@example.org on xtest_2@example.com as MemberRole.member>
- >>> org.subscribe(mlist_2, MemberRole.owner)
+ >>> mlist_2.subscribe(org, MemberRole.owner)
<Member: zperson@example.org on xtest_2@example.com as MemberRole.owner>
- >>> net.subscribe(mlist_3, MemberRole.moderator)
+ >>> mlist_3.subscribe(net, MemberRole.moderator)
<Member: zperson@example.net on xtest_3@example.com as
MemberRole.moderator>
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py
index 488b6da3d..895ff1f0e 100644
--- a/src/mailman/model/mailinglist.py
+++ b/src/mailman/model/mailinglist.py
@@ -42,11 +42,13 @@ from mailman.interfaces.domain import IDomainManager
from mailman.interfaces.languages import ILanguageManager
from mailman.interfaces.mailinglist import (
IAcceptableAlias, IAcceptableAliasSet, IMailingList, Personalization)
-from mailman.interfaces.member import MemberRole
+from mailman.interfaces.member import AlreadySubscribedError, MemberRole
from mailman.interfaces.mime import FilterType
from mailman.model import roster
from mailman.model.digests import OneLastDigest
+from mailman.model.member import Member
from mailman.model.mime import ContentFilter
+from mailman.model.preferences import Preferences
from mailman.utilities.filesystem import makedirs
from mailman.utilities.string import expand
@@ -441,6 +443,24 @@ class MailingList(Model):
raise TypeError(
'Undefined MemberRole: {0}'.format(role))
+ def subscribe(self, address, role=MemberRole.member):
+ """See `IMailingList`."""
+ store = Store.of(self)
+ member = store.find(
+ Member,
+ Member.role == role,
+ Member.mailing_list == self.fqdn_listname,
+ Member.address == address).one()
+ if member:
+ raise AlreadySubscribedError(
+ self.fqdn_listname, address.email, role)
+ member = Member(role=role,
+ mailing_list=self.fqdn_listname,
+ address=address)
+ member.preferences = Preferences()
+ store.add(member)
+ return member
+
class AcceptableAlias(Model):
diff --git a/src/mailman/mta/docs/decorating.txt b/src/mailman/mta/docs/decorating.txt
index 0bc9649c8..05196eb78 100644
--- a/src/mailman/mta/docs/decorating.txt
+++ b/src/mailman/mta/docs/decorating.txt
@@ -69,17 +69,17 @@ list.
>>> anne = user_manager.create_user('aperson@example.com', 'Anne Person')
>>> anne.password = b'AAA'
- >>> list(anne.addresses)[0].subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(list(anne.addresses)[0], MemberRole.member)
<Member: Anne Person <aperson@example.com> ...
>>> bart = user_manager.create_user('bperson@example.com', 'Bart Person')
>>> bart.password = b'BBB'
- >>> list(bart.addresses)[0].subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(list(bart.addresses)[0], MemberRole.member)
<Member: Bart Person <bperson@example.com> ...
>>> cris = user_manager.create_user('cperson@example.com', 'Cris Person')
>>> cris.password = b'CCC'
- >>> list(cris.addresses)[0].subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(list(cris.addresses)[0], MemberRole.member)
<Member: Cris Person <cperson@example.com> ...
The decorations happen when the message is delivered.
diff --git a/src/mailman/pipeline/docs/acknowledge.txt b/src/mailman/pipeline/docs/acknowledge.txt
index 5e4240626..b2ce11b7f 100644
--- a/src/mailman/pipeline/docs/acknowledge.txt
+++ b/src/mailman/pipeline/docs/acknowledge.txt
@@ -29,7 +29,7 @@ Subscribe a user to the mailing list.
>>> from mailman.interfaces.member import MemberRole
>>> user_1 = user_manager.create_user('aperson@example.com')
>>> address_1 = list(user_1.addresses)[0]
- >>> address_1.subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(address_1, MemberRole.member)
<Member: aperson@example.com on _xtest@example.com as MemberRole.member>
@@ -82,7 +82,7 @@ will be sent.
>>> user_2 = user_manager.create_user('dperson@example.com')
>>> address_2 = list(user_2.addresses)[0]
- >>> address_2.subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(address_2, MemberRole.member)
<Member: dperson@example.com on _xtest@example.com as MemberRole.member>
>>> handler.process(mlist, msg,
diff --git a/src/mailman/pipeline/docs/avoid-duplicates.txt b/src/mailman/pipeline/docs/avoid-duplicates.txt
index bd753f9e9..1e46793c2 100644
--- a/src/mailman/pipeline/docs/avoid-duplicates.txt
+++ b/src/mailman/pipeline/docs/avoid-duplicates.txt
@@ -19,8 +19,8 @@ Create some members we're going to use.
>>> address_b = user_manager.create_address('bperson@example.com')
>>> from mailman.interfaces.member import MemberRole
- >>> member_a = address_a.subscribe(mlist, MemberRole.member)
- >>> member_b = address_b.subscribe(mlist, MemberRole.member)
+ >>> member_a = mlist.subscribe(address_a, MemberRole.member)
+ >>> member_b = mlist.subscribe(address_b, MemberRole.member)
>>> # This is the message metadata dictionary as it would be produced by
>>> # the CalcRecips handler.
>>> recips = dict(
diff --git a/src/mailman/pipeline/docs/calc-recips.txt b/src/mailman/pipeline/docs/calc-recips.txt
index efa1bc9c7..6dca85816 100644
--- a/src/mailman/pipeline/docs/calc-recips.txt
+++ b/src/mailman/pipeline/docs/calc-recips.txt
@@ -26,12 +26,12 @@ start out with. First, create a bunch of addresses...
...then subscribe these addresses to the mailing list as members...
>>> from mailman.interfaces.member import MemberRole
- >>> member_a = address_a.subscribe(mlist, MemberRole.member)
- >>> member_b = address_b.subscribe(mlist, MemberRole.member)
- >>> member_c = address_c.subscribe(mlist, MemberRole.member)
- >>> member_d = address_d.subscribe(mlist, MemberRole.member)
- >>> member_e = address_e.subscribe(mlist, MemberRole.member)
- >>> member_f = address_f.subscribe(mlist, MemberRole.member)
+ >>> member_a = mlist.subscribe(address_a, MemberRole.member)
+ >>> member_b = mlist.subscribe(address_b, MemberRole.member)
+ >>> member_c = mlist.subscribe(address_c, MemberRole.member)
+ >>> member_d = mlist.subscribe(address_d, MemberRole.member)
+ >>> member_e = mlist.subscribe(address_e, MemberRole.member)
+ >>> member_f = mlist.subscribe(address_f, MemberRole.member)
...then make some of the members digest members.
diff --git a/src/mailman/pipeline/docs/file-recips.txt b/src/mailman/pipeline/docs/file-recips.txt
index c994f820e..7d157ccc5 100644
--- a/src/mailman/pipeline/docs/file-recips.txt
+++ b/src/mailman/pipeline/docs/file-recips.txt
@@ -93,7 +93,7 @@ in the recipients list.
... 'cperson@example.com')
>>> from mailman.interfaces.member import MemberRole
- >>> address_1.subscribe(mlist, MemberRole.member)
+ >>> mlist.subscribe(address_1, MemberRole.member)
<Member: cperson@example.com on _xtest@example.com as MemberRole.member>
>>> msg = message_from_string("""\
diff --git a/src/mailman/queue/docs/digester.txt b/src/mailman/queue/docs/digester.txt
index 56aaf17c5..285b2072a 100644
--- a/src/mailman/queue/docs/digester.txt
+++ b/src/mailman/queue/docs/digester.txt
@@ -496,7 +496,7 @@ digests, or MIME digests.
>>> from mailman.interfaces.member import DeliveryMode, MemberRole
>>> def subscribe(email, mode):
... address = user_manager.create_address(email)
- ... member = address.subscribe(mlist, MemberRole.member)
+ ... member = mlist.subscribe(address, MemberRole.member)
... member.preferences.delivery_mode = mode
... return member
diff --git a/src/mailman/rules/moderation.py b/src/mailman/rules/moderation.py
index 733edd70c..5377b14a2 100644
--- a/src/mailman/rules/moderation.py
+++ b/src/mailman/rules/moderation.py
@@ -86,7 +86,7 @@ class NonmemberModeration:
address = user_manager.get_address(sender)
assert address is not None, (
'Posting address is not registered: {0}'.format(sender))
- address.subscribe(mlist, MemberRole.nonmember)
+ mlist.subscribe(address, MemberRole.nonmember)
# Do nonmember moderation check.
for sender in msg.senders:
nonmember = mlist.nonmembers.get_member(sender)
diff --git a/src/mailman/testing/helpers.py b/src/mailman/testing/helpers.py
index 2ba778813..bd52d5d6e 100644
--- a/src/mailman/testing/helpers.py
+++ b/src/mailman/testing/helpers.py
@@ -272,12 +272,12 @@ def subscribe(mlist, first_name, role=MemberRole.member):
if address is None:
person = user_manager.create_user(email, full_name)
preferred_address = list(person.addresses)[0]
- preferred_address.subscribe(mlist, role)
+ mlist.subscribe(preferred_address, role)
else:
- address.subscribe(mlist, role)
+ mlist.subscribe(address, role)
else:
preferred_address = list(person.addresses)[0]
- preferred_address.subscribe(mlist, role)
+ mlist.subscribe(preferred_address, role)
config.db.commit()