diff options
Diffstat (limited to 'src/mailman/model')
| -rw-r--r-- | src/mailman/model/tests/test_usermanager.py | 28 | ||||
| -rw-r--r-- | src/mailman/model/usermanager.py | 10 |
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): |
