diff options
Diffstat (limited to 'src')
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() |
