summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/moderator.py11
-rw-r--r--src/mailman/config/configure.zcml5
-rw-r--r--src/mailman/database/__init__.py2
-rw-r--r--src/mailman/docs/chains.txt6
-rw-r--r--src/mailman/docs/messagestore.txt35
-rw-r--r--src/mailman/docs/requests.txt9
-rw-r--r--src/mailman/interfaces/database.py3
-rw-r--r--src/mailman/rules/docs/emergency.txt6
-rw-r--r--src/mailman/testing/layers.py7
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()