diff options
Diffstat (limited to 'src/mailman/model')
| -rw-r--r-- | src/mailman/model/docs/membership.rst | 23 | ||||
| -rw-r--r-- | src/mailman/model/mailinglist.py | 5 | ||||
| -rw-r--r-- | src/mailman/model/member.py | 6 |
3 files changed, 32 insertions, 2 deletions
diff --git a/src/mailman/model/docs/membership.rst b/src/mailman/model/docs/membership.rst index 3286bfe6e..f257f25ce 100644 --- a/src/mailman/model/docs/membership.rst +++ b/src/mailman/model/docs/membership.rst @@ -315,3 +315,26 @@ Now her membership reflects the new address. >>> for m in bee.members.members: ... print m.member_id.int, m.mailing_list.list_id, m.address.email 7 bee.example.com gperson@example.com + + +Events +====== + +An event is triggered when a new member is subscribed to a mailing list. +:: + + >>> from mailman.testing.helpers import event_subscribers + >>> def handle_event(event): + ... print event + + >>> cat = create_list('cat@example.com') + >>> herb = user_manager.create_address('herb@example.com') + >>> with event_subscribers(handle_event): + ... member = cat.subscribe(herb) + herb@example.com joined cat.example.com + +An event is triggered when a member is unsubscribed from a mailing list. + + >>> with event_subscribers(handle_event): + ... member.unsubscribe() + herb@example.com left cat.example.com diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py index 2c55540be..324e1a1c8 100644 --- a/src/mailman/model/mailinglist.py +++ b/src/mailman/model/mailinglist.py @@ -33,6 +33,7 @@ from storm.locals import ( TimeDelta, Unicode) from urlparse import urljoin from zope.component import getUtility +from zope.event import notify from zope.interface import implementer from mailman.config import config @@ -50,7 +51,8 @@ from mailman.interfaces.mailinglist import ( IAcceptableAlias, IAcceptableAliasSet, IMailingList, Personalization, ReplyToMunging) from mailman.interfaces.member import ( - AlreadySubscribedError, MemberRole, MissingPreferredAddressError) + AlreadySubscribedError, MemberRole, MissingPreferredAddressError, + SubscriptionEvent) from mailman.interfaces.mime import FilterType from mailman.interfaces.nntp import NewsgroupModeration from mailman.interfaces.user import IUser @@ -493,6 +495,7 @@ class MailingList(Model): subscriber=subscriber) member.preferences = Preferences() store.add(member) + notify(SubscriptionEvent(self, member)) return member diff --git a/src/mailman/model/member.py b/src/mailman/model/member.py index 76fe2f992..c189983b9 100644 --- a/src/mailman/model/member.py +++ b/src/mailman/model/member.py @@ -27,6 +27,7 @@ __all__ = [ from storm.locals import Int, Reference, Unicode from storm.properties import UUID from zope.component import getUtility +from zope.event import notify from zope.interface import implementer from mailman.core.constants import system_preferences @@ -36,7 +37,8 @@ from mailman.database.types import Enum from mailman.interfaces.action import Action from mailman.interfaces.address import IAddress from mailman.interfaces.listmanager import IListManager -from mailman.interfaces.member import IMember, MemberRole, MembershipError +from mailman.interfaces.member import ( + IMember, MemberRole, MembershipError, UnsubscriptionEvent) from mailman.interfaces.user import IUser, UnverifiedAddressError from mailman.interfaces.usermanager import IUserManager from mailman.utilities.uid import UniqueIDFactory @@ -186,5 +188,7 @@ class Member(Model): @dbconnection def unsubscribe(self, store): """See `IMember`.""" + # Yes, this must get triggered before self is deleted. + notify(UnsubscriptionEvent(self.mailing_list, self)) store.remove(self.preferences) store.remove(self) |
