summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--docs/NEWS.txt421
-rw-r--r--src/attic/add_members.py (renamed from src/mailman/bin/add_members.py)0
-rw-r--r--src/mailman/Archiver/HyperArch.py3
-rw-r--r--src/mailman/app/lifecycle.py5
-rw-r--r--src/mailman/app/registrar.py3
-rw-r--r--src/mailman/bin/inject.py3
-rw-r--r--src/mailman/commands/cli_lists.py6
-rw-r--r--src/mailman/commands/cli_members.py3
-rw-r--r--src/mailman/config/configure.zcml6
-rw-r--r--src/mailman/database/__init__.py2
-rw-r--r--src/mailman/database/listmanager.py20
11 files changed, 247 insertions, 225 deletions
diff --git a/docs/NEWS.txt b/docs/NEWS.txt
index 16e10dd8b..d2226687a 100644
--- a/docs/NEWS.txt
+++ b/docs/NEWS.txt
@@ -1,257 +1,262 @@
+================================================
Mailman - The GNU Mailing List Management System
+================================================
+
Copyright (C) 1998-2009 by the Free Software Foundation, Inc.
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA
Here is a history of user visible changes to Mailman.
3.0 alpha 3 -- "Working Man"
-(XX-XXX-200X)
-
- Architecture
-
- - Back port of Mailman 2.1's limit on .bak file restoration. After 3
- restores, the file is moved to the bad queue, with a .psv extension.
-
-
-3.0 alpha 2 -- "Grand Designs"
-(03-Jan-2009)
-
- Licensing
-
- - Mailman 3 is now licensed under the GPLv3.
-
- Bug fixes
+============================
- - Changed bin/arch to attempt to open the mbox before wiping the old
- archive. Launchpad bug #280418.
+Configuration
+-------------
+ * Configuration is now done through lazr.config. Defaults.py is
+ dead. lazr.config files are essentially hierarchical ini files.
+ * Domains are now stored in the database instead of in the configuration file.
+ * pre- and post- initialization hooks are now available to plugins. Specify
+ additional hooks to run in the configuration file.
+ * Add the environment variable $MAILMAN_CONFIG_FILE which overrides the -C
+ command line option.
+ * Make LMTP more compliant with Postfix docs (Patrick Koetter)
+ * Added a NullMTA for mail servers like Exim which just work automatically.
- - Added digest.mbox and pending.pck to the 'list' files checked by
- check_perms. Launchpad bug #284802.
+Architecture
+------------
- Architecture
+ * 'bin/mailman' is a new super-command for managing Mailman from the command
+ line. Some older bin scripts have been converted, with more to come.
+ * Mailman now has an administrative REST interface which can be used to get
+ information from and manage Mailman remotely.
+ * Back port of Mailman 2.1's limit on .bak file restoration. After 3
+ restores, the file is moved to the bad queue, with a .psv extension. (Mark
+ Sapiro)
+ * Digest creation is moved into a new queue runner so it doesn't block main
+ message processing.
- - Converted to using zope.testing as the test infrastructure. Use bin/test
- now to run the full test suite.
- <http://pypi.python.org/pypi/zope.testing/3.7.1>
+Other changes
+-------------
+ * bin/make_instance is no longer necessary, and removed
+ * The debug log is turned up to info by default to reduce log file spam.
- - Partially converted to using lazr.config as the new configuration
- regime. Not everything has been converted yet, so some manual editing
- of mailman/Defaults.py is required. This will be rectified in future
- versions. <http://launchpad.net/lazr.config>
+Building and installation
+-------------------------
+ * All doc tests can now be turned into documentation, via Sphinx. Just run
+ bin/docs after bin/buildout.
- - All web-related stuff is moved to its own directory, effectively moving
- it out of the way for now.
- - The email command infrastructure has been reworked to play more nicely
- with the plug-in architecture. Not all commands have yet been
- converted.
-
- Other changes
+3.0 alpha 2 -- "Grand Designs"
+==============================
+(03-Jan-2009)
- - The LMTP server now properly calculates the message's original size.
+Licensing
+---------
- - For command line scripts, -C names the configuration file to use. For
- convenient testing, if -C is not given, then the environment variable
- MAILMAN_CONFIG_FILE is consulted.
+ * Mailman 3 is now licensed under the GPLv3.
- - Support added for a local MHonArc archiver, as well as archiving
- automatically in the remote Mail-Archive.com service.
+Bug fixes
+---------
- - The permalink proposal for supporting RFC 5064 has been adopted.
+ * Changed bin/arch to attempt to open the mbox before wiping the old
+ archive. Launchpad bug #280418.
- - Mailing lists no longer have a .web_page_url attribute; this is taken
- from the mailing list's domain's base_url attribute.
+ * Added digest.mbox and pending.pck to the 'list' files checked by
+ check_perms. Launchpad bug #284802.
- - Incoming MTA selection is now taken from the config file instead of
- plugins. An MTA for Postfix+LMTP is added. bin/genaliases works again.
+Architecture
+------------
- - If a message has no Message-ID, the stock archivers will return None for
- the permalink now instead of raising an assertion.
+ * Converted to using zope.testing as the test infrastructure. Use bin/test
+ now to run the full test suite.
+ <http://pypi.python.org/pypi/zope.testing/3.7.1>
+ * Partially converted to using lazr.config as the new configuration
+ regime. Not everything has been converted yet, so some manual editing
+ of mailman/Defaults.py is required. This will be rectified in future
+ versions. <http://launchpad.net/lazr.config>
+ * All web-related stuff is moved to its own directory, effectively moving
+ it out of the way for now.
+ * The email command infrastructure has been reworked to play more nicely
+ with the plug-in architecture. Not all commands have yet been
+ converted.
- - IArchiver no longer has an is_enabled property; this is taken from the
- configuration file now.
+Other changes
+-------------
- Installation
+ * The LMTP server now properly calculates the message's original size.
+ * For command line scripts, -C names the configuration file to use. For
+ convenient testing, if -C is not given, then the environment variable
+ MAILMAN_CONFIG_FILE is consulted.
+ * Support added for a local MHonArc archiver, as well as archiving
+ automatically in the remote Mail-Archive.com service.
+ * The permalink proposal for supporting RFC 5064 has been adopted.
+ * Mailing lists no longer have a .web_page_url attribute; this is taken from
+ the mailing list's domain's base_url attribute.
+ * Incoming MTA selection is now taken from the config file instead of
+ plugins. An MTA for Postfix+LMTP is added. bin/genaliases works again.
+ * If a message has no Message-ID, the stock archivers will return None for
+ the permalink now instead of raising an assertion.
+ * IArchiver no longer has an is_enabled property; this is taken from the
+ configuration file now.
- - Python 2.6 is the minimal requirement.
+Installation
+------------
- - Converted to using zc.buildout as the build infrastructure. See
- docs/ALPHA.txt for details.
- <http://pypi.python.org/pypi/zc.buildout/1.1.1>
+ * Python 2.6 is the minimal requirement.
+ * Converted to using zc.buildout as the build infrastructure. See
+ docs/ALPHA.txt for details.
+ <http://pypi.python.org/pypi/zc.buildout/1.1.1>
3.0 alpha 1 -- "Leave That Thing Alone"
+=======================================
(08-Apr-2008)
- User visible changes
-
- - So called 'new style' subject prefixing is the default now, and the only
- option. When a list's subject prefix is added, it's always done so
- before any Re: tag, not after. E.g. '[My List] Re: The subject'.
-
- - RFC 2369 headers List-Subscribe and List-Unsubscribe now use the
- preferred -join and -leave addresses instead of the -request address
- with a subject value.
-
- Configuration
-
- - There is no more separate configure; make; make install step. Mailman
- 3.0 is a setuptools package.
-
- - Mailman can now be configured via a 'mailman.cfg' file which lives in
- $VAR_PREFIX/etc. This is used to separate the configuration from the
- source directory. Alternative configuration files can be specified via
- -C/--config for most command line scripts. mailman.cfg contains Python
- code. mm_cfg.py is no more. You do not need to import Defaults.py in
- etc/mailman.cfg. You should still consult Defaults.py for the list of
- site configuration variables available to you.
-
- See the etc/mailman.cfg.sample file.
-
- - PUBLIC_ARCHIVE_URL and DEFAULT_SUBJECT_PREFIX now takes $-string
- substitutions instead of %-string substitutions. See documentation in
- Defaults.py.in for details.
-
- - Message headers and footers now only accept $-string substitutions;
- %-strings are no longer supported. The substitution variable
- '_internal_name' has been removed; use $list_name or $real_name
- instead. The substitution variable $fqdn_listname has been added.
- DEFAULT_MSG_FOOTER in Defaults.py.in has been updated accordingly.
-
- - The KNOWN_SPAMMERS global variable is replaced with HEADER_MATCHES. The
- mailing list's header_filter_rules variable is replaced with
- header_matches which has the same semantics as HEADER_MATCHES, but is
- list-specific.
-
- - DEFAULT_MAIL_COMMANDS_MAX_LINES -> EMAIL_COMMANDS_MAX_LINES
-
- - All SMTP_LOG_* templates use $-strings and all consistently write the
- Message-ID as the first item in the log entry.
-
- - DELIVERY_MODULE now names a handler, not a module (yes, this is a
- misnomer, but it will likely change again before the final release).
-
- Architecture
-
- - Internally, all strings are Unicodes.
-
- - Implementation of a chain-of-rules based approach for deciding whether a
- message should initially be accepted, held for approval,
- rejected/bounced, or discarded. This replaces most of the disposition
- handlers in the pipeline. The IncomingRunner now only processes message
- through the rule chains, and once accepted, places the message in a new
- queue processed by the PipelineRunner.
-
- - Substantially reworked the entire queue runner process management,
- including mailmanctl, a new master script, and the qrunners. This
- should be much more robust and reliable now.
-
- - The Storm ORM is used for data storage, with the SQLite backend as the
- default relational database.
-
- - Zope interfaces are used to describe the major components.
-
- - Users are now stored in a unified database, and shared across all
- mailing lists.
-
- - Mailman's web interface is now WSGI compliant. WSGI is a Python
- standard (PEP 333) allowing web applications to be (more) easily
- integrated with any number of existing Python web application
- frameworks. For more information see:
-
- http://www.wsgi.org/wsgi
- http://www.python.org/dev/peps/pep-0333/
-
- Mailman can still be run as a traditional CGI program of course.
-
- - Mailman now provides an LMTP server for more efficient integration with
- supporting mail servers (e.g. Postfix, Sendmail). The Local Mail
- Transport Protocol is defined in RFC 2033:
-
- http://www.faqs.org/rfcs/rfc2033.html
-
- - Virtual domains are now fully supported in that mailing lists of the
- same name can exist in more than one domain. This is accomplished by
- renaming the lists/ and archives/ subdirectories after the list's
- posting address. For example, data for list foo in example.com and list
- foo in example.org will be stored in lists/foo@example.com and
- lists/foo@example.org.
-
- For Postfix or manual MTA users, you will need to regenerate your mail
- aliases. Use bin/genaliases.
-
- VIRTUAL_HOST_OVERVIEW has been removed, effectively Mailman now operates
- as if it were always enabled. If your site has more than one domain,
- you must configure all domains by using add_domain() in your
- etc/mailman.cfg flie (see below -- add_virtual() has been removed).
+User visible changes
+--------------------
- - If you had customizations based on Site.py, you will need to
- re-implement them. Site.py has been removed.
+ * So called 'new style' subject prefixing is the default now, and the only
+ option. When a list's subject prefix is added, it's always done so before
+ any Re: tag, not after. E.g. '[My List] Re: The subject'.
+ * RFC 2369 headers List-Subscribe and List-Unsubscribe now use the preferred
+ -join and -leave addresses instead of the -request address with a subject
+ value.
- - The site list is no more. You can remove your 'mailman' site list
- unless you want to retain it for other purposes, but it is no longer
- used (or required) by Mailman. You should set NO_REPLY_ADDRESS to an
- address that throws away replies, and you should set SITE_OWNER_ADDRESS
- to an email address that reaches the person ultimately responsible for
- the Mailman installation. The MAILMAN_SITE_LIST variable has been
- removed.
+Configuration
+-------------
- - qrunners no longer restart on SIGINT; SIGUSR1 is used for that now.
+ * There is no more separate configure; make; make install step. Mailman 3.0
+ is a setuptools package.
+ * Mailman can now be configured via a 'mailman.cfg' file which lives in
+ $VAR_PREFIX/etc. This is used to separate the configuration from the
+ source directory. Alternative configuration files can be specified via
+ -C/--config for most command line scripts. mailman.cfg contains Python
+ code. mm_cfg.py is no more. You do not need to import Defaults.py in
+ etc/mailman.cfg. You should still consult Defaults.py for the list of site
+ configuration variables available to you.
- Internationalization Big Changes
+ See the etc/mailman.cfg.sample file.
+ * PUBLIC_ARCHIVE_URL and DEFAULT_SUBJECT_PREFIX now takes $-string
+ substitutions instead of %-string substitutions. See documentation in
+ Defaults.py.in for details.
+ * Message headers and footers now only accept $-string substitutions;
+ %-strings are no longer supported. The substitution variable
+ '_internal_name' has been removed; use $list_name or $real_name
+ instead. The substitution variable $fqdn_listname has been added.
+ DEFAULT_MSG_FOOTER in Defaults.py.in has been updated accordingly.
+ * The KNOWN_SPAMMERS global variable is replaced with HEADER_MATCHES. The
+ mailing list's header_filter_rules variable is replaced with header_matches
+ which has the same semantics as HEADER_MATCHES, but is list-specific.
+ * DEFAULT_MAIL_COMMANDS_MAX_LINES -> EMAIL_COMMANDS_MAX_LINES
+ * All SMTP_LOG_* templates use $-strings and all consistently write the
+ Message-ID as the first item in the log entry.
+ * DELIVERY_MODULE now names a handler, not a module (yes, this is a
+ misnomer, but it will likely change again before the final release).
- - Translators should work only on messages/<lang>/LC_MESSAGES/mailman.po.
- Templates files are generated from mailman.po during the build process.
+Architecture
+------------
- New Features
+ * Internally, all strings are Unicodes.
+ * Implementation of a chain-of-rules based approach for deciding whether a
+ message should initially be accepted, held for approval, rejected/bounced,
+ or discarded. This replaces most of the disposition handlers in the
+ pipeline. The IncomingRunner now only processes message through the rule
+ chains, and once accepted, places the message in a new queue processed by
+ the PipelineRunner.
+ * Substantially reworked the entire queue runner process management,
+ including mailmanctl, a new master script, and the qrunners. This should
+ be much more robust and reliable now.
+ * The Storm ORM is used for data storage, with the SQLite backend as the
+ default relational database.
+ * Zope interfaces are used to describe the major components.
+ * Users are now stored in a unified database, and shared across all mailing
+ lists.
+ * Mailman's web interface is now WSGI compliant. WSGI is a Python standard
+ (PEP 333) allowing web applications to be (more) easily integrated with any
+ number of existing Python web application frameworks. For more information
+ see:
- - Confirmed member change of address is logged in the 'subscribe' log,
- and if admin_notify_mchanges is true, a notice is sent to the list
- owner using a new adminaddrchgack.txt template.
+ http://www.wsgi.org/wsgi
+ http://www.python.org/dev/peps/pep-0333/
- - There is a new list attribute 'subscribe_auto_approval' which is a list
- of email addresses and regular expressions matching email addresses
- whose subscriptions are exempt from admin approval. RFE 403066.
+ Mailman can still be run as a traditional CGI program of course.
+ * Mailman now provides an LMTP server for more efficient integration with
+ supporting mail servers (e.g. Postfix, Sendmail). The Local Mail Transport
+ Protocol is defined in RFC 2033:
- Command line scripts
+ http://www.faqs.org/rfcs/rfc2033.html
+ * Virtual domains are now fully supported in that mailing lists of the same
+ name can exist in more than one domain. This is accomplished by renaming
+ the lists/ and archives/ subdirectories after the list's posting address.
+ For example, data for list foo in example.com and list foo in example.org
+ will be stored in lists/foo@example.com and lists/foo@example.org.
- - Most scripts have grown a -C/--config flag to allow you to specify a
- different configuration file. Without this, the default etc/mailman.cfg
- file will be used.
+ For Postfix or manual MTA users, you will need to regenerate your mail
+ aliases. Use bin/genaliases.
- - the -V/--virtual-host-overview switch in list_lists has been removed,
- while -d/--domain and -f/--full have been added.
+ VIRTUAL_HOST_OVERVIEW has been removed, effectively Mailman now operates
+ as if it were always enabled. If your site has more than one domain,
+ you must configure all domains by using add_domain() in your
+ etc/mailman.cfg flie (see below -- add_virtual() has been removed).
+ * If you had customizations based on Site.py, you will need to re-implement
+ them. Site.py has been removed.
+ * The site list is no more. You can remove your 'mailman' site list unless
+ you want to retain it for other purposes, but it is no longer used (or
+ required) by Mailman. You should set NO_REPLY_ADDRESS to an address that
+ throws away replies, and you should set SITE_OWNER_ADDRESS to an email
+ address that reaches the person ultimately responsible for the Mailman
+ installation. The MAILMAN_SITE_LIST variable has been removed.
+ * qrunners no longer restart on SIGINT; SIGUSR1 is used for that now.
- - bin/newlist is renamed bin/create_list and bin/rmlist is renamed
- bin/remove_list. Both take fully-qualified list names now (i.e. the
- list's posting address), but also accept short names, in which case the
- default domain is used. newlist's -u/--urlhost and -e/--emailhost
- switches have been removed. The domain that the list is being added to
- must already exist.
+Internationalization Big Changes
+--------------------------------
- - Backport the ability to specify additional footer interpolation
- variables by the message metadata 'decoration-data' key.
+ * Translators should work only on messages/<lang>/LC_MESSAGES/mailman.po.
+ Templates files are generated from mailman.po during the build process.
- Bug fixes and other patches
+New Features
+------------
- - Removal of DomainKey/DKIM signatures is now controlled by Defaults.py
- mm_cfg.py variable REMOVE_DKIM_HEADERS (default = No).
+ * Confirmed member change of address is logged in the 'subscribe' log, and if
+ admin_notify_mchanges is true, a notice is sent to the list owner using a
+ new adminaddrchgack.txt template.
+ * There is a new list attribute 'subscribe_auto_approval' which is a list of
+ email addresses and regular expressions matching email addresses whose
+ subscriptions are exempt from admin approval. RFE 403066.
- - Queue runner processing is improved to log and preserve for analysis in
- the shunt queue certain bad queue entries that were previously logged
- but lost. Also, entries are preserved when an attempt to shunt throws
- an exception (1656289).
+Command line scripts
+--------------------
- - The processing of Topics regular expressions has changed. Previously the
- Topics regexp was compiled in verbose mode but not documented as such
- which caused some confusion. Also, the documentation indicated that
- topic keywords could be entered one per line, but these entries were not
- handled properly. Topics regexps are now compiled in non-verbose mode
- and multi- line entries are 'ored'. Existing Topics regexps will be
- converted when the list is updated so they will continue to work.
+ * Most scripts have grown a -C/--config flag to allow you to specify a
+ different configuration file. Without this, the default etc/mailman.cfg
+ file will be used.
+ * the -V/--virtual-host-overview switch in list_lists has been removed, while
+ -d/--domain and -f/--full have been added.
+ * bin/newlist is renamed bin/create_list and bin/rmlist is renamed
+ bin/remove_list. Both take fully-qualified list names now (i.e. the list's
+ posting address), but also accept short names, in which case the default
+ domain is used. newlist's -u/--urlhost and -e/--emailhost switches have
+ been removed. The domain that the list is being added to must already
+ exist.
+ * Backport the ability to specify additional footer interpolation variables
+ by the message metadata 'decoration-data' key.
- - The List-Help, List-Subscribe, and List-Unsubscribe headers were
- incorrectly suppressed in messages that Mailman sends directly to
- users.
+Bug fixes and other patches
+---------------------------
- - The 'adminapproved' metadata key is renamed 'moderator_approved'.
+ * Removal of DomainKey/DKIM signatures is now controlled by Defaults.py
+ mm_cfg.py variable REMOVE_DKIM_HEADERS (default = No).
+ * Queue runner processing is improved to log and preserve for analysis in the
+ shunt queue certain bad queue entries that were previously logged but lost.
+ Also, entries are preserved when an attempt to shunt throws an exception
+ (1656289).
+ * The processing of Topics regular expressions has changed. Previously the
+ Topics regexp was compiled in verbose mode but not documented as such which
+ caused some confusion. Also, the documentation indicated that topic
+ keywords could be entered one per line, but these entries were not handled
+ properly. Topics regexps are now compiled in non-verbose mode and multi-
+ line entries are 'ored'. Existing Topics regexps will be converted when
+ the list is updated so they will continue to work.
+ * The List-Help, List-Subscribe, and List-Unsubscribe headers were
+ incorrectly suppressed in messages that Mailman sends directly to users.
+ * The 'adminapproved' metadata key is renamed 'moderator_approved'.
diff --git a/src/mailman/bin/add_members.py b/src/attic/add_members.py
index 540c0facb..540c0facb 100644
--- a/src/mailman/bin/add_members.py
+++ b/src/attic/add_members.py
diff --git a/src/mailman/Archiver/HyperArch.py b/src/mailman/Archiver/HyperArch.py
index d78831e8e..b3601f5fa 100644
--- a/src/mailman/Archiver/HyperArch.py
+++ b/src/mailman/Archiver/HyperArch.py
@@ -49,6 +49,7 @@ from mailman import i18n
from mailman.Archiver import HyperDatabase
from mailman.Archiver import pipermail
from mailman.config import config
+from mailman.interfaces.listmanager import IListManager
log = logging.getLogger('mailman.error')
@@ -319,7 +320,7 @@ class Article(pipermail.Article):
listname = d.get('__listname')
if listname:
del d['__listname']
- d['_mlist'] = config.db.list_manager.get(listname)
+ d['_mlist'] = IListManager(config).get(listname)
if not d.has_key('_lang'):
if hasattr(self, '_mlist'):
self._lang = self._mlist.preferred_language
diff --git a/src/mailman/app/lifecycle.py b/src/mailman/app/lifecycle.py
index d7a8ec1a7..b7f30afd8 100644
--- a/src/mailman/app/lifecycle.py
+++ b/src/mailman/app/lifecycle.py
@@ -34,6 +34,7 @@ from mailman.config import config
from mailman.email.validate import validate
from mailman.interfaces.domain import (
BadDomainSpecificationError, IDomainManager)
+from mailman.interfaces.listmanager import IListManager
from mailman.interfaces.member import MemberRole
from mailman.utilities.modules import call_name
@@ -51,7 +52,7 @@ def create_list(fqdn_listname, owners=None):
listname, domain = fqdn_listname.split('@', 1)
if domain not in IDomainManager(config):
raise BadDomainSpecificationError(domain)
- mlist = config.db.list_manager.create(fqdn_listname)
+ mlist = IListManager(config).create(fqdn_listname)
for style in config.style_manager.lookup(mlist):
style.apply(mlist)
# Coordinate with the MTA, as defined in the configuration file.
@@ -80,7 +81,7 @@ def remove_list(fqdn_listname, mailing_list=None, archives=True):
for member in mailing_list.subscribers.members:
member.unsubscribe()
# Delete the mailing list from the database.
- config.db.list_manager.delete(mailing_list)
+ IListManager(config).delete(mailing_list)
# Do the MTA-specific list deletion tasks
call_name(config.mta.incoming).create(mailing_list)
# Remove the list directory.
diff --git a/src/mailman/app/registrar.py b/src/mailman/app/registrar.py
index 4ec7991d6..3161ed149 100644
--- a/src/mailman/app/registrar.py
+++ b/src/mailman/app/registrar.py
@@ -35,6 +35,7 @@ from mailman.email.message import UserNotification
from mailman.email.validate import validate
from mailman.i18n import _
from mailman.interfaces.domain import IDomain
+from mailman.interfaces.listmanager import IListManager
from mailman.interfaces.member import MemberRole
from mailman.interfaces.pending import IPendable
from mailman.interfaces.registrar import IRegistrar
@@ -136,7 +137,7 @@ class Registrar:
# to the list right now.
list_name = pendable.get('list_name')
if list_name is not None:
- mlist = config.db.list_manager.get(list_name)
+ mlist = IListManager(config).get(list_name)
if mlist:
addr.subscribe(mlist, MemberRole.member)
return True
diff --git a/src/mailman/bin/inject.py b/src/mailman/bin/inject.py
index 73f1b9015..591d6697b 100644
--- a/src/mailman/bin/inject.py
+++ b/src/mailman/bin/inject.py
@@ -24,6 +24,7 @@ from mailman import Utils
from mailman.configuration import config
from mailman.i18n import _
from mailman.inject import inject_text
+from mailman.interfaces.listmanager import IListManager
from mailman.message import Message
from mailman.options import SingleMailingListOptions
@@ -71,7 +72,7 @@ def main():
options.parser.error(_('Bad queue directory: $qdir'))
fqdn_listname = options.options.listname
- mlist = config.db.list_manager.get(fqdn_listname)
+ mlist = IListManager(config).get(fqdn_listname)
if mlist is None:
options.parser.error(_('No such list: $fqdn_listname'))
diff --git a/src/mailman/commands/cli_lists.py b/src/mailman/commands/cli_lists.py
index b95d1a779..95c7b650c 100644
--- a/src/mailman/commands/cli_lists.py
+++ b/src/mailman/commands/cli_lists.py
@@ -39,7 +39,7 @@ from mailman.i18n import _, using_language
from mailman.interfaces.command import ICLISubCommand
from mailman.interfaces.domain import (
BadDomainSpecificationError, IDomainManager)
-from mailman.interfaces.listmanager import ListAlreadyExistsError
+from mailman.interfaces.listmanager import IListManager, ListAlreadyExistsError
@@ -76,7 +76,7 @@ class Lists:
def process(self, args):
"""See `ICLISubCommand`."""
mailing_lists = []
- list_manager = config.db.list_manager
+ list_manager = IListManager(config)
# Gather the matching mailing lists.
for fqdn_name in sorted(list_manager.names):
mlist = list_manager.get(fqdn_name)
@@ -251,7 +251,7 @@ remove any residual archives."""))
assert len(args.listname) == 1, (
'Unexpected positional arguments: %s' % args.listname)
fqdn_listname = args.listname[0]
- mlist = config.db.list_manager.get(fqdn_listname)
+ mlist = IListManager(config).get(fqdn_listname)
if mlist is None:
if args.archives:
log(_('No such list: $fqdn_listname; '
diff --git a/src/mailman/commands/cli_members.py b/src/mailman/commands/cli_members.py
index 7e22166ed..5a2a419f7 100644
--- a/src/mailman/commands/cli_members.py
+++ b/src/mailman/commands/cli_members.py
@@ -35,6 +35,7 @@ from mailman.app.membership import add_member
from mailman.config import config
from mailman.i18n import _
from mailman.interfaces.command import ICLISubCommand
+from mailman.interfaces.listmanager import IListManager
from mailman.interfaces.member import DeliveryMode
@@ -67,7 +68,7 @@ class Members:
assert len(args.listname) == 1, (
'Unexpected positional arguments: %s' % args.listname)
fqdn_listname = args.listname[0]
- mlist = config.db.list_manager.get(fqdn_listname)
+ mlist = IListManager(config).get(fqdn_listname)
if mlist is None:
self.parser.error(_('No such list: $fqdn_listname'))
if args.filename == '-':
diff --git a/src/mailman/config/configure.zcml b/src/mailman/config/configure.zcml
index cc1a9face..7e139980c 100644
--- a/src/mailman/config/configure.zcml
+++ b/src/mailman/config/configure.zcml
@@ -7,6 +7,12 @@
<!-- adapters -->
<adapter
+ for="mailman.config.config.IConfiguration"
+ provides="mailman.interfaces.listmanager.IListManager"
+ factory="mailman.database.listmanager.ListManager"
+ />
+
+ <adapter
for="mailman.interfaces.domain.IDomain"
provides="mailman.interfaces.registrar.IRegistrar"
factory="mailman.app.registrar.Registrar"
diff --git a/src/mailman/database/__init__.py b/src/mailman/database/__init__.py
index 5943df660..dbceaee56 100644
--- a/src/mailman/database/__init__.py
+++ b/src/mailman/database/__init__.py
@@ -36,7 +36,6 @@ from zope.interface import implements
import mailman.version
from mailman.config import config
-from mailman.database.listmanager import ListManager
from mailman.database.messagestore import MessageStore
from mailman.database.pending import Pendings
from mailman.database.requests import Requests
@@ -69,7 +68,6 @@ class StockDatabase:
# the database at the same time.
with Lock(os.path.join(config.LOCK_DIR, 'dbcreate.lck')):
self._create(debug)
- self.list_manager = ListManager()
self.user_manager = UserManager()
self.message_store = MessageStore()
self.pendings = Pendings()
diff --git a/src/mailman/database/listmanager.py b/src/mailman/database/listmanager.py
index f96e44d75..af581cc6e 100644
--- a/src/mailman/database/listmanager.py
+++ b/src/mailman/database/listmanager.py
@@ -29,7 +29,6 @@ import datetime
from zope.interface import implements
-from mailman.config import config
from mailman.database.mailinglist import MailingList
from mailman.interfaces.listmanager import IListManager, ListAlreadyExistsError
from mailman.interfaces.rest import IResolvePathNames
@@ -41,11 +40,20 @@ class ListManager(object):
implements(IListManager, IResolvePathNames)
+ def __init__(self, config):
+ """Create a list manager.
+
+ :param config: The configuration object.
+ :type config: `IConfiguration`
+ """
+ self.config = config
+ self.store = config.db.store
+
# pylint: disable-msg=R0201
def create(self, fqdn_listname):
"""See `IListManager`."""
listname, hostname = fqdn_listname.split('@', 1)
- mlist = config.db.store.find(
+ mlist = self.store.find(
MailingList,
MailingList.list_name == listname,
MailingList.host_name == hostname).one()
@@ -53,13 +61,13 @@ class ListManager(object):
raise ListAlreadyExistsError(fqdn_listname)
mlist = MailingList(fqdn_listname)
mlist.created_at = datetime.datetime.now()
- config.db.store.add(mlist)
+ self.store.add(mlist)
return mlist
def get(self, fqdn_listname):
"""See `IListManager`."""
listname, hostname = fqdn_listname.split('@', 1)
- mlist = config.db.store.find(MailingList,
+ mlist = self.store.find(MailingList,
list_name=listname,
host_name=hostname).one()
if mlist is not None:
@@ -69,7 +77,7 @@ class ListManager(object):
def delete(self, mlist):
"""See `IListManager`."""
- config.db.store.remove(mlist)
+ self.store.remove(mlist)
@property
def mailing_lists(self):
@@ -80,7 +88,7 @@ class ListManager(object):
@property
def names(self):
"""See `IListManager`."""
- for mlist in config.db.store.find(MailingList):
+ for mlist in self.store.find(MailingList):
yield '{0}@{1}'.format(mlist.list_name, mlist.host_name)
def get_mailing_lists(self):