~barry/mailman/events-and-web

« back to all changes in this revision

Viewing changes to src/mailman/model/bans.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
"""Ban manager."""
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 storm.locals import Int, Unicode
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.bans import IBan, IBanManager
36
36
 
37
37
 
53
53
class BanManager:
54
54
    implements(IBanManager)
55
55
 
56
 
    def ban(self, email, mailing_list=None):
 
56
    @dbconnection
 
57
    def ban(self, store, email, mailing_list=None):
57
58
        """See `IBanManager`."""
58
 
        bans = config.db.store.find(
59
 
            Ban, email=email, mailing_list=mailing_list)
 
59
        bans = store.find(Ban, email=email, mailing_list=mailing_list)
60
60
        if bans.count() == 0:
61
61
            ban = Ban(email, mailing_list)
62
 
            config.db.store.add(ban)
 
62
            store.add(ban)
63
63
 
64
 
    def unban(self, email, mailing_list=None):
 
64
    @dbconnection
 
65
    def unban(self, store, email, mailing_list=None):
65
66
        """See `IBanManager`."""
66
 
        ban = config.db.store.find(
67
 
            Ban, email=email, mailing_list=mailing_list).one()
 
67
        ban = store.find(Ban, email=email, mailing_list=mailing_list).one()
68
68
        if ban is not None:
69
 
            config.db.store.remove(ban)
 
69
            store.remove(ban)
70
70
 
71
 
    def is_banned(self, email, mailing_list=None):
 
71
    @dbconnection
 
72
    def is_banned(self, store, email, mailing_list=None):
72
73
        """See `IBanManager`."""
73
74
        # A specific mailing list ban is being checked, however the email
74
75
        # address could be banned specifically, or globally.
75
76
        if mailing_list is not None:
76
77
            # Try specific bans first.
77
 
            bans = config.db.store.find(
78
 
                Ban, email=email, mailing_list=mailing_list)
 
78
            bans = store.find(Ban, email=email, mailing_list=mailing_list)
79
79
            if bans.count() > 0:
80
80
                return True
81
81
            # Try global bans next.
82
 
            bans = config.db.store.find(Ban, email=email, mailing_list=None)
 
82
            bans = store.find(Ban, email=email, mailing_list=None)
83
83
            if bans.count() > 0:
84
84
                return True
85
85
            # Now try specific mailing list bans, but with a pattern.
86
 
            bans = config.db.store.find(Ban, mailing_list=mailing_list)
 
86
            bans = store.find(Ban, mailing_list=mailing_list)
87
87
            for ban in bans:
88
88
                if (ban.email.startswith('^') and
89
89
                    re.match(ban.email, email, re.IGNORECASE) is not None):
90
90
                    return True
91
91
            # And now try global pattern bans.
92
 
            bans = config.db.store.find(Ban, mailing_list=None)
 
92
            bans = store.find(Ban, mailing_list=None)
93
93
            for ban in bans:
94
94
                if (ban.email.startswith('^') and
95
95
                    re.match(ban.email, email, re.IGNORECASE) is not None):
97
97
        else:
98
98
            # The client is asking for global bans.  Look up bans on the
99
99
            # specific email address first.
100
 
            bans = config.db.store.find(
101
 
                Ban, email=email, mailing_list=None)
 
100
            bans = store.find(Ban, email=email, mailing_list=None)
102
101
            if bans.count() > 0:
103
102
                return True
104
103
            # And now look for global pattern bans.
105
 
            bans = config.db.store.find(Ban, mailing_list=None)
 
104
            bans = store.find(Ban, mailing_list=None)
106
105
            for ban in bans:
107
106
                if (ban.email.startswith('^') and
108
107
                    re.match(ban.email, email, re.IGNORECASE) is not None):