~barry/mailman/events-and-web

« back to all changes in this revision

Viewing changes to src/mailman/model/uid.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
"""Unique IDs."""
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__ = [
28
28
from storm.locals import Int
29
29
from storm.properties import UUID
30
30
 
31
 
from mailman.config import config
32
31
from mailman.database.model import Model
 
32
from mailman.database.transaction import dbconnection
33
33
 
34
34
 
35
35
 
48
48
    id = Int(primary=True)
49
49
    uid = UUID()
50
50
 
51
 
    def __init__(self, uid):
 
51
    @dbconnection
 
52
    def __init__(self, store, uid):
52
53
        super(UID, self).__init__()
53
54
        self.uid = uid
54
 
        config.db.store.add(self)
 
55
        store.add(self)
55
56
 
56
57
    def __repr__(self):
57
58
        return '<UID {0} at {1}>'.format(self.uid, id(self))
58
59
 
59
60
    @staticmethod
60
 
    def record(uid):
 
61
    @dbconnection
 
62
    # Note that the parameter order is deliberate reversed here.  Normally,
 
63
    # `store` is the first parameter after `self`, but since this is a
 
64
    # staticmethod and there is no self, the decorator will see the uid in
 
65
    # arg[0].
 
66
    def record(uid, store):
61
67
        """Record the uid in the database.
62
68
 
63
69
        :param uid: The unique id.
64
70
        :type uid: unicode
65
71
        :raises ValueError: if the id is not unique.
66
72
        """
67
 
        existing = config.db.store.find(UID, uid=uid)
 
73
        existing = store.find(UID, uid=uid)
68
74
        if existing.count() != 0:
69
75
            raise ValueError(uid)
70
76
        return UID(uid)