iro/view/jsonrpc.py
author Sandro Knauß <knauss@netzguerilla.net>
Thu, 27 Sep 2012 14:20:03 +0200
branchdevel
changeset 296 a73bbc1d8b4b
permissions -rw-r--r--
adding jsonrpc interface
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
296
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
# -*- coding: utf-8 -*-
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
#
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
# This file is part of Iro.
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
#
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
# Permission is hereby granted, free of charge, to any person obtaining a copy of
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
# this software and associated documentation files (the "Software"), to deal in
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
# the Software without restriction, including without limitation the rights to use,
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
# #Software, and to permit persons to whom the Software is furnished to do so,
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
# subject to the following conditions:
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
#
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
# The above copyright notice and this permission notice shall be included in
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
# all copies or substantial portions of the Software.
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    16
#
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    17
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    21
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
from txjsonrpc.web import jsonrpc
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
from txjsonrpc import jsonrpclib
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
from ..controller.viewinterface import Interface
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
from ..error import InterfaceException, ValidateException
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
class TwistedInterface(Interface):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
    """Class that addes needed function for XML-RPC/SOAP"""
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
    def __init__(self):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
        Interface.__init__(self)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
    def listMethods(self):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
        """Since we override lookupProcedure, its suggested to override
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
        listProcedures too.
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
        """
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
        return self.listProcedures()
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
    def listProcedures(self):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
        """returns a list of all functions that are allowed to call via XML-RPC."""
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
        return ['listMethods','status','sms','fax','mail','routes','defaultRoute','bill','telnumber','email']
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    45
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    46
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
class JSONRPCInterface(TwistedInterface,jsonrpc.JSONRPC):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    48
    """JSON-RPC interface"""
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    49
    NOT_FOUND = jsonrpclib.METHOD_NOT_FOUND
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    50
    def __init__(self):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    51
        jsonrpc.JSONRPC.__init__(self)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    52
        TwistedInterface.__init__(self)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    53
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    54
    def _getFunction(self, procedurePath):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    55
        if procedurePath not in self.listProcedures():
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    56
            raise jsonrpclib.NoSuchFunction(self.NOT_FOUND,
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    57
                    "procedure %s not found" % procedurePath)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    58
        try:
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    59
            return getattr(self,procedurePath)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    60
        except KeyError:
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    61
            raise jsonrpclib.NoSuchFunction(self.NOT_FOUND,
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    62
                    "procedure %s not found" % procedurePath)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    63
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    64
    def _ebRender(self, failure, id):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
        if isinstance(failure.value, InterfaceException):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    66
            return jsonrpclib.Fault(failure.value.code, failure.value.msg)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    67
        if isinstance(failure.value, ValidateException):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    68
            return jsonrpclib.Fault(failure.value.code, failure.value.msg)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    69
        return jsonrpc.JSONRPC._ebRender(self, failure, id)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    70
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    71
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    72
def appendResource(root):
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    73
    """adding JSONRPC to root."""
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    74
    root.putChild('jsonrpc', JSONRPCInterface())
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    76
if __name__ == '__main__':
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    77
    from twisted.web import resource, server
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    78
    from twisted.internet import reactor
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    79
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
    root = resource.Resource()
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    81
    root = appendResource(root)
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    82
    reactor.listenTCP(7080, server.Site(root))
a73bbc1d8b4b adding jsonrpc interface
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    83
    reactor.run()