summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBarry Warsaw2009-07-26 21:23:02 -0400
committerBarry Warsaw2009-07-26 21:23:02 -0400
commit46d51f3f1b7b241b079b0377d99f969f2fe1373f (patch)
tree7e5c097410c360d4c1cd9d23dd34dcdf22e0ee5a /src
parent9c5c394a0912b56dd0fa1cabe07833aca24b92ef (diff)
downloadmailman-46d51f3f1b7b241b079b0377d99f969f2fe1373f.tar.gz
mailman-46d51f3f1b7b241b079b0377d99f969f2fe1373f.tar.zst
mailman-46d51f3f1b7b241b079b0377d99f969f2fe1373f.zip
Diffstat (limited to 'src')
-rw-r--r--src/mailman/app/lifecycle.py6
-rw-r--r--src/mailman/bin/create_list.py3
-rw-r--r--src/mailman/bin/import.py4
-rw-r--r--src/mailman/core/errors.py4
-rw-r--r--src/mailman/database/domain.py4
-rw-r--r--src/mailman/database/listmanager.py5
-rw-r--r--src/mailman/interfaces/domain.py11
-rw-r--r--src/mailman/interfaces/listmanager.py21
-rw-r--r--src/mailman/rest/docs/lists.txt43
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