diff options
| author | Barry Warsaw | 2011-04-17 11:37:06 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2011-04-17 11:37:06 -0400 |
| commit | c2130f46808b3cf3cc27311d6d6f6b608e76b267 (patch) | |
| tree | f020d0d8034f0e21bc3f00787e5d3b7f447954e5 /src/mailman/model/mailinglist.py | |
| parent | c894152772595a1acbd6dc4c1ac0e033888ea923 (diff) | |
| parent | e2ed3ae7dfa138a8288b4c49cd2b671c35f6c703 (diff) | |
| download | mailman-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.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): |
