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
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.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