summaryrefslogtreecommitdiff
path: root/src/mailman/model/mailinglist.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/model/mailinglist.py')
-rw-r--r--src/mailman/model/mailinglist.py36
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):