diff options
Diffstat (limited to 'src/mailman/rest')
| -rw-r--r-- | src/mailman/rest/addresses.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/bans.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/docs/__init__.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/domains.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/header_matches.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/helpers.py | 8 | ||||
| -rw-r--r-- | src/mailman/rest/listconf.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/lists.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/members.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/post_moderation.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/preferences.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/queues.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/root.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/sub_moderation.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/templates.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/tests/test_helpers.py | 25 | ||||
| -rw-r--r-- | src/mailman/rest/uris.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/users.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/validator.py | 2 | ||||
| -rw-r--r-- | src/mailman/rest/wsgiapp.py | 2 |
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) |
