summaryrefslogtreecommitdiff
path: root/src/mailman/rest
diff options
context:
space:
mode:
Diffstat (limited to 'src/mailman/rest')
-rw-r--r--src/mailman/rest/addresses.py2
-rw-r--r--src/mailman/rest/bans.py2
-rw-r--r--src/mailman/rest/docs/__init__.py2
-rw-r--r--src/mailman/rest/domains.py2
-rw-r--r--src/mailman/rest/header_matches.py2
-rw-r--r--src/mailman/rest/helpers.py8
-rw-r--r--src/mailman/rest/listconf.py2
-rw-r--r--src/mailman/rest/lists.py2
-rw-r--r--src/mailman/rest/members.py2
-rw-r--r--src/mailman/rest/post_moderation.py2
-rw-r--r--src/mailman/rest/preferences.py2
-rw-r--r--src/mailman/rest/queues.py2
-rw-r--r--src/mailman/rest/root.py2
-rw-r--r--src/mailman/rest/sub_moderation.py2
-rw-r--r--src/mailman/rest/templates.py2
-rw-r--r--src/mailman/rest/tests/test_helpers.py25
-rw-r--r--src/mailman/rest/uris.py2
-rw-r--r--src/mailman/rest/users.py2
-rw-r--r--src/mailman/rest/validator.py2
-rw-r--r--src/mailman/rest/wsgiapp.py2
20 files changed, 49 insertions, 20 deletions
diff --git a/src/mailman/rest/addresses.py b/src/mailman/rest/addresses.py
index f0cb8edef..8e8b543b9 100644
--- a/src/mailman/rest/addresses.py
+++ b/src/mailman/rest/addresses.py
@@ -17,7 +17,6 @@
"""REST for addresses."""
-from mailman import public
from mailman.interfaces.address import (
ExistingAddressError, InvalidEmailAddressError)
from mailman.interfaces.usermanager import IUserManager
@@ -29,6 +28,7 @@ from mailman.rest.preferences import Preferences
from mailman.rest.validator import Validator
from mailman.utilities.datetime import now
from operator import attrgetter
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/bans.py b/src/mailman/rest/bans.py
index ce575885b..981c1b549 100644
--- a/src/mailman/rest/bans.py
+++ b/src/mailman/rest/bans.py
@@ -17,12 +17,12 @@
"""REST for banned emails."""
-from mailman import public
from mailman.interfaces.bans import IBanManager
from mailman.rest.helpers import (
CollectionMixin, bad_request, child, created, etag, no_content, not_found,
okay)
from mailman.rest.validator import Validator
+from public import public
class _BannedBase:
diff --git a/src/mailman/rest/docs/__init__.py b/src/mailman/rest/docs/__init__.py
index 5a039ac3d..dc27a6525 100644
--- a/src/mailman/rest/docs/__init__.py
+++ b/src/mailman/rest/docs/__init__.py
@@ -20,9 +20,9 @@
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer
-from mailman import public
from mailman.testing.helpers import wait_for_webservice
from mailman.testing.layers import RESTLayer
+from public import public
# New in Python 3.5.
diff --git a/src/mailman/rest/domains.py b/src/mailman/rest/domains.py
index c6b8daa7c..ce96204b4 100644
--- a/src/mailman/rest/domains.py
+++ b/src/mailman/rest/domains.py
@@ -17,7 +17,6 @@
"""REST for domains."""
-from mailman import public
from mailman.interfaces.domain import (
BadDomainSpecificationError, IDomainManager)
from mailman.rest.helpers import (
@@ -27,6 +26,7 @@ from mailman.rest.lists import ListsForDomain
from mailman.rest.uris import ADomainURI, AllDomainURIs
from mailman.rest.users import ListOfDomainOwners, OwnersForDomain
from mailman.rest.validator import Validator, list_of_strings_validator
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/header_matches.py b/src/mailman/rest/header_matches.py
index 25c519ef3..13dad97ad 100644
--- a/src/mailman/rest/header_matches.py
+++ b/src/mailman/rest/header_matches.py
@@ -17,13 +17,13 @@
"""REST API for a mailing list's header matches."""
-from mailman import public
from mailman.interfaces.action import Action
from mailman.interfaces.mailinglist import IHeaderMatchList
from mailman.rest.helpers import (
CollectionMixin, bad_request, child, created, etag, no_content, not_found,
okay)
from mailman.rest.validator import Validator, enum_validator
+from public import public
def lowercase(value):
diff --git a/src/mailman/rest/helpers.py b/src/mailman/rest/helpers.py
index 9ab1f434e..6b45eb78a 100644
--- a/src/mailman/rest/helpers.py
+++ b/src/mailman/rest/helpers.py
@@ -23,11 +23,13 @@ import hashlib
from contextlib import suppress
from datetime import datetime, timedelta
+from email.header import Header
+from email.message import Message
from enum import Enum
from lazr.config import as_boolean
-from mailman import public
from mailman.config import config
from pprint import pformat
+from public import public
class ExtendedEncoder(json.JSONEncoder):
@@ -49,6 +51,10 @@ class ExtendedEncoder(json.JSONEncoder):
return obj.name
elif isinstance(obj, bytes):
return bytes_to_str(obj)
+ elif isinstance(obj, Message):
+ return obj.as_string()
+ elif isinstance(obj, Header):
+ return str(obj)
return super().default(obj)
diff --git a/src/mailman/rest/listconf.py b/src/mailman/rest/listconf.py
index cbb75c267..416336142 100644
--- a/src/mailman/rest/listconf.py
+++ b/src/mailman/rest/listconf.py
@@ -18,7 +18,6 @@
"""Mailing list configuration via REST API."""
from lazr.config import as_boolean, as_timedelta
-from mailman import public
from mailman.config import config
from mailman.interfaces.action import Action
from mailman.interfaces.archiver import ArchivePolicy
@@ -33,6 +32,7 @@ from mailman.rest.helpers import (
from mailman.rest.validator import (
PatchValidator, ReadOnlyPATCHRequestError, UnknownPATCHRequestError,
Validator, enum_validator, list_of_strings_validator)
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/lists.py b/src/mailman/rest/lists.py
index 1fdf595fb..cdebdebd9 100644
--- a/src/mailman/rest/lists.py
+++ b/src/mailman/rest/lists.py
@@ -18,7 +18,6 @@
"""REST for mailing lists."""
from lazr.config import as_boolean
-from mailman import public
from mailman.app.digests import (
bump_digest_number_and_volume, maybe_send_digest_now)
from mailman.app.lifecycle import create_list, remove_list
@@ -41,6 +40,7 @@ from mailman.rest.post_moderation import HeldMessages
from mailman.rest.sub_moderation import SubscriptionRequests
from mailman.rest.uris import AListURI, AllListURIs
from mailman.rest.validator import Validator, list_of_strings_validator
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/members.py b/src/mailman/rest/members.py
index b35440af4..ea7eaa394 100644
--- a/src/mailman/rest/members.py
+++ b/src/mailman/rest/members.py
@@ -17,7 +17,6 @@
"""REST for members."""
-from mailman import public
from mailman.app.membership import add_member, delete_member
from mailman.interfaces.action import Action
from mailman.interfaces.address import IAddress
@@ -36,6 +35,7 @@ from mailman.rest.helpers import (
from mailman.rest.preferences import Preferences, ReadOnlyPreferences
from mailman.rest.validator import (
Validator, enum_validator, subscriber_validator)
+from public import public
from uuid import UUID
from zope.component import getUtility
diff --git a/src/mailman/rest/post_moderation.py b/src/mailman/rest/post_moderation.py
index 33a32de20..9a56ada00 100644
--- a/src/mailman/rest/post_moderation.py
+++ b/src/mailman/rest/post_moderation.py
@@ -17,7 +17,6 @@
"""REST API for held message moderation."""
-from mailman import public
from mailman.app.moderator import handle_message
from mailman.interfaces.action import Action
from mailman.interfaces.messages import IMessageStore
@@ -25,6 +24,7 @@ from mailman.interfaces.requests import IListRequests, RequestType
from mailman.rest.helpers import (
CollectionMixin, bad_request, child, etag, no_content, not_found, okay)
from mailman.rest.validator import Validator, enum_validator
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/preferences.py b/src/mailman/rest/preferences.py
index cf26380fe..549751d1e 100644
--- a/src/mailman/rest/preferences.py
+++ b/src/mailman/rest/preferences.py
@@ -18,12 +18,12 @@
"""Preferences."""
from lazr.config import as_boolean
-from mailman import public
from mailman.interfaces.member import DeliveryMode, DeliveryStatus
from mailman.rest.helpers import (
GetterSetter, bad_request, etag, no_content, not_found, okay)
from mailman.rest.validator import (
Validator, enum_validator, language_validator)
+from public import public
PREFERENCES = (
diff --git a/src/mailman/rest/queues.py b/src/mailman/rest/queues.py
index 9fa5b9dc6..27e9c698e 100644
--- a/src/mailman/rest/queues.py
+++ b/src/mailman/rest/queues.py
@@ -17,13 +17,13 @@
"""<api>/queues."""
-from mailman import public
from mailman.app.inject import inject_text
from mailman.config import config
from mailman.interfaces.listmanager import IListManager
from mailman.rest.helpers import (
CollectionMixin, bad_request, created, etag, no_content, not_found, okay)
from mailman.rest.validator import Validator
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/root.py b/src/mailman/rest/root.py
index 7f6be0353..c4c0b865f 100644
--- a/src/mailman/rest/root.py
+++ b/src/mailman/rest/root.py
@@ -17,7 +17,6 @@
"""The root of the REST API."""
-from mailman import public
from mailman.config import config
from mailman.core.api import API30, API31
from mailman.core.constants import system_preferences
@@ -36,6 +35,7 @@ from mailman.rest.queues import AQueue, AQueueFile, AllQueues
from mailman.rest.templates import TemplateFinder
from mailman.rest.uris import ASiteURI, AllSiteURIs
from mailman.rest.users import AUser, AllUsers, ServerOwners
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/sub_moderation.py b/src/mailman/rest/sub_moderation.py
index 55b6a7609..39976826c 100644
--- a/src/mailman/rest/sub_moderation.py
+++ b/src/mailman/rest/sub_moderation.py
@@ -17,7 +17,6 @@
"""REST API for held subscription requests."""
-from mailman import public
from mailman.app.moderator import send_rejection
from mailman.core.i18n import _
from mailman.interfaces.action import Action
@@ -28,6 +27,7 @@ from mailman.rest.helpers import (
CollectionMixin, bad_request, child, conflict, etag, no_content,
not_found, okay)
from mailman.rest.validator import Validator, enum_validator
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/templates.py b/src/mailman/rest/templates.py
index fe5e34a8e..7f4e5a3af 100644
--- a/src/mailman/rest/templates.py
+++ b/src/mailman/rest/templates.py
@@ -17,9 +17,9 @@
"""Template finder."""
-from mailman import public
from mailman.rest.helpers import not_found
from mailman.utilities.i18n import TemplateNotFoundError, find
+from public import public
# Use mimetypes.guess_all_extensions()?
diff --git a/src/mailman/rest/tests/test_helpers.py b/src/mailman/rest/tests/test_helpers.py
index 982b97ef3..07ae784c8 100644
--- a/src/mailman/rest/tests/test_helpers.py
+++ b/src/mailman/rest/tests/test_helpers.py
@@ -17,11 +17,14 @@
"""Additional tests for helpers."""
+import json
import unittest
from datetime import timedelta
+from email.header import Header
+from email.message import Message
from mailman.rest import helpers
-from mailman.testing.layers import ConfigLayer
+from mailman.testing.layers import ConfigLayer, RESTLayer
class FakeResponse:
@@ -74,3 +77,23 @@ class TestHelpers(unittest.TestCase):
def test_json_encoding_default(self):
resource = dict(interval=Unserializable())
self.assertRaises(TypeError, helpers.etag, resource)
+
+
+class TestJSONEncoder(unittest.TestCase):
+ """Test the JSON ExtendedEncoder."""
+ layer = RESTLayer
+
+ def test_encode_message(self):
+ msg = Message()
+ msg['From'] = 'test@example.com'
+ msg.set_payload('Test content.')
+ result = json.dumps(msg, cls=helpers.ExtendedEncoder)
+ self.assertEqual(
+ result, json.dumps('From: test@example.com\n\nTest content.'))
+
+ def test_encode_header(self):
+ value = 'Contains non-ascii \u00e9 \u00e7 \u00e0'
+ result = json.dumps(
+ Header(value, charset='utf-8'),
+ cls=helpers.ExtendedEncoder)
+ self.assertEqual(result, json.dumps(value))
diff --git a/src/mailman/rest/uris.py b/src/mailman/rest/uris.py
index 2fc062262..d94b3b237 100644
--- a/src/mailman/rest/uris.py
+++ b/src/mailman/rest/uris.py
@@ -17,12 +17,12 @@
"""URI templates."""
-from mailman import public
from mailman.interfaces.template import ALL_TEMPLATES, ITemplateManager
from mailman.rest.helpers import (
CollectionMixin, bad_request, etag, no_content, not_found, okay)
from mailman.rest.validator import Validator
from operator import attrgetter
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/users.py b/src/mailman/rest/users.py
index f9ce9b132..c50bfe3d0 100644
--- a/src/mailman/rest/users.py
+++ b/src/mailman/rest/users.py
@@ -19,7 +19,6 @@
from functools import lru_cache
from lazr.config import as_boolean
-from mailman import public
from mailman.config import config
from mailman.interfaces.address import ExistingAddressError
from mailman.interfaces.usermanager import IUserManager
@@ -32,6 +31,7 @@ from mailman.rest.validator import (
PatchValidator, ReadOnlyPATCHRequestError, UnknownPATCHRequestError,
Validator, list_of_strings_validator)
from passlib.utils import generate_password as generate
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/validator.py b/src/mailman/rest/validator.py
index 19e8d684a..439c25b8e 100644
--- a/src/mailman/rest/validator.py
+++ b/src/mailman/rest/validator.py
@@ -17,10 +17,10 @@
"""REST web form validation."""
-from mailman import public
from mailman.interfaces.address import IEmailValidator
from mailman.interfaces.errors import MailmanError
from mailman.interfaces.languages import ILanguageManager
+from public import public
from zope.component import getUtility
diff --git a/src/mailman/rest/wsgiapp.py b/src/mailman/rest/wsgiapp.py
index 3ba122c00..b2dbc7409 100644
--- a/src/mailman/rest/wsgiapp.py
+++ b/src/mailman/rest/wsgiapp.py
@@ -23,10 +23,10 @@ import logging
from base64 import b64decode
from falcon import API, HTTPUnauthorized
from falcon.routing import create_http_method_map
-from mailman import public
from mailman.config import config
from mailman.database.transaction import transactional
from mailman.rest.root import Root
+from public import public
from wsgiref.simple_server import (
WSGIRequestHandler, WSGIServer, make_server as wsgi_server)