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