summaryrefslogtreecommitdiff
path: root/src/mailman/model
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/model')
-rw-r--r--src/mailman/model/tests/test_usermanager.py28
-rw-r--r--src/mailman/model/usermanager.py10
2 files changed, 36 insertions, 2 deletions
diff --git a/src/mailman/model/tests/test_usermanager.py b/src/mailman/model/tests/test_usermanager.py
index 754acb610..7b5b490e1 100644
--- a/src/mailman/model/tests/test_usermanager.py
+++ b/src/mailman/model/tests/test_usermanager.py
@@ -24,7 +24,10 @@ from mailman.config import config
from mailman.interfaces.address import ExistingAddressError
from mailman.interfaces.autorespond import IAutoResponseSet, Response
from mailman.interfaces.member import DeliveryMode
-from mailman.interfaces.usermanager import IUserManager
+from mailman.interfaces.usermanager import (
+ AddressCreatedEvent, AddressCreatingEvent, AddressDeletedEvent,
+ AddressDeletingEvent, IUserManager)
+from mailman.testing.helpers import event_subscribers
from mailman.testing.layers import ConfigLayer
from mailman.utilities.datetime import now
from zope.component import getUtility
@@ -35,6 +38,29 @@ class TestUserManager(unittest.TestCase):
def setUp(self):
self._usermanager = getUtility(IUserManager)
+ self._events = []
+
+ def _record_event(self, event):
+ self._events.append(event)
+
+ def test_create_address_event(self):
+ with event_subscribers(self._record_event):
+ address = self._usermanager.create_address('anne@example.com')
+ self.assertEqual(len(self._events), 2)
+ self.assertIsInstance(self._events[0], AddressCreatingEvent)
+ self.assertEqual(self._events[0].email, 'anne@example.com')
+ self.assertIsInstance(self._events[1], AddressCreatedEvent)
+ self.assertEqual(self._events[1].address, address)
+
+ def test_delete_address_event(self):
+ address = self._usermanager.create_address('anne@example.com')
+ with event_subscribers(self._record_event):
+ self._usermanager.delete_address(address)
+ self.assertEqual(len(self._events), 2)
+ self.assertIsInstance(self._events[0], AddressDeletingEvent)
+ self.assertEqual(self._events[0].address, address)
+ self.assertIsInstance(self._events[1], AddressDeletedEvent)
+ self.assertEqual(self._events[1].email, 'anne@example.com')
def test_create_user_with_existing_address(self):
# LP: #1418280. If a user is created when an email address is passed
diff --git a/src/mailman/model/usermanager.py b/src/mailman/model/usermanager.py
index 24b3a355e..6f5d5b774 100644
--- a/src/mailman/model/usermanager.py
+++ b/src/mailman/model/usermanager.py
@@ -19,7 +19,9 @@
from mailman.database.transaction import dbconnection
from mailman.interfaces.address import ExistingAddressError
-from mailman.interfaces.usermanager import IUserManager
+from mailman.interfaces.usermanager import (
+ AddressCreatedEvent, AddressCreatingEvent, AddressDeletedEvent,
+ AddressDeletingEvent, IUserManager)
from mailman.model.address import Address
from mailman.model.autorespond import AutoResponseRecord
from mailman.model.digests import OneLastDigest
@@ -27,6 +29,7 @@ from mailman.model.member import Member
from mailman.model.preferences import Preferences
from mailman.model.user import User
from public import public
+from zope.event import notify
from zope.interface import implementer
@@ -104,6 +107,7 @@ class UserManager:
@dbconnection
def create_address(self, store, email, display_name=None):
"""See `IUserManager`."""
+ notify(AddressCreatingEvent(email))
addresses = store.query(Address).filter(Address.email == email.lower())
if addresses.count() == 1:
found = addresses[0]
@@ -116,6 +120,7 @@ class UserManager:
address = Address(email, display_name)
address.preferences = Preferences()
store.add(address)
+ notify(AddressCreatedEvent(address))
return address
@dbconnection
@@ -123,6 +128,8 @@ class UserManager:
"""See `IUserManager`."""
# If there's a user controlling this address, it has to first be
# unlinked before the address can be deleted.
+ email = address.email
+ notify(AddressDeletingEvent(address))
if address.user:
address.user.unlink(address)
# Remove memberships.
@@ -134,6 +141,7 @@ class UserManager:
store.query(OneLastDigest).filter_by(address=address).delete()
# Now delete the address.
store.delete(address)
+ notify(AddressDeletedEvent(email))
@dbconnection
def get_address(self, store, email):