diff options
| author | Barry Warsaw | 2012-04-07 15:46:05 -0600 |
|---|---|---|
| committer | Barry Warsaw | 2012-04-07 15:46:05 -0600 |
| commit | 98169dac0fc89c4846b8396373b58be34c749f8e (patch) | |
| tree | 1b395d3cee3f18c4957e7c41db95ef6678910ee2 | |
| parent | ed3902b06ac0fc9595bbf1d5c17349e3b9735278 (diff) | |
| download | mailman-98169dac0fc89c4846b8396373b58be34c749f8e.tar.gz mailman-98169dac0fc89c4846b8396373b58be34c749f8e.tar.zst mailman-98169dac0fc89c4846b8396373b58be34c749f8e.zip | |
| -rw-r--r-- | src/mailman/docs/NEWS.rst | 2 | ||||
| -rw-r--r-- | src/mailman/interfaces/address.py | 15 | ||||
| -rw-r--r-- | src/mailman/model/address.py | 14 | ||||
| -rw-r--r-- | src/mailman/model/docs/addresses.rst | 31 |
4 files changed, 57 insertions, 5 deletions
diff --git a/src/mailman/docs/NEWS.rst b/src/mailman/docs/NEWS.rst index 37113c18d..aaf630c45 100644 --- a/src/mailman/docs/NEWS.rst +++ b/src/mailman/docs/NEWS.rst @@ -27,6 +27,8 @@ Architecture can can safely remove `$var_dir/queue/news`. * A mailing list's *moderator password* is no longer stored in the clear; it is hashed with the currently selected scheme. + * An `AddressVerificationEvent` is triggered when an `IAddress` is verified + or unverified. (LP: #975698) Configuration ------------- diff --git a/src/mailman/interfaces/address.py b/src/mailman/interfaces/address.py index cf2c50bf4..38a490839 100644 --- a/src/mailman/interfaces/address.py +++ b/src/mailman/interfaces/address.py @@ -24,6 +24,7 @@ __all__ = [ 'AddressAlreadyLinkedError', 'AddressError', 'AddressNotLinkedError', + 'AddressVerificationEvent', 'EmailError', 'ExistingAddressError', 'IAddress', @@ -81,6 +82,20 @@ class InvalidEmailAddressError(EmailError): +class AddressVerificationEvent: + """Triggered when an address gets verified or unverified.""" + + def __init__(self, address): + self.address = address + + def __str__(self): + return '<AddressVerificationEvent {0} {1}>'.format( + self.address.email, + ('unverified' if self.address.verified_on is None + else self.address.verified_on)) + + + class IAddress(Interface): """Email address related information.""" diff --git a/src/mailman/model/address.py b/src/mailman/model/address.py index a0a13a16b..a12a993a8 100644 --- a/src/mailman/model/address.py +++ b/src/mailman/model/address.py @@ -27,10 +27,11 @@ __all__ = [ from email.utils import formataddr from storm.locals import DateTime, Int, Reference, Unicode +from zope.event import notify from zope.interface import implements from mailman.database.model import Model -from mailman.interfaces.address import IAddress +from mailman.interfaces.address import AddressVerificationEvent, IAddress from mailman.utilities.datetime import now @@ -42,7 +43,7 @@ class Address(Model): email = Unicode() _original = Unicode() display_name = Unicode() - verified_on = DateTime() + _verified_on = DateTime(name='verified_on') registered_on = DateTime() user_id = Int() @@ -73,5 +74,14 @@ class Address(Model): address_str, verified, self.email, id(self)) @property + def verified_on(self): + return self._verified_on + + @verified_on.setter + def verified_on(self, timestamp): + self._verified_on = timestamp + notify(AddressVerificationEvent(self)) + + @property def original_email(self): return (self.email if self._original is None else self._original) diff --git a/src/mailman/model/docs/addresses.rst b/src/mailman/model/docs/addresses.rst index dfeac2b2a..b29ae658b 100644 --- a/src/mailman/model/docs/addresses.rst +++ b/src/mailman/model/docs/addresses.rst @@ -122,8 +122,8 @@ address from the user. bperson@example.com -Registration and validation -=========================== +Registration and verification +============================= Addresses have two dates, the date the address was registered on and the date the address was validated on. The former is set when the address is created, @@ -144,11 +144,36 @@ verification procedure. It takes a datetime object. >>> print address_4.verified_on 2005-08-01 07:49:23 -The address shows the verified status in its repr. +The address shows the verified status in its representation. >>> address_4 <Address: Dan Person <dperson@example.com> [verified] at ...> +An event is triggered when the address gets verified. + + >>> saved_event = None + >>> address_5 = user_manager.create_address( + ... 'eperson@example.com', 'Elle Person') + >>> def save_event(event): + ... global saved_event + ... saved_event = event + >>> from mailman.testing.helpers import event_subscribers + >>> with event_subscribers(save_event): + ... address_5.verified_on = now() + >>> print saved_event + <AddressVerificationEvent eperson@example.com 2005-08-01 07:49:23> + +An event is also triggered when the address is unverified. In this case, +check the event's address's `verified_on` attribute; if this is None, then the +address is being unverified. + + >>> with event_subscribers(save_event): + ... address_5.verified_on = None + >>> print saved_event + <AddressVerificationEvent eperson@example.com unverified> + >>> print saved_event.address.verified_on + None + Case-preserved addresses ======================== |
