~barry/mailman/events-and-web

« back to all changes in this revision

Viewing changes to src/mailman/model/user.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
"""Model for users."""
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__ = [
30
30
from zope.event import notify
31
31
from zope.interface import implements
32
32
 
33
 
from mailman.config import config
34
33
from mailman.database.model import Model
 
34
from mailman.database.transaction import dbconnection
35
35
from mailman.interfaces.address import (
36
36
    AddressAlreadyLinkedError, AddressNotLinkedError)
37
37
from mailman.interfaces.user import (
64
64
    preferences_id = Int()
65
65
    preferences = Reference(preferences_id, 'Preferences.id')
66
66
 
67
 
    def __init__(self, display_name=None, preferences=None):
 
67
    @dbconnection
 
68
    def __init__(self, store, display_name=None, preferences=None):
68
69
        super(User, self).__init__()
69
70
        self._created_on = date_factory.now()
70
71
        user_id = uid_factory.new_uid()
71
 
        assert config.db.store.find(User, _user_id=user_id).count() == 0, (
 
72
        assert store.find(User, _user_id=user_id).count() == 0, (
72
73
            'Duplicate user id {0}'.format(user_id))
73
74
        self._user_id = user_id
74
75
        self.display_name = ('' if display_name is None else display_name)
75
76
        self.preferences = preferences
76
 
        config.db.store.add(self)
 
77
        store.add(self)
77
78
 
78
79
    def __repr__(self):
79
80
        short_user_id = self.user_id.int
135
136
        """See `IUser`."""
136
137
        self._preferred_address = None
137
138
 
138
 
    def controls(self, email):
 
139
    @dbconnection
 
140
    def controls(self, store, email):
139
141
        """See `IUser`."""
140
 
        found = config.db.store.find(Address, email=email)
 
142
        found = store.find(Address, email=email)
141
143
        if found.count() == 0:
142
144
            return False
143
145
        assert found.count() == 1, 'Unexpected count'
144
146
        return found[0].user is self
145
147
 
146
 
    def register(self, email, display_name=None):
 
148
    @dbconnection
 
149
    def register(self, store, email, display_name=None):
147
150
        """See `IUser`."""
148
151
        # First, see if the address already exists
149
 
        address = config.db.store.find(Address, email=email).one()
 
152
        address = store.find(Address, email=email).one()
150
153
        if address is None:
151
154
            if display_name is None:
152
155
                display_name = ''