diff options
| author | Barry Warsaw | 2009-08-26 22:29:20 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2009-08-26 22:29:20 -0400 |
| commit | f14553a78083909b31e37a7454258e9ad367e0ae (patch) | |
| tree | 0e2b8a90b233ffafa170db764349c7d215cc84f6 /src | |
| parent | 9612486f46d88d2221349d12de9d61abb7bab39f (diff) | |
| download | mailman-f14553a78083909b31e37a7454258e9ad367e0ae.tar.gz mailman-f14553a78083909b31e37a7454258e9ad367e0ae.tar.zst mailman-f14553a78083909b31e37a7454258e9ad367e0ae.zip | |
Diffstat (limited to 'src')
| -rw-r--r-- | src/mailman/app/moderator.py | 11 | ||||
| -rw-r--r-- | src/mailman/config/configure.zcml | 5 | ||||
| -rw-r--r-- | src/mailman/database/__init__.py | 2 | ||||
| -rw-r--r-- | src/mailman/docs/chains.txt | 6 | ||||
| -rw-r--r-- | src/mailman/docs/messagestore.txt | 35 | ||||
| -rw-r--r-- | src/mailman/docs/requests.txt | 9 | ||||
| -rw-r--r-- | src/mailman/interfaces/database.py | 3 | ||||
| -rw-r--r-- | src/mailman/rules/docs/emergency.txt | 6 | ||||
| -rw-r--r-- | src/mailman/testing/layers.py | 7 |
9 files changed, 53 insertions, 31 deletions
diff --git a/src/mailman/app/moderator.py b/src/mailman/app/moderator.py index 7ddeb2acb..4c5a6b784 100644 --- a/src/mailman/app/moderator.py +++ b/src/mailman/app/moderator.py @@ -33,6 +33,7 @@ import logging from datetime import datetime from email.utils import formataddr, formatdate, getaddresses, make_msgid +from zope.component import getUtility from mailman import Utils from mailman import i18n @@ -44,6 +45,7 @@ from mailman.core import errors from mailman.email.message import UserNotification from mailman.interfaces.action import Action from mailman.interfaces.member import AlreadySubscribedError, DeliveryMode +from mailman.interfaces.messages import IMessageStore from mailman.interfaces.requests import RequestType @@ -84,7 +86,7 @@ def hold_message(mlist, msg, msgdata=None, reason=None): msg['Message-ID'] = message_id = unicode(make_msgid()) assert isinstance(message_id, unicode), ( 'Message-ID is not a unicode: %s' % message_id) - config.db.message_store.add(msg) + getUtility(IMessageStore).add(msg) # Prepare the message metadata with some extra information needed only by # the moderation interface. msgdata['_mod_message_id'] = message_id @@ -103,6 +105,7 @@ def hold_message(mlist, msg, msgdata=None, reason=None): def handle_message(mlist, id, action, comment=None, preserve=False, forward=None): + message_store = getUtility(IMessageStore) requestdb = config.db.requests.get_list_requests(mlist) key, msgdata = requestdb.get_request(id) # Handle the action. @@ -126,7 +129,7 @@ def handle_message(mlist, id, action, sender, comment or _('[No reason given]'), language) elif action is Action.accept: # Start by getting the message from the message store. - msg = config.db.message_store.get_message_by_id(message_id) + msg = message_store.get_message_by_id(message_id) # Delete moderation-specific entries from the message metadata. for key in msgdata.keys(): if key.startswith('_mod_'): @@ -152,7 +155,7 @@ def handle_message(mlist, id, action, # Forward the message. if forward: # Get a copy of the original message from the message store. - msg = config.db.message_store.get_message_by_id(message_id) + msg = message_store.get_message_by_id(message_id) # It's possible the forwarding address list is a comma separated list # of realname/address pairs. addresses = [addr[1] for addr in getaddresses(forward)] @@ -176,7 +179,7 @@ def handle_message(mlist, id, action, fmsg.send(mlist) # Delete the message from the message store if it is not being preserved. if not preserve: - config.db.message_store.delete_message(message_id) + message_store.delete_message(message_id) requestdb.delete_request(id) # Log the rejection if rejection: diff --git a/src/mailman/config/configure.zcml b/src/mailman/config/configure.zcml index 9a1922c69..71ddd55c0 100644 --- a/src/mailman/config/configure.zcml +++ b/src/mailman/config/configure.zcml @@ -41,4 +41,9 @@ provides="mailman.interfaces.usermanager.IUserManager" /> + <utility + factory="mailman.database.messagestore.MessageStore" + provides="mailman.interfaces.messages.IMessageStore" + /> + </configure> diff --git a/src/mailman/database/__init__.py b/src/mailman/database/__init__.py index a489cb60f..7dcd3875f 100644 --- a/src/mailman/database/__init__.py +++ b/src/mailman/database/__init__.py @@ -54,7 +54,6 @@ class StockDatabase: def __init__(self): self.url = None - self.message_store = None self.pendings = None self.requests = None self._store = None @@ -65,7 +64,6 @@ class StockDatabase: # the database at the same time. with Lock(os.path.join(config.LOCK_DIR, 'dbcreate.lck')): self._create(debug) - self.message_store = MessageStore() self.pendings = Pendings() self.requests = Requests() diff --git a/src/mailman/docs/chains.txt b/src/mailman/docs/chains.txt index 3fee28e7d..bd3a37893 100644 --- a/src/mailman/docs/chains.txt +++ b/src/mailman/docs/chains.txt @@ -235,8 +235,12 @@ The message itself is held in the message store. >>> rkey, rdata = config.db.requests.get_list_requests(mlist).get_request( ... data['id']) - >>> msg = config.db.message_store.get_message_by_id( + + >>> from mailman.interfaces.messages import IMessageStore + >>> from zope.component import getUtility + >>> msg = getUtility(IMessageStore).get_message_by_id( ... rdata['_mod_message_id']) + >>> print msg.as_string() From: aperson@example.com To: _xtest@example.com diff --git a/src/mailman/docs/messagestore.txt b/src/mailman/docs/messagestore.txt index 8c83d84c0..aabfd55fb 100644 --- a/src/mailman/docs/messagestore.txt +++ b/src/mailman/docs/messagestore.txt @@ -1,3 +1,4 @@ +================= The message store ================= @@ -7,7 +8,9 @@ message's List-Archive header to create a globally unique URI to the message object in the internet facing interface of the message store. The X-Message-ID-Hash is the Base32 SHA1 hash of the Message-ID. - >>> store = config.db.message_store + >>> from mailman.interfaces.messages import IMessageStore + >>> from zope.component import getUtility + >>> message_store = getUtility(IMessageStore) If you try to add a message to the store which is missing the Message-ID header, you will get an exception. @@ -17,7 +20,7 @@ header, you will get an exception. ... ... This message is very important. ... """) - >>> store.add(msg) + >>> message_store.add(msg) Traceback (most recent call last): ... ValueError: Exactly one Message-ID header required @@ -25,7 +28,7 @@ header, you will get an exception. However, if the message has a Message-ID header, it can be stored. >>> msg['Message-ID'] = '<87myycy5eh.fsf@uwakimon.sk.tsukuba.ac.jp>' - >>> store.add(msg) + >>> message_store.add(msg) 'AGDWSNXXKCWEILKKNYTBOHRDQGOX3Y35' >>> print msg.as_string() Subject: An important message @@ -37,20 +40,20 @@ However, if the message has a Message-ID header, it can be stored. Finding messages ----------------- +================ There are several ways to find a message given either the Message-ID or X-Message-ID-Hash headers. In either case, if no matching message is found, None is returned. - >>> print store.get_message_by_id('nothing') + >>> print message_store.get_message_by_id('nothing') None - >>> print store.get_message_by_hash('nothing') + >>> print message_store.get_message_by_hash('nothing') None Given an existing Message-ID, the message can be found. - >>> message = store.get_message_by_id(msg['message-id']) + >>> message = message_store.get_message_by_id(msg['message-id']) >>> print message.as_string() Subject: An important message Message-ID: <87myycy5eh.fsf@uwakimon.sk.tsukuba.ac.jp> @@ -61,7 +64,7 @@ Given an existing Message-ID, the message can be found. Similarly, we can find messages by the X-Message-ID-Hash: - >>> message = store.get_message_by_hash(msg['x-message-id-hash']) + >>> message = message_store.get_message_by_hash(msg['x-message-id-hash']) >>> print message.as_string() Subject: An important message Message-ID: <87myycy5eh.fsf@uwakimon.sk.tsukuba.ac.jp> @@ -72,12 +75,12 @@ Similarly, we can find messages by the X-Message-ID-Hash: Iterating over all messages ---------------------------- +=========================== The message store provides a means to iterate over all the messages it contains. - >>> messages = list(store.messages) + >>> messages = list(message_store.messages) >>> len(messages) 1 >>> print messages[0].as_string() @@ -90,13 +93,13 @@ contains. Deleting messages from the store --------------------------------- +================================ You delete a message from the storage service by providing the Message-ID for the message you want to delete. If you try to delete a Message-ID that isn't in the store, you get an exception. - >>> store.delete_message('nothing') + >>> message_store.delete_message('nothing') Traceback (most recent call last): ... LookupError: nothing @@ -104,10 +107,10 @@ in the store, you get an exception. But if you delete an existing message, it really gets deleted. >>> message_id = message['message-id'] - >>> store.delete_message(message_id) - >>> list(store.messages) + >>> message_store.delete_message(message_id) + >>> list(message_store.messages) [] - >>> print store.get_message_by_id(message_id) + >>> print message_store.get_message_by_id(message_id) None - >>> print store.get_message_by_hash(message['x-message-id-hash']) + >>> print message_store.get_message_by_hash(message['x-message-id-hash']) None diff --git a/src/mailman/docs/requests.txt b/src/mailman/docs/requests.txt index 0396c48d1..a38c0585a 100644 --- a/src/mailman/docs/requests.txt +++ b/src/mailman/docs/requests.txt @@ -346,7 +346,12 @@ is deleted. ... """) >>> id_4 = moderator.hold_message(mlist, msg, {}, 'Needs approval') >>> moderator.handle_message(mlist, id_4, Action.discard) - >>> print config.db.message_store.get_message_by_id('<12345>') + + >>> from mailman.interfaces.messages import IMessageStore + >>> from zope.component import getUtility + >>> message_store = getUtility(IMessageStore) + + >>> print message_store.get_message_by_id('<12345>') None But if we ask to preserve the message when we discard it, it will be held in @@ -354,7 +359,7 @@ the message store after disposition. >>> id_4 = moderator.hold_message(mlist, msg, {}, 'Needs approval') >>> moderator.handle_message(mlist, id_4, Action.discard, preserve=True) - >>> stored_msg = config.db.message_store.get_message_by_id('<12345>') + >>> stored_msg = message_store.get_message_by_id('<12345>') >>> print stored_msg.as_string() From: aperson@example.org To: alist@example.com diff --git a/src/mailman/interfaces/database.py b/src/mailman/interfaces/database.py index 2cf56e800..19f1d95f0 100644 --- a/src/mailman/interfaces/database.py +++ b/src/mailman/interfaces/database.py @@ -84,8 +84,5 @@ class IDatabase(Interface): def abort(): """Abort the current transaction.""" - message_store = Attribute( - """The IMessageStore instance provided by the database layer.""") - pendings = Attribute( """The IPending instance provided by the database layer.""") diff --git a/src/mailman/rules/docs/emergency.txt b/src/mailman/rules/docs/emergency.txt index 2c56d967b..26f10365f 100644 --- a/src/mailman/rules/docs/emergency.txt +++ b/src/mailman/rules/docs/emergency.txt @@ -29,6 +29,10 @@ pending requests. >>> virginq = config.switchboards['virgin'] + >>> from mailman.interfaces.messages import IMessageStore + >>> from zope.component import getUtility + >>> message_store = getUtility(IMessageStore) + >>> def get_held_message(): ... import re ... qfiles = [] @@ -48,7 +52,7 @@ pending requests. ... data = config.db.pendings.confirm(cookie) ... requestdb = config.db.requests.get_list_requests(mlist) ... rkey, rdata = requestdb.get_request(data['id']) - ... return config.db.message_store.get_message_by_id( + ... return message_store.get_message_by_id( ... rdata['_mod_message_id']) >>> msg = get_held_message() diff --git a/src/mailman/testing/layers.py b/src/mailman/testing/layers.py index 540b2e013..c4968ca40 100644 --- a/src/mailman/testing/layers.py +++ b/src/mailman/testing/layers.py @@ -38,12 +38,14 @@ import tempfile from pkg_resources import resource_string from textwrap import dedent from urllib2 import urlopen, URLError +from zope.component import getUtility from mailman.config import config from mailman.core import initialize from mailman.core.logging import get_handler from mailman.i18n import _ from mailman.interfaces.domain import IDomainManager +from mailman.interfaces.messages import IMessageStore from mailman.testing.helpers import SMTPServer, TestableMaster from mailman.utilities.datetime import factory from mailman.utilities.string import expand @@ -177,8 +179,9 @@ class ConfigLayer(MockAndMonkeyLayer): for filename in filenames: os.remove(os.path.join(dirpath, filename)) # Clear out messages in the message store. - for message in config.db.message_store.messages: - config.db.message_store.delete_message(message['message-id']) + message_store = getUtility(IMessageStore) + for message in message_store.messages: + message_store.delete_message(message['message-id']) config.db.commit() # Reset the global style manager. config.style_manager.populate() |
