~barry/mailman/events-and-web

« back to all changes in this revision

Viewing changes to src/mailman/model/domain.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
"""Domains."""
19
19
 
20
 
from __future__ import unicode_literals
 
20
from __future__ import absolute_import, print_function, unicode_literals
21
21
 
22
22
__metaclass__ = type
23
23
__all__ = [
31
31
from zope.event import notify
32
32
from zope.interface import implements
33
33
 
34
 
from mailman.config import config
35
34
from mailman.database.model import Model
 
35
from mailman.database.transaction import dbconnection
36
36
from mailman.interfaces.domain import (
37
37
    BadDomainSpecificationError, DomainCreatedEvent, DomainCreatingEvent,
38
38
    DomainDeletedEvent, DomainDeletingEvent, IDomain, IDomainManager)
90
90
        return urlparse(self.base_url).scheme
91
91
 
92
92
    @property
93
 
    def mailing_lists(self):
 
93
    @dbconnection
 
94
    def mailing_lists(self, store):
94
95
        """See `IDomain`."""
95
 
        mailing_lists = config.db.store.find(
 
96
        mailing_lists = store.find(
96
97
            MailingList,
97
98
            MailingList.mail_host == self.mail_host)
98
99
        for mlist in mailing_lists:
119
120
 
120
121
    implements(IDomainManager)
121
122
 
122
 
    def add(self, mail_host,
 
123
    @dbconnection
 
124
    def add(self, store,
 
125
            mail_host,
123
126
            description=None,
124
127
            base_url=None,
125
128
            contact_address=None):
131
134
                'Duplicate email host: %s' % mail_host)
132
135
        notify(DomainCreatingEvent(mail_host))
133
136
        domain = Domain(mail_host, description, base_url, contact_address)
134
 
        config.db.store.add(domain)
 
137
        store.add(domain)
135
138
        notify(DomainCreatedEvent(domain))
136
139
        return domain
137
140
 
138
 
    def remove(self, mail_host):
 
141
    @dbconnection
 
142
    def remove(self, store, mail_host):
139
143
        domain = self[mail_host]
140
144
        notify(DomainDeletingEvent(domain))
141
 
        config.db.store.remove(domain)
 
145
        store.remove(domain)
142
146
        notify(DomainDeletedEvent(mail_host))
143
147
        return domain
144
148
 
145
 
    def get(self, mail_host, default=None):
 
149
    @dbconnection
 
150
    def get(self, store, mail_host, default=None):
146
151
        """See `IDomainManager`."""
147
 
        domains = config.db.store.find(Domain, mail_host=mail_host)
 
152
        domains = store.find(Domain, mail_host=mail_host)
148
153
        if domains.count() < 1:
149
154
            return default
150
155
        assert domains.count() == 1, (
159
164
            raise KeyError(mail_host)
160
165
        return domain
161
166
 
162
 
    def __len__(self):
163
 
        return config.db.store.find(Domain).count()
 
167
    @dbconnection
 
168
    def __len__(self, store):
 
169
        return store.find(Domain).count()
164
170
 
165
 
    def __iter__(self):
 
171
    @dbconnection
 
172
    def __iter__(self, store):
166
173
        """See `IDomainManager`."""
167
 
        for domain in config.db.store.find(Domain):
 
174
        for domain in store.find(Domain):
168
175
            yield domain
169
176
 
170
 
    def __contains__(self, mail_host):
 
177
    @dbconnection
 
178
    def __contains__(self, store, mail_host):
171
179
        """See `IDomainManager`."""
172
 
        return config.db.store.find(Domain, mail_host=mail_host).count() > 0
 
180
        return store.find(Domain, mail_host=mail_host).count() > 0