diff options
Diffstat (limited to 'src/mailman/model/mailinglist.py')
| -rw-r--r-- | src/mailman/model/mailinglist.py | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index 488b6da3d..2b205775e 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -38,15 +38,19 @@ from zope.interface import implements from mailman.config import config from mailman.database.model import Model from mailman.database.types import Enum +from mailman.interfaces.address import IAddress 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.interfaces.user import IUser 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 +445,36 @@ class MailingList(Model): raise TypeError( 'Undefined MemberRole: {0}'.format(role)) + def subscribe(self, subscriber, role=MemberRole.member): + """See `IMailingList`.""" + store = Store.of(self) + if IAddress.providedBy(subscriber): + member = store.find( + Member, + Member.role == role, + Member.mailing_list == self.fqdn_listname, + Member._address == subscriber).one() + if member: + raise AlreadySubscribedError( + self.fqdn_listname, subscriber.email, role) + elif IUser.providedBy(subscriber): + member = store.find( + Member, + Member.role == role, + Member.mailing_list == self.fqdn_listname, + Member._user == subscriber).one() + if member: + raise AlreadySubscribedError( + self.fqdn_listname, subscriber, role) + else: + raise ValueError('subscriber must be an address or user') + member = Member(role=role, + mailing_list=self.fqdn_listname, + subscriber=subscriber) + member.preferences = Preferences() + store.add(member) + return member + class AcceptableAlias(Model): |
