aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Finucane <stephen.finucane@intel.com>2015-10-10 03:50:53 +0100
committerStephen Finucane <stephen.finucane@intel.com>2015-10-26 21:03:03 +0000
commit63f42544f5bbe3d45d63d1d0f102cf9b53cf3054 (patch)
tree3600825dccc0049b676487c91bf7afbc821782e8
parent5d9f523b4d0c472edd543d7083303bcdbd90ca25 (diff)
downloadpatchwork-63f42544f5bbe3d45d63d1d0f102cf9b53cf3054.tar
patchwork-63f42544f5bbe3d45d63d1d0f102cf9b53cf3054.tar.gz
views/xmlrpc: Add xmlrpc automatic documentation
The DocXMLRPCServer module (standard library) provides documentation for XML-RPC dispatchers via pydoc. Use this module rather than reinventing the wheel. Also update a test that no longer makes sense (the GET method now retrieves documentation - it shouldn't redirect. Use PATCH instead). Signed-off-by: Stephen Finucane <stephen.finucane@intel.com>
-rw-r--r--patchwork/tests/test_xmlrpc.py2
-rw-r--r--patchwork/views/xmlrpc.py26
2 files changed, 20 insertions, 8 deletions
diff --git a/patchwork/tests/test_xmlrpc.py b/patchwork/tests/test_xmlrpc.py
index b7c629e..d37c281 100644
--- a/patchwork/tests/test_xmlrpc.py
+++ b/patchwork/tests/test_xmlrpc.py
@@ -37,7 +37,7 @@ class XMLRPCTest(LiveServerTestCase):
self.rpc = xmlrpclib.Server(self.url)
def testGetRedirect(self):
- response = self.client.get(self.url)
+ response = self.client.patch(self.url)
self.assertRedirects(response,
reverse('patchwork.views.help',
kwargs = {'path': 'pwclient/'}))
diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py
index 8715dea..8766419 100644
--- a/patchwork/views/xmlrpc.py
+++ b/patchwork/views/xmlrpc.py
@@ -21,6 +21,7 @@
#
from SimpleXMLRPCServer import SimpleXMLRPCDispatcher
+from DocXMLRPCServer import XMLRPCDocGenerator
import base64
import sys
import xmlrpclib
@@ -35,11 +36,16 @@ from patchwork.models import Patch, Project, Person, State
from patchwork.views import patch_to_mbox
-class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher):
+class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher,
+ XMLRPCDocGenerator):
+
+ server_name = 'Patchwork XML-RPC API'
+ server_title = 'Patchwork XML-RPC API v1 Documentation'
def __init__(self):
SimpleXMLRPCDispatcher.__init__(self, allow_none=False,
encoding=None)
+ XMLRPCDocGenerator.__init__(self)
def _dumps(obj, *args, **kwargs):
kwargs['allow_none'] = self.allow_none
@@ -52,6 +58,7 @@ class PatchworkXMLRPCDispatcher(SimpleXMLRPCDispatcher):
self.func_map = {}
def register_function(self, fn, auth_required):
+ self.funcs[fn.__name__] = fn # needed by superclass methods
self.func_map[fn.__name__] = (auth_required, fn)
def _user_for_request(self, request):
@@ -120,16 +127,21 @@ dispatcher = PatchworkXMLRPCDispatcher()
@csrf_exempt
def xmlrpc(request):
- if request.method != 'POST':
+ if request.method not in ['POST', 'GET']:
return HttpResponseRedirect(urlresolvers.reverse(
'patchwork.views.help', kwargs={'path': 'pwclient/'}))
response = HttpResponse()
- try:
- ret = dispatcher._marshaled_dispatch(request)
- response.write(ret)
- except Exception:
- return HttpResponseServerError()
+
+ if request.method == 'POST':
+ try:
+ ret = dispatcher._marshaled_dispatch(request)
+ except Exception:
+ return HttpResponseServerError()
+ else:
+ ret = dispatcher.generate_html_documentation()
+
+ response.write(ret)
return response