1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
|
# Copyright (C) 2009 by the Free Software Foundation, Inc.
#
# This file is part of GNU Mailman.
#
# GNU Mailman is free software: you can redistribute it and/or modify it under
# the terms of the GNU General Public License as published by the Free
# Software Foundation, either version 3 of the License, or (at your option)
# any later version.
#
# GNU Mailman is distributed in the hope that it will be useful, but WITHOUT
# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
# more details.
#
# You should have received a copy of the GNU General Public License along with
# GNU Mailman. If not, see <http://www.gnu.org/licenses/>.
"""Module stuff."""
from __future__ import absolute_import, unicode_literals
__metaclass__ = type
__all__ = [
'AdminWebServicePublication',
]
import traceback
from lazr.restful.publisher import WebServicePublicationMixin
from zope.component import queryMultiAdapter
from zope.interface import implements
from zope.publisher.interfaces import IPublication, NotFound
from zope.publisher.publish import mapply
from zope.security.management import endInteraction, newInteraction
from mailman.interfaces.rest import IResolvePathNames
class Publication:
"""Very simple implementation of `IPublication`."""
implements(IPublication)
def __init__(self, application):
self.application = application
def beforeTraversal(self, request):
"""See `IPublication`."""
pass
def getApplication(self, request):
"""See `IPublication`."""
return self.application
def callTraversalHooks(self, request, ob):
"""See `IPublication`."""
pass
def traverseName(self, request, ob, name):
"""See `IPublication`."""
missing = object()
resolver = IResolvePathNames(ob, missing)
if resolver is missing:
raise NotFound(ob, name, request)
return ob.get(name)
def afterTraversal(self, request, ob):
pass
def callObject(self, request, ob):
"""Call the object, returning the result."""
# XXX Bad hack.
from zope.security.proxy import removeSecurityProxy
ob = removeSecurityProxy(ob)
return mapply(ob, request.getPositionalArguments(), request)
def afterCall(self, request, ob):
pass
def handleException(self, object, request, exc_info, retry_allowed=1):
"""Prints the exception."""
# Reproduce the behavior of ZopePublication by looking up a view
# for this exception.
exception = exc_info[1]
view = queryMultiAdapter((exception, request), name='index.html')
if view is not None:
exc_info = None
request.response.reset()
request.response.setResult(view())
else:
traceback.print_exception(*exc_info)
def endRequest(self, request, ob):
"""Ends the interaction."""
endInteraction()
class AdminWebServicePublication(WebServicePublicationMixin, Publication):
"""A publication that mixes in the necessary web service stuff."""
|