diff options
| author | Barry Warsaw | 2009-07-26 21:23:02 -0400 |
|---|---|---|
| committer | Barry Warsaw | 2009-07-26 21:23:02 -0400 |
| commit | 46d51f3f1b7b241b079b0377d99f969f2fe1373f (patch) | |
| tree | 7e5c097410c360d4c1cd9d23dd34dcdf22e0ee5a /src | |
| parent | 9c5c394a0912b56dd0fa1cabe07833aca24b92ef (diff) | |
| download | mailman-46d51f3f1b7b241b079b0377d99f969f2fe1373f.tar.gz mailman-46d51f3f1b7b241b079b0377d99f969f2fe1373f.tar.zst mailman-46d51f3f1b7b241b079b0377d99f969f2fe1373f.zip | |
Move BadDomainSpecificationError to domain.txt interface. Try to set this to
return an HTTP 400 error, though it does not seem to work.
Expose list creation through the API.
Diffstat (limited to '')
| -rw-r--r-- | src/mailman/app/lifecycle.py | 6 | ||||
| -rw-r--r-- | src/mailman/bin/create_list.py | 3 | ||||
| -rw-r--r-- | src/mailman/bin/import.py | 4 | ||||
| -rw-r--r-- | src/mailman/core/errors.py | 4 | ||||
| -rw-r--r-- | src/mailman/database/domain.py | 4 | ||||
| -rw-r--r-- | src/mailman/database/listmanager.py | 5 | ||||
| -rw-r--r-- | src/mailman/interfaces/domain.py | 11 | ||||
| -rw-r--r-- | src/mailman/interfaces/listmanager.py | 21 | ||||
| -rw-r--r-- | src/mailman/rest/docs/lists.txt | 43 |
9 files changed, 87 insertions, 14 deletions
diff --git a/src/mailman/app/lifecycle.py b/src/mailman/app/lifecycle.py index 85f08f7f7..d7a8ec1a7 100644 --- a/src/mailman/app/lifecycle.py +++ b/src/mailman/app/lifecycle.py @@ -31,9 +31,9 @@ import shutil import logging from mailman.config import config -from mailman.core import errors from mailman.email.validate import validate -from mailman.interfaces.domain import IDomainManager +from mailman.interfaces.domain import ( + BadDomainSpecificationError, IDomainManager) from mailman.interfaces.member import MemberRole from mailman.utilities.modules import call_name @@ -50,7 +50,7 @@ def create_list(fqdn_listname, owners=None): # pylint: disable-msg=W0612 listname, domain = fqdn_listname.split('@', 1) if domain not in IDomainManager(config): - raise errors.BadDomainSpecificationError(domain) + raise BadDomainSpecificationError(domain) mlist = config.db.list_manager.create(fqdn_listname) for style in config.style_manager.lookup(mlist): style.apply(mlist) diff --git a/src/mailman/bin/create_list.py b/src/mailman/bin/create_list.py index 59be836a2..4d1f56db1 100644 --- a/src/mailman/bin/create_list.py +++ b/src/mailman/bin/create_list.py @@ -23,6 +23,7 @@ from mailman.app.lifecycle import create_list from mailman.config import config from mailman.core import errors from mailman.email.message import UserNotification +from mailman.interfaces.domain import BadDomainSpecificationError from mailman.interfaces.listmanager import ListAlreadyExistsError from mailman.options import SingleMailingListOptions @@ -104,7 +105,7 @@ def main(): options.parser.error(_('Illegal list name: $fqdn_listname')) except ListAlreadyExistsError: options.parser.error(_('List already exists: $fqdn_listname')) - except errors.BadDomainSpecificationError, domain: + except BadDomainSpecificationError, domain: options.parser.error(_('Undefined domain: $domain')) config.db.commit() diff --git a/src/mailman/bin/import.py b/src/mailman/bin/import.py index d2361e808..bc26e441b 100644 --- a/src/mailman/bin/import.py +++ b/src/mailman/bin/import.py @@ -26,13 +26,13 @@ from xml.dom import minidom from xml.parsers.expat import ExpatError from mailman import Defaults -from mailman import errors from mailman import MemberAdaptor from mailman import Utils from mailman import passwords from mailman.MailList import MailList from mailman.i18n import _ from mailman.initialize import initialize +from mailman.interfaces.domain import BadDomainSpecificationError from mailman.version import MAILMAN_VERSION @@ -202,7 +202,7 @@ def create(all_listdata): print _('Creating mailing list: $fqdn_listname') mlist.Create(fqdn_listname, list_config['owner'][0], list_config['password']) - except errors.BadDomainSpecificationError: + except BadDomainSpecificationError: print _('List is not in a supported domain: $fqdn_listname') continue # Save the list creation, then unlock and relock the list. This is so diff --git a/src/mailman/core/errors.py b/src/mailman/core/errors.py index 9b053301c..f320dc9d2 100644 --- a/src/mailman/core/errors.py +++ b/src/mailman/core/errors.py @@ -23,7 +23,6 @@ __metaclass__ = type __all__ = [ 'AlreadyReceivingDigests', 'AlreadyReceivingRegularDeliveries', - 'BadDomainSpecificationError', 'BadPasswordSchemeError', 'CantDigestError', 'DiscardMessage', @@ -72,9 +71,6 @@ class MailmanError(MailmanException): """Base class for all Mailman errors.""" pass -class BadDomainSpecificationError(MailmanError): - """The specification of a virtual domain is invalid or duplicated.""" - # Exception hierarchy for bad email address errors that can be raised from diff --git a/src/mailman/database/domain.py b/src/mailman/database/domain.py index a729cb8e2..9d4e714bc 100644 --- a/src/mailman/database/domain.py +++ b/src/mailman/database/domain.py @@ -29,9 +29,9 @@ from urlparse import urljoin, urlparse from storm.locals import Int, Unicode from zope.interface import implements -from mailman.core.errors import BadDomainSpecificationError from mailman.database.model import Model -from mailman.interfaces.domain import IDomain, IDomainManager +from mailman.interfaces.domain import ( + BadDomainSpecificationError, IDomain, IDomainManager) diff --git a/src/mailman/database/listmanager.py b/src/mailman/database/listmanager.py index 887ec5e1f..6410d9198 100644 --- a/src/mailman/database/listmanager.py +++ b/src/mailman/database/listmanager.py @@ -86,3 +86,8 @@ class ListManager(object): """See `IListManager`.""" # lazr.restful will not allow this to be a generator. return list(self.mailing_lists) + + def new(self, fqdn_listname): + """See `IListManager.""" + from mailman.app.lifecycle import create_list + return create_list(fqdn_listname) diff --git a/src/mailman/interfaces/domain.py b/src/mailman/interfaces/domain.py index 96ec1568d..1ab8c82a6 100644 --- a/src/mailman/interfaces/domain.py +++ b/src/mailman/interfaces/domain.py @@ -21,6 +21,7 @@ from __future__ import absolute_import, unicode_literals __metaclass__ = type __all__ = [ + 'BadDomainSpecificationError', 'IDomain', 'IDomainCollection', 'IDomainManager', @@ -28,15 +29,23 @@ __all__ = [ from lazr.restful.declarations import ( - collection_default_content, export_as_webservice_collection, + collection_default_content, error_status, export_as_webservice_collection, export_as_webservice_entry, export_factory_operation, exported) from zope.interface import Interface, Attribute from zope.schema import TextLine +from mailman.core.errors import MailmanError from mailman.i18n import _ +@error_status(400) +class BadDomainSpecificationError(MailmanError): + """The specification of a virtual domain is invalid or duplicated.""" + + + + class IDomain(Interface): """Interface representing domains.""" diff --git a/src/mailman/interfaces/listmanager.py b/src/mailman/interfaces/listmanager.py index c8f49f447..aeb564641 100644 --- a/src/mailman/interfaces/listmanager.py +++ b/src/mailman/interfaces/listmanager.py @@ -27,7 +27,8 @@ __all__ = [ from lazr.restful.declarations import ( - collection_default_content, export_as_webservice_collection) + collection_default_content, export_as_webservice_collection, + export_factory_operation) from zope.interface import Interface, Attribute from mailman.interfaces.errors import MailmanError @@ -96,3 +97,21 @@ class IListManager(Interface): :return: The list of all known mailing lists. :rtype: list of `IMailingList` """ + + @export_factory_operation(IMailingList, ('fqdn_listname',)) + def new(fqdn_listname): + """Add a new maling list. + + The mailing may not exist yet, but the domain specified in + `fqdn_listname` must exist. + + :param fqdn_listname: The fully qualified name for the new + mailing list. + :type fqdn_listname: string + :return: The new mailing list + :rtype: `IMailingList` + :raises `BadDomainSpecificationError`: when the hostname part of + `fqdn_listname` does not exist. + :raises `ListAlreadyExistsError`: when the mailing list already + exists. + """ diff --git a/src/mailman/rest/docs/lists.txt b/src/mailman/rest/docs/lists.txt index d877a4cec..51e8d6a3e 100644 --- a/src/mailman/rest/docs/lists.txt +++ b/src/mailman/rest/docs/lists.txt @@ -30,3 +30,46 @@ Create a mailing list in a domain and it's accessible via the API. resource_type_link: http://localhost:8001/3.0/#mailing_lists start: 0 total_size: 1 + + +Creating lists via the API +========================== + +New mailing lists can also be created through the API, by posting to the +'mailing_lists' URL. However lazr.restful requires us to use a 'named +operation' instead of posting directly to the URL. + + >>> dump_json('http://localhost:8001/3.0/lists', { + ... 'ws.op': 'new', + ... 'fqdn_listname': 'test-two@example.com', + ... }) + URL: http://localhost:8001/3.0/lists + content-length: 0 + content-type: text/plain + date: ... + location: http://localhost:8001/3.0/mailing_lists/test-two@example.com + server: WSGIServer/... Python/... + x-content-type-warning: guessed from content + x-powered-by: Zope (www.zope.org), Python (www.python.org) + +The mailing list exists in the database. + + >>> config.db.list_manager.get('test-two@example.com') + <mailing list "test-two@example.com" at ...> + +However, you are not allowed to create a mailing list in a domain that does +not exist. + + >>> dump_json('http://localhost:8001/3.0/lists', { + ... 'ws.op': 'new', + ... 'fqdn_listname': 'test-three@example.org', + ... }) + XXX + +Nor can you create a mailing list that already exists. + + >>> dump_json('http://localhost:8001/3.0/lists', { + ... 'ws.op': 'new', + ... 'fqdn_listname': 'test-one@example.com', + ... }) + XXX |
