~barry/mailman/events-and-web

« back to all changes in this revision

Viewing changes to src/mailman/model/pending.py

  • Committer: Barry Warsaw
  • Date: 2012-04-22 21:33:33 UTC
  • mfrom: (7150.1.11 transactions)
  • Revision ID: barry@list.org-20120422213333-3skjqsjktooesgsl
Several non-functional improvements to the code base.

Reduce the explicit use of the config.db global by introducing two new
helpers:
 - A new transaction() context manager which will commit the transaction on
   successful exit, otherwise it will abort the transaction
 - A new dbconnection decorator which calls the decorated method with the
   Storm store object as the first argument (after self).  This can be used
   instead of config.db.store.

By reducing the explicit use of this global, we have a better chance of
refactoring it away in the future.  Still TODO: runner.py and lmtp.py.

Be explicit about the `store` attribute on the IDatabase interface.

More consistent use of __future__ imports.

Remove an obsolete command line script.

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
 
18
18
"""Implementations of the IPendable and IPending interfaces."""
19
19
 
20
 
from __future__ import absolute_import, unicode_literals
 
20
from __future__ import absolute_import, print_function, unicode_literals
21
21
 
22
22
__metaclass__ = type
23
23
__all__ = [
37
37
 
38
38
from mailman.config import config
39
39
from mailman.database.model import Model
 
40
from mailman.database.transaction import dbconnection
40
41
from mailman.interfaces.pending import (
41
42
    IPendable, IPended, IPendedKeyValue, IPendings)
42
43
from mailman.utilities.datetime import now
86
87
 
87
88
    implements(IPendings)
88
89
 
89
 
    def add(self, pendable, lifetime=None):
 
90
    @dbconnection
 
91
    def add(self, store, pendable, lifetime=None):
90
92
        verifyObject(IPendable, pendable)
91
93
        # Calculate the token and the lifetime.
92
94
        if lifetime is None:
104
106
            token = hashlib.sha1(repr(x)).hexdigest()
105
107
            # In practice, we'll never get a duplicate, but we'll be anal
106
108
            # about checking anyway.
107
 
            if config.db.store.find(Pended, token=token).count() == 0:
 
109
            if store.find(Pended, token=token).count() == 0:
108
110
                break
109
111
        else:
110
112
            raise AssertionError('Could not find a valid pendings token')
129
131
                         '\2'.join(value))
130
132
            keyval = PendedKeyValue(key=key, value=value)
131
133
            pending.key_values.add(keyval)
132
 
        config.db.store.add(pending)
 
134
        store.add(pending)
133
135
        return token
134
136
 
135
 
    def confirm(self, token, expunge=True):
136
 
        store = config.db.store
 
137
    @dbconnection
 
138
    def confirm(self, store, token, expunge=True):
137
139
        # Token can come in as a unicode, but it's stored in the database as
138
140
        # bytes.  They must be ascii.
139
141
        pendings = store.find(Pended, token=str(token))
158
160
            store.remove(pending)
159
161
        return pendable
160
162
 
161
 
    def evict(self):
162
 
        store = config.db.store
 
163
    @dbconnection
 
164
    def evict(self, store):
163
165
        right_now = now()
164
166
        for pending in store.find(Pended):
165
167
            if pending.expiration_date < right_now: