summaryrefslogtreecommitdiff
path: root/src/mailman/model/mailinglist.py
diff options
context:
space:
mode:
authorBarry Warsaw2011-04-17 11:37:06 -0400
committerBarry Warsaw2011-04-17 11:37:06 -0400
commitc2130f46808b3cf3cc27311d6d6f6b608e76b267 (patch)
treef020d0d8034f0e21bc3f00787e5d3b7f447954e5 /src/mailman/model/mailinglist.py
parentc894152772595a1acbd6dc4c1ac0e033888ea923 (diff)
parente2ed3ae7dfa138a8288b4c49cd2b671c35f6c703 (diff)
downloadmailman-c2130f46808b3cf3cc27311d6d6f6b608e76b267.tar.gz
mailman-c2130f46808b3cf3cc27311d6d6f6b608e76b267.tar.zst
mailman-c2130f46808b3cf3cc27311d6d6f6b608e76b267.zip
IUsers can now have a preferred email address, which must be verified. A user
can now subscribe to a mailing list, in which case, their preferred address will be used for the appropriate roster. Users cannot subscribe to a mailing list more than once, but they can still subscribe even if their preferred address is subscribed, and if a user is subscribed, an address they control can still be explicitly subscribed. Other changes: * .subscribe() is moved from the IAddress to the IMailingList * IUser.address and .user are now properties * Added IUser.preferred_address which is a get/set/del property
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):