summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/mailman/Archiver/Archiver.py3
-rw-r--r--src/mailman/app/lifecycle.py2
-rw-r--r--src/mailman/archiving/mhonarc.py4
-rw-r--r--src/mailman/archiving/pipermail.py4
-rw-r--r--src/mailman/archiving/prototype.py3
-rw-r--r--src/mailman/commands/cli_lists.py6
-rw-r--r--src/mailman/commands/docs/create.txt2
-rw-r--r--src/mailman/commands/docs/lists.txt5
-rw-r--r--src/mailman/commands/docs/membership.txt71
-rw-r--r--src/mailman/commands/eml_confirm.py13
-rw-r--r--src/mailman/commands/eml_membership.py4
-rw-r--r--src/mailman/config/configure.zcml8
-rw-r--r--src/mailman/docs/domains.txt3
-rw-r--r--src/mailman/docs/registration.txt4
-rw-r--r--src/mailman/interfaces/mailinglist.py4
-rw-r--r--src/mailman/model/domain.py10
-rw-r--r--src/mailman/model/mailinglist.py12
-rw-r--r--src/mailman/model/pending.py4
-rw-r--r--src/mailman/pipeline/docs/cook-headers.txt4
-rw-r--r--src/mailman/queue/command.py12
-rw-r--r--src/mailman/queue/docs/command.txt5
-rw-r--r--src/mailman/rest/adapters.py17
-rw-r--r--src/mailman/rest/configure.zcml15
-rw-r--r--src/mailman/rest/docs/domains.txt30
-rw-r--r--src/mailman/rest/webservice.py2
-rw-r--r--src/mailman/testing/layers.py2
26 files changed, 156 insertions, 93 deletions
diff --git a/src/mailman/Archiver/Archiver.py b/src/mailman/Archiver/Archiver.py
index 5fb5b754c..dc8014bf5 100644
--- a/src/mailman/Archiver/Archiver.py
+++ b/src/mailman/Archiver/Archiver.py
@@ -30,6 +30,7 @@ import mailbox
from cStringIO import StringIO
from string import Template
+from zope.component import getUtility
from mailman import Utils
from mailman.config import config
@@ -129,7 +130,7 @@ class Archiver:
if self.archive_private:
url = self.GetScriptURL('private') + '/index.html'
else:
- domain = IDomainManager(config).get(self.host_name)
+ domain = getUtility(IDomainManager).get(self.host_name)
web_host = (self.host_name if domain is None else domain.url_host)
url = Template(config.PUBLIC_ARCHIVE_URL).safe_substitute(
listname=self.fqdn_listname,
diff --git a/src/mailman/app/lifecycle.py b/src/mailman/app/lifecycle.py
index e82bc1e28..971769e05 100644
--- a/src/mailman/app/lifecycle.py
+++ b/src/mailman/app/lifecycle.py
@@ -53,7 +53,7 @@ def create_list(fqdn_listname, owners=None):
validate(fqdn_listname)
# pylint: disable-msg=W0612
listname, domain = fqdn_listname.split('@', 1)
- if domain not in IDomainManager(config):
+ if domain not in getUtility(IDomainManager):
raise BadDomainSpecificationError(domain)
mlist = getUtility(IListManager).create(fqdn_listname)
for style in config.style_manager.lookup(mlist):
diff --git a/src/mailman/archiving/mhonarc.py b/src/mailman/archiving/mhonarc.py
index b27b7f808..a93511afa 100644
--- a/src/mailman/archiving/mhonarc.py
+++ b/src/mailman/archiving/mhonarc.py
@@ -35,7 +35,6 @@ from zope.interface import implements
from mailman.config import config
from mailman.interfaces.archiver import IArchiver
-from mailman.interfaces.domain import IDomainManager
from mailman.utilities.string import expand
@@ -54,10 +53,9 @@ class MHonArc:
def list_url(mlist):
"""See `IArchiver`."""
# XXX What about private MHonArc archives?
- web_host = IDomainManager(config)[mlist.host_name].url_host
return expand(config.archiver.mhonarc.base_url,
dict(listname=mlist.fqdn_listname,
- hostname=web_host,
+ hostname=mlist.domain.url_host,
fqdn_listname=mlist.fqdn_listname,
))
diff --git a/src/mailman/archiving/pipermail.py b/src/mailman/archiving/pipermail.py
index 07bd6144f..1087443bd 100644
--- a/src/mailman/archiving/pipermail.py
+++ b/src/mailman/archiving/pipermail.py
@@ -35,7 +35,6 @@ from zope.interface.interface import adapter_hooks
from mailman.config import config
from mailman.interfaces.archiver import IArchiver, IPipermailMailingList
-from mailman.interfaces.domain import IDomainManager
from mailman.interfaces.mailinglist import IMailingList
from mailman.utilities.filesystem import makedirs
from mailman.utilities.string import expand
@@ -98,10 +97,9 @@ class Pipermail:
if mlist.archive_private:
url = mlist.script_url('private') + '/index.html'
else:
- web_host = IDomainManager(config)[mlist.host_name].url_host
return expand(config.archiver.pipermail.base_url,
dict(listname=mlist.fqdn_listname,
- hostname=web_host,
+ hostname=mlist.domain.url_host,
fqdn_listname=mlist.fqdn_listname,
))
diff --git a/src/mailman/archiving/prototype.py b/src/mailman/archiving/prototype.py
index 3434587a2..dc9040dfe 100644
--- a/src/mailman/archiving/prototype.py
+++ b/src/mailman/archiving/prototype.py
@@ -33,7 +33,6 @@ from zope.interface import implements
from mailman.config import config
from mailman.interfaces.archiver import IArchiver
-from mailman.interfaces.domain import IDomainManager
@@ -51,7 +50,7 @@ class Prototype:
@staticmethod
def list_url(mlist):
"""See `IArchiver`."""
- return IDomainManager(config)[mlist.host_name].base_url
+ return mlist.domain.base_url
@staticmethod
def permalink(mlist, msg):
diff --git a/src/mailman/commands/cli_lists.py b/src/mailman/commands/cli_lists.py
index c7941d860..d3833c2b0 100644
--- a/src/mailman/commands/cli_lists.py
+++ b/src/mailman/commands/cli_lists.py
@@ -182,9 +182,9 @@ class Create:
# Check to see if the domain exists or not.
fqdn_listname = args.listname[0]
listname, at, domain = fqdn_listname.partition('@')
- domain_mgr = IDomainManager(config)
- if domain_mgr.get(domain) is None and args.domain:
- domain_mgr.add(domain)
+ domain_manager = getUtility(IDomainManager)
+ if domain_manager.get(domain) is None and args.domain:
+ domain_manager.add(domain)
try:
mlist = create_list(fqdn_listname, args.owners)
except InvalidEmailAddress:
diff --git a/src/mailman/commands/docs/create.txt b/src/mailman/commands/docs/create.txt
index eec8b6941..9c2331418 100644
--- a/src/mailman/commands/docs/create.txt
+++ b/src/mailman/commands/docs/create.txt
@@ -43,7 +43,7 @@ Now both the domain and the mailing list exist in the database.
<mailing list "test@example.xx" at ...>
>>> from mailman.interfaces.domain import IDomainManager
- >>> IDomainManager(config).get('example.xx')
+ >>> getUtility(IDomainManager).get('example.xx')
<Domain example.xx, base_url: http://example.xx,
contact_address: postmaster@example.xx>
diff --git a/src/mailman/commands/docs/lists.txt b/src/mailman/commands/docs/lists.txt
index ee4ec35e2..887e69bd4 100644
--- a/src/mailman/commands/docs/lists.txt
+++ b/src/mailman/commands/docs/lists.txt
@@ -20,10 +20,9 @@ line. When there are no mailing lists, a helpful message is displayed.
When there are a few mailing lists, they are shown in alphabetical order by
their fully qualified list names, with a description.
- >>> from mailman.config import config
>>> from mailman.interfaces.domain import IDomainManager
- >>> domain_mgr = IDomainManager(config)
- >>> domain_mgr.add('example.net')
+ >>> from zope.component import getUtility
+ >>> getUtility(IDomainManager).add('example.net')
<Domain example.net...>
>>> mlist_1 = create_list('list-one@example.com')
diff --git a/src/mailman/commands/docs/membership.txt b/src/mailman/commands/docs/membership.txt
index f3d9ae1df..b91dd17f1 100644
--- a/src/mailman/commands/docs/membership.txt
+++ b/src/mailman/commands/docs/membership.txt
@@ -80,7 +80,8 @@ first.
>>> from mailman.interfaces.usermanager import IUserManager
>>> from zope.component import getUtility
- >>> print getUtility(IUserManager).get_user('anne@example.com')
+ >>> user_manager = getUtility(IUserManager)
+ >>> print user_manager.get_user('anne@example.com')
None
Mailman has sent her the confirmation message.
@@ -123,11 +124,11 @@ list.
>>> token = str(qmsg['subject']).split()[1].strip()
>>> from mailman.interfaces.domain import IDomainManager
>>> from mailman.interfaces.registrar import IRegistrar
- >>> registrar = IRegistrar(IDomainManager(config)['example.com'])
+ >>> registrar = IRegistrar(getUtility(IDomainManager)['example.com'])
>>> registrar.confirm(token)
True
- >>> user = getUtility(IUserManager).get_user('anne@example.com')
+ >>> user = user_manager.get_user('anne@example.com')
>>> print user.real_name
Anne Person
>>> list(user.addresses)
@@ -153,7 +154,7 @@ Joining a second list
Anne of course, is still registered.
- >>> print getUtility(IUserManager).get_user('anne@example.com')
+ >>> print user_manager.get_user('anne@example.com')
<User "Anne Person" at ...>
But she is not a member of the mailing list.
@@ -207,7 +208,7 @@ Anne does not need to leave a mailing list with the same email address she's
subscribe with. Any of her registered, linked, and validated email addresses
will do.
- >>> anne = getUtility(IUserManager).get_user('anne@example.com')
+ >>> anne = user_manager.get_user('anne@example.com')
>>> address = anne.register('anne.person@example.org')
>>> results = Results()
@@ -260,3 +261,63 @@ unsubscribe her from the list.
Confirmations
=============
+Bart wants to join the alpha list, so he sends his subscription request.
+
+ >>> msg = message_from_string("""\
+ ... From: Bart Person <bart@example.com>
+ ...
+ ... """)
+
+ >>> command = config.commands['join']
+ >>> print command.process(mlist, msg, {}, (), Results())
+ ContinueProcessing.yes
+
+There are two messages in the virgin queue, one of which is the confirmation
+message.
+
+ >>> from mailman.testing.helpers import get_queue_messages
+ >>> for item in get_queue_messages('virgin'):
+ ... subject = str(item.msg['subject'])
+ ... if subject.startswith('confirm'):
+ ... break
+ ... else:
+ ... raise AssertionError('No confirmation message')
+ >>> token = subject.split()[1].strip()
+
+Bart is still not a user.
+
+ >>> print user_manager.get_user('bart@example.com')
+ None
+
+Bart replies to the original message, specifically keeping the Subject header
+intact except for any prefix. Mailman matches the token and confirms Bart as
+a user of the system.
+
+ >>> msg = message_from_string("""\
+ ... From: Bart Person <bart@example.com>
+ ... To: alpha-confirm@example.com
+ ... Subject: Re: confirm {token}
+ ...
+ ... """.format(token=token))
+
+ >>> command = config.commands['confirm']
+ >>> results = Results()
+ >>> print command.process(mlist, msg, {}, (token,), results)
+ ContinueProcessing.yes
+
+ >>> print unicode(results)
+ The results of your email command are provided below.
+ <BLANKLINE>
+ Confirmed
+ <BLANKLINE>
+
+Now Bart is a user...
+
+ >>> print user_manager.get_user('bart@example.com')
+ <User "Bart Person" at ...>
+
+...and a member of the mailing list.
+
+ >>> print mlist.members.get_member('bart@example.com')
+ <Member: Bart Person <bart@example.com>
+ on alpha@example.com as MemberRole.member>
diff --git a/src/mailman/commands/eml_confirm.py b/src/mailman/commands/eml_confirm.py
index 0c957b295..510033098 100644
--- a/src/mailman/commands/eml_confirm.py
+++ b/src/mailman/commands/eml_confirm.py
@@ -29,6 +29,7 @@ from zope.interface import implements
from mailman.core.i18n import _
from mailman.interfaces.command import ContinueProcessing, IEmailCommand
+from mailman.interfaces.registrar import IRegistrar
@@ -43,5 +44,13 @@ class Confirm:
def process(self, mlist, msg, msgdata, arguments, results):
"""See `IEmailCommand`."""
- print >> results, _('Confirmed')
- return ContinueProcessing.yes
+ # The token must be in the arguments.
+ if len(arguments) == 0:
+ print >> results, _('No confirmation token found')
+ return ContinueProcessing.no
+ succeeded = IRegistrar(mlist.domain).confirm(arguments[0])
+ if succeeded:
+ print >> results, _('Confirmed')
+ return ContinueProcessing.yes
+ print >> results, _('Confirmation token did not match')
+ return ContinueProcessing.no
diff --git a/src/mailman/commands/eml_membership.py b/src/mailman/commands/eml_membership.py
index 55e866559..c48367e4d 100644
--- a/src/mailman/commands/eml_membership.py
+++ b/src/mailman/commands/eml_membership.py
@@ -35,7 +35,6 @@ from zope.interface import implements
from mailman.config import config
from mailman.core.i18n import _
from mailman.interfaces.command import ContinueProcessing, IEmailCommand
-from mailman.interfaces.domain import IDomainManager
from mailman.interfaces.member import DeliveryMode
from mailman.interfaces.registrar import IRegistrar
from mailman.interfaces.usermanager import IUserManager
@@ -75,8 +74,7 @@ example:
print >> results, _(
'$self.name: No valid address found to subscribe')
return ContinueProcessing.no
- domain = IDomainManager(config)[mlist.host_name]
- registrar = IRegistrar(domain)
+ registrar = IRegistrar(mlist.domain)
registrar.register(address, real_name, mlist)
person = formataddr((real_name, address))
print >> results, _('Confirmation email sent to $person')
diff --git a/src/mailman/config/configure.zcml b/src/mailman/config/configure.zcml
index e4a5a5c78..807698f16 100644
--- a/src/mailman/config/configure.zcml
+++ b/src/mailman/config/configure.zcml
@@ -4,8 +4,6 @@
<include package="mailman.rest" file="configure.zcml"/>
- <!-- adapters -->
-
<adapter
for="mailman.interfaces.domain.IDomain"
provides="mailman.interfaces.registrar.IRegistrar"
@@ -24,13 +22,11 @@
factory="mailman.model.mailinglist.AcceptableAliasSet"
/>
- <adapter
- for="mailman.config.config.IConfiguration"
- provides="mailman.interfaces.domain.IDomainManager"
+ <utility
factory="mailman.model.domain.DomainManager"
+ provides="mailman.interfaces.domain.IDomainManager"
/>
- <!-- utilities -->
<utility
factory="mailman.model.listmanager.ListManager"
provides="mailman.interfaces.listmanager.IListManager"
diff --git a/src/mailman/docs/domains.txt b/src/mailman/docs/domains.txt
index e333d9ad8..3d1de7083 100644
--- a/src/mailman/docs/domains.txt
+++ b/src/mailman/docs/domains.txt
@@ -5,7 +5,8 @@ Domains
# The test framework starts out with an example domain, so let's delete
# that first.
>>> from mailman.interfaces.domain import IDomainManager
- >>> manager = IDomainManager(config)
+ >>> from zope.component import getUtility
+ >>> manager = getUtility(IDomainManager)
>>> manager.remove('example.com')
<Domain example.com...>
diff --git a/src/mailman/docs/registration.txt b/src/mailman/docs/registration.txt
index 6b1ff0c18..a5f73ac53 100644
--- a/src/mailman/docs/registration.txt
+++ b/src/mailman/docs/registration.txt
@@ -16,8 +16,8 @@ checks, etc. The IRegistrar is the interface to the object handling all this
stuff.
>>> from mailman.interfaces.domain import IDomainManager
- >>> manager = IDomainManager(config)
- >>> domain = manager['example.com']
+ >>> from zope.component import getUtility
+ >>> domain = getUtility(IDomainManager)['example.com']
Get a registrar by adapting a domain.
diff --git a/src/mailman/interfaces/mailinglist.py b/src/mailman/interfaces/mailinglist.py
index 610e697db..377bcc976 100644
--- a/src/mailman/interfaces/mailinglist.py
+++ b/src/mailman/interfaces/mailinglist.py
@@ -88,7 +88,6 @@ class IMailingList(Interface):
part of the posting email address. For example, if messages are
posted to mylist@example.com, then the list_name is 'mylist'.
""")))
-
host_name = exported(TextLine(
title=_('Host name'),
description=_("""\
@@ -108,6 +107,9 @@ class IMailingList(Interface):
always comprised of the list_name + '@' + host_name.
""")))
+ domain = Attribute(
+ """The `IDomain` that this mailing list is defined in.""")
+
real_name = exported(TextLine(
title=_('Real name'),
description=_("""\
diff --git a/src/mailman/model/domain.py b/src/mailman/model/domain.py
index 9d4e714bc..06aef62cf 100644
--- a/src/mailman/model/domain.py
+++ b/src/mailman/model/domain.py
@@ -29,6 +29,7 @@ from urlparse import urljoin, urlparse
from storm.locals import Int, Unicode
from zope.interface import implements
+from mailman.config import config
from mailman.database.model import Model
from mailman.interfaces.domain import (
BadDomainSpecificationError, IDomain, IDomainManager)
@@ -105,13 +106,8 @@ class DomainManager:
implements(IDomainManager)
- def __init__(self, config):
- """Create a domain manager.
-
- :param config: The configuration object.
- :type config: `IConfiguration`
- """
- self.config = config
+ def __init__(self):
+ """Create a domain manager."""
self.store = config.db.store
def add(self, email_host,
diff --git a/src/mailman/model/mailinglist.py b/src/mailman/model/mailinglist.py
index 3aa103fac..77da90b09 100644
--- a/src/mailman/model/mailinglist.py
+++ b/src/mailman/model/mailinglist.py
@@ -32,6 +32,7 @@ from storm.locals import (
And, Bool, DateTime, Float, Int, Pickle, Reference, Store, TimeDelta,
Unicode)
from urlparse import urljoin
+from zope.component import getUtility
from zope.interface import implements
from mailman.config import config
@@ -210,17 +211,20 @@ class MailingList(Model):
return '{0}@{1}'.format(self.list_name, self.host_name)
@property
+ def domain(self):
+ """See `IMailingList`."""
+ return getUtility(IDomainManager)[self.host_name]
+
+ @property
def web_host(self):
"""See `IMailingList`."""
- return IDomainManager(config)[self.host_name]
+ return self.domain.url_host
def script_url(self, target, context=None):
"""See `IMailingList`."""
- # Find the domain for this mailing list.
- domain = IDomainManager(config)[self.host_name]
# XXX Handle the case for when context is not None; those would be
# relative URLs.
- return urljoin(domain.base_url, target + '/' + self.fqdn_listname)
+ return urljoin(self.domain.base_url, target + '/' + self.fqdn_listname)
@property
def data_path(self):
diff --git a/src/mailman/model/pending.py b/src/mailman/model/pending.py
index 0409ad311..1cf9d7f97 100644
--- a/src/mailman/model/pending.py
+++ b/src/mailman/model/pending.py
@@ -134,7 +134,9 @@ class Pendings:
def confirm(self, token, expunge=True):
store = config.db.store
- pendings = store.find(Pended, token=token)
+ # Token can come in as a unicode, but it's stored in the database as
+ # bytes. They must be ascii.
+ pendings = store.find(Pended, token=str(token))
if pendings.count() == 0:
return None
assert pendings.count() == 1, (
diff --git a/src/mailman/pipeline/docs/cook-headers.txt b/src/mailman/pipeline/docs/cook-headers.txt
index 127cd8aeb..fcb66bdbf 100644
--- a/src/mailman/pipeline/docs/cook-headers.txt
+++ b/src/mailman/pipeline/docs/cook-headers.txt
@@ -225,8 +225,8 @@ There are some circumstances when the list administrator wants to explicitly
set the List-ID header. Start by creating a new domain.
>>> from mailman.interfaces.domain import IDomainManager
- >>> manager = IDomainManager(config)
- >>> domain = manager.add('mail.example.net')
+ >>> from zope.component import getUtility
+ >>> domain = getUtility(IDomainManager).add('mail.example.net')
>>> mlist.host_name = 'mail.example.net'
>>> process(mlist, msg, {})
diff --git a/src/mailman/queue/command.py b/src/mailman/queue/command.py
index f36f9a31d..d5ce708b1 100644
--- a/src/mailman/queue/command.py
+++ b/src/mailman/queue/command.py
@@ -183,14 +183,16 @@ class CommandRunner(Runner):
'Invalid status: %s' % status)
if status == ContinueProcessing.no:
break
- # All done, send the response.
- if len(finder.command_lines) > 0:
+ # All done. Strip blank lines and send the response.
+ lines = filter(None, (line.strip() for line in finder.command_lines))
+ if len(lines) > 0:
print >> results, _('\n- Unprocessed:')
- for line in finder.command_lines:
+ for line in lines:
print >> results, line
- if len(finder.ignored_lines) > 0:
+ lines = filter(None, (line.strip() for line in finder.ignored_lines))
+ if len(lines) > 0:
print >> results, _('\n- Ignored:')
- for line in finder.ignored_lines:
+ for line in lines:
print >> results, line
print >> results, _('\n- Done.')
# Send a reply, but do not attach the original message. This is a
diff --git a/src/mailman/queue/docs/command.txt b/src/mailman/queue/docs/command.txt
index 445bf2ab6..c63c323b4 100644
--- a/src/mailman/queue/docs/command.txt
+++ b/src/mailman/queue/docs/command.txt
@@ -137,7 +137,8 @@ address, and the other is the results of his email command.
>>> from mailman.interfaces.domain import IDomainManager
>>> from mailman.interfaces.registrar import IRegistrar
- >>> registrar = IRegistrar(IDomainManager(config)['example.com'])
+ >>> from zope.component import getUtility
+ >>> registrar = IRegistrar(getUtility(IDomainManager)['example.com'])
>>> for item in messages:
... subject = item.msg['subject']
... print 'Subject:', subject
@@ -210,7 +211,7 @@ The -confirm address is also available as an implicit command.
Message-ID: ...
<BLANKLINE>
- Results:
- Confirmed
+ Confirmation token did not match
<BLANKLINE>
- Done.
<BLANKLINE>
diff --git a/src/mailman/rest/adapters.py b/src/mailman/rest/adapters.py
index 4dcf23e54..5389f4355 100644
--- a/src/mailman/rest/adapters.py
+++ b/src/mailman/rest/adapters.py
@@ -27,10 +27,11 @@ __all__ = [
from operator import attrgetter
+from zope.component import getUtility
from zope.interface import implements
from zope.publisher.interfaces import NotFound
-from mailman.interfaces.domain import IDomainCollection
+from mailman.interfaces.domain import IDomainCollection, IDomainManager
from mailman.interfaces.rest import IResolvePathNames
@@ -42,22 +43,14 @@ class DomainCollection:
__name__ = 'domains'
- def __init__(self, manager):
- """Initialize the adapter from an `IDomainManager`.
-
- :param manager: The domain manager.
- :type manager: `IDomainManager`.
- """
- self._manager = manager
-
def get_domains(self):
"""See `IDomainCollection`."""
# lazr.restful requires the return value to be a concrete list.
- return sorted(self._manager, key=attrgetter('email_host'))
+ return sorted(getUtility(IDomainManager), key=attrgetter('email_host'))
def get(self, name):
"""See `IResolvePathNames`."""
- domain = self._manager.get(name)
+ domain = getUtility(IDomainManager).get(name)
if domain is None:
raise NotFound(self, name)
return domain
@@ -65,6 +58,6 @@ class DomainCollection:
def new(self, email_host, description=None, base_url=None,
contact_address=None):
"""See `IDomainCollection`."""
- value = self._manager.add(
+ value = getUtility(IDomainManager).add(
email_host, description, base_url, contact_address)
return value
diff --git a/src/mailman/rest/configure.zcml b/src/mailman/rest/configure.zcml
index 95bcfd194..1441472c8 100644
--- a/src/mailman/rest/configure.zcml
+++ b/src/mailman/rest/configure.zcml
@@ -15,12 +15,6 @@
<adapter factory="zope.publisher.http.HTTPCharsets" />
<adapter
- for="mailman.interfaces.domain.IDomainManager"
- provides="mailman.interfaces.domain.IDomainCollection"
- factory="mailman.rest.adapters.DomainCollection"
- />
-
- <adapter
for="mailman.interfaces.domain.IDomain
lazr.restful.simple.Request"
provides="zope.traversing.browser.interfaces.IAbsoluteURL"
@@ -51,7 +45,12 @@
<utility
factory="mailman.rest.configuration.AdminWebServiceConfiguration"
- provides="lazr.restful.interfaces.IWebServiceConfiguration">
- </utility>
+ provides="lazr.restful.interfaces.IWebServiceConfiguration"
+ />
+
+ <utility
+ factory="mailman.rest.adapters.DomainCollection"
+ provides="mailman.interfaces.domain.IDomainCollection"
+ />
</configure>
diff --git a/src/mailman/rest/docs/domains.txt b/src/mailman/rest/docs/domains.txt
index 76710ddb2..ed9c6bc2f 100644
--- a/src/mailman/rest/docs/domains.txt
+++ b/src/mailman/rest/docs/domains.txt
@@ -5,8 +5,10 @@ Domains
# The test framework starts out with an example domain, so let's delete
# that first.
>>> from mailman.interfaces.domain import IDomainManager
- >>> manager = IDomainManager(config)
- >>> manager.remove('example.com')
+ >>> from zope.component import getUtility
+ >>> domain_manager = getUtility(IDomainManager)
+
+ >>> domain_manager.remove('example.com')
<Domain example.com...>
>>> transaction.commit()
@@ -20,8 +22,8 @@ initially none.
Once a domain is added though, it is accessible through the API.
- >>> manager.add('example.com', 'An example domain',
- ... 'http://lists.example.com')
+ >>> domain_manager.add(
+ ... 'example.com', 'An example domain', 'http://lists.example.com')
<Domain example.com, An example domain,
base_url: http://lists.example.com,
contact_address: postmaster@example.com>
@@ -43,15 +45,17 @@ Once a domain is added though, it is accessible through the API.
At the top level, all domains are returned as separate entries.
- >>> manager.add('example.org',
- ... base_url='http://mail.example.org',
- ... contact_address='listmaster@example.org')
+ >>> domain_manager.add(
+ ... 'example.org',
+ ... base_url='http://mail.example.org',
+ ... contact_address='listmaster@example.org')
<Domain example.org, base_url: http://mail.example.org,
contact_address: listmaster@example.org>
- >>> manager.add('lists.example.net',
- ... 'Porkmasters',
- ... 'http://example.net',
- ... 'porkmaster@example.net')
+ >>> domain_manager.add(
+ ... 'lists.example.net',
+ ... 'Porkmasters',
+ ... 'http://example.net',
+ ... 'porkmaster@example.net')
<Domain lists.example.net, Porkmasters,
base_url: http://example.net,
contact_address: porkmaster@example.net>
@@ -148,7 +152,7 @@ Now the web service knows about our new domain.
And the new domain is in our database.
- >>> manager['lists.example.com']
+ >>> domain_manager['lists.example.com']
<Domain lists.example.com,
base_url: http://lists.example.com,
contact_address: postmaster@lists.example.com>
@@ -185,7 +189,7 @@ address.
self_link: http://localhost:8001/3.0/domains/my.example.com
url_host: allmy.example.com
- >>> manager['my.example.com']
+ >>> domain_manager['my.example.com']
<Domain my.example.com, My new domain,
base_url: http://allmy.example.com,
contact_address: helpme@example.com>
diff --git a/src/mailman/rest/webservice.py b/src/mailman/rest/webservice.py
index 314636a48..d0c448572 100644
--- a/src/mailman/rest/webservice.py
+++ b/src/mailman/rest/webservice.py
@@ -80,7 +80,7 @@ class AdminWebServiceApplication:
"""Maps root names to resources."""
top_level = dict(
system=system,
- domains=IDomainCollection(IDomainManager(config)),
+ domains=getUtility(IDomainCollection),
lists=getUtility(IListManager),
)
next_step = top_level.get(name)
diff --git a/src/mailman/testing/layers.py b/src/mailman/testing/layers.py
index 0cc1a2e32..c29a35099 100644
--- a/src/mailman/testing/layers.py
+++ b/src/mailman/testing/layers.py
@@ -166,7 +166,7 @@ class ConfigLayer(MockAndMonkeyLayer):
@classmethod
def testSetUp(cls):
# Add an example domain.
- IDomainManager(config).add(
+ getUtility(IDomainManager).add(
'example.com', 'An example domain.',
'http://lists.example.com', 'postmaster@example.com')
config.db.commit()