summaryrefslogtreecommitdiff
path: root/src/mailman/model/pending.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/model/pending.py')
-rw-r--r--src/mailman/model/pending.py33
1 files changed, 17 insertions, 16 deletions
diff --git a/src/mailman/model/pending.py b/src/mailman/model/pending.py
index 557361c6f..727e4f754 100644
--- a/src/mailman/model/pending.py
+++ b/src/mailman/model/pending.py
@@ -17,7 +17,7 @@
"""Implementations of the IPendable and IPending interfaces."""
-from __future__ import absolute_import, unicode_literals
+from __future__ import absolute_import, print_function, unicode_literals
__metaclass__ = type
__all__ = [
@@ -32,11 +32,12 @@ import hashlib
from lazr.config import as_timedelta
from storm.locals import DateTime, Int, RawStr, ReferenceSet, Unicode
-from zope.interface import implements
+from zope.interface import implementer
from zope.interface.verify import verifyObject
from mailman.config import config
from mailman.database.model import Model
+from mailman.database.transaction import dbconnection
from mailman.interfaces.pending import (
IPendable, IPended, IPendedKeyValue, IPendings)
from mailman.utilities.datetime import now
@@ -44,11 +45,10 @@ from mailman.utilities.modules import call_name
+@implementer(IPendedKeyValue)
class PendedKeyValue(Model):
"""A pended key/value pair, tied to a token."""
- implements(IPendedKeyValue)
-
def __init__(self, key, value):
self.key = key
self.value = value
@@ -59,11 +59,11 @@ class PendedKeyValue(Model):
pended_id = Int()
+
+@implementer(IPended)
class Pended(Model):
"""A pended event, tied to a token."""
- implements(IPended)
-
def __init__(self, token, expiration_date):
super(Pended, self).__init__()
self.token = token
@@ -76,17 +76,18 @@ class Pended(Model):
+@implementer(IPendable)
class UnpendedPendable(dict):
- implements(IPendable)
+ pass
+@implementer(IPendings)
class Pendings:
"""Implementation of the IPending interface."""
- implements(IPendings)
-
- def add(self, pendable, lifetime=None):
+ @dbconnection
+ def add(self, store, pendable, lifetime=None):
verifyObject(IPendable, pendable)
# Calculate the token and the lifetime.
if lifetime is None:
@@ -104,7 +105,7 @@ class Pendings:
token = hashlib.sha1(repr(x)).hexdigest()
# In practice, we'll never get a duplicate, but we'll be anal
# about checking anyway.
- if config.db.store.find(Pended, token=token).count() == 0:
+ if store.find(Pended, token=token).count() == 0:
break
else:
raise AssertionError('Could not find a valid pendings token')
@@ -129,11 +130,11 @@ class Pendings:
'\2'.join(value))
keyval = PendedKeyValue(key=key, value=value)
pending.key_values.add(keyval)
- config.db.store.add(pending)
+ store.add(pending)
return token
- def confirm(self, token, expunge=True):
- store = config.db.store
+ @dbconnection
+ def confirm(self, store, token, expunge=True):
# Token can come in as a unicode, but it's stored in the database as
# bytes. They must be ascii.
pendings = store.find(Pended, token=str(token))
@@ -158,8 +159,8 @@ class Pendings:
store.remove(pending)
return pendable
- def evict(self):
- store = config.db.store
+ @dbconnection
+ def evict(self, store):
right_now = now()
for pending in store.find(Pended):
if pending.expiration_date < right_now: