summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBarry Warsaw2012-04-07 15:46:05 -0600
committerBarry Warsaw2012-04-07 15:46:05 -0600
commit98169dac0fc89c4846b8396373b58be34c749f8e (patch)
tree1b395d3cee3f18c4957e7c41db95ef6678910ee2
parented3902b06ac0fc9595bbf1d5c17349e3b9735278 (diff)
downloadmailman-98169dac0fc89c4846b8396373b58be34c749f8e.tar.gz
mailman-98169dac0fc89c4846b8396373b58be34c749f8e.tar.zst
mailman-98169dac0fc89c4846b8396373b58be34c749f8e.zip
-rw-r--r--src/mailman/docs/NEWS.rst2
-rw-r--r--src/mailman/interfaces/address.py15
-rw-r--r--src/mailman/model/address.py14
-rw-r--r--src/mailman/model/docs/addresses.rst31
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
========================