iro/offer/sipgate.py
author Sandro Knauß <knauss@netzguerilla.net>
Tue, 24 Apr 2012 23:59:00 +0200
branchdevel
changeset 272 97826c8248f9
child 294 0e75bd39767d
permissions -rw-r--r--
adding sipgate backend
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
272
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
from functools import partial
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
from twisted.web.xmlrpc import Proxy
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
import xmlrpclib
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     4
from decimal import Decimal
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     5
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     6
from .provider import providers, Provider
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     7
from ..config import Option
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     8
from ..validate import vFloat
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     9
from ..model.status import Status
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    10
from ..error import NoTyp
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    11
from .. import __version__
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    12
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    13
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    14
class Sipgate(Provider):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    15
    """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    16
        s. auch http.tuxad.com/sipgate.html
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    17
        und http://lists.sipgate.net/pipermail/sipgate-developers/2007-September/000016.html
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    18
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    19
        http://www.sipgate.de/beta/public/static/downloads/basic/api/sipgate_api_documentation.pdf
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    20
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    21
        See :doc:`provider` for a tutorial, how to create a new provider backend. This turorial implements this provider.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    22
    """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    23
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    24
    url="https://%s:%s@samurai.sipgate.net/RPC2"
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    25
    """XML-RPC url for sipgate"""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    26
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    27
    def __init__(self,name):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    28
        options =[("username", Option(lambda x,y: x,long="Loginname for sipgate", must=True)),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    29
                  ("password", Option(lambda x,y: x,long="Password for sipgate", must=True)),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    30
                  ("price_sms", Option(vFloat, long="price for one sms", default="0.079")),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    31
                  ("price_fax", Option(vFloat, long="price for one fax", default="0.03")),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    32
                  ]
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    33
        Provider.__init__(self, name, {"sms" : [None], "fax":[None]}, options)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    34
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    35
    def proxy(self):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
        """returns a XML-RPC proxy object to sipgate API."""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    37
        return Proxy(self.url%(self.username, self.password))
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    38
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    39
    def load(self,cfg):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    40
        """Loads configuration into object.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    41
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    42
        :param dict cfg: The Configuration dict. Normally you use ``configParser.items("section")``.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    43
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    44
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    45
        Provider.load(self,cfg)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    46
        #return self.clientIdentify()
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    47
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    48
    def clientIdentify(self):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    49
        """identificaton of client to sipgate server."""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    50
        args_identify = {
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    51
                "ClientName"    : "Iro",
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    52
                "ClientVersion" : __version__,
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    53
                "ClientVendor"  : "netzguerilla.net"
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    54
                }
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    55
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    56
        return self.proxy().callRemote("samurai.ClientIdentify", args_identify)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    57
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    58
    def sms(self, recipient, sms):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    59
        """send one SMS to recimpient.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    60
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    61
        :param `iro.telnumber.Telnumber` recipient: mobilenumber of recipient
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    62
        :param `iro.model.message.SMS` sms: the sms to send
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    63
        :return: a deferrer
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    64
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    65
        args={
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    66
                "TOS" : "text",
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    67
                "Content" : sms.getContent(),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    68
                "RemoteUri" : "sip:%s%s@sipgate.net"%(recipient.land, recipient.number),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    69
                }
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    70
        return self.proxy().callRemote("samurai.SessionInitiate",args)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    71
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    72
    def fax(self, recipient, fax):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    73
        """send one fax to recimpient.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    74
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    75
        :param `iro.telnumber.Telnumber` recipient: faxnumber of recipient
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    76
        :param `iro.model.message.Fax` fax: the fax to send
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    77
        :return: a deferrer.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    78
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    79
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    80
        args={
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    81
            "TOS" : "fax",
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    82
            "Content" : xmlrpclib.Binary(fax.getAttachment(0)),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    83
            "RemoteUri" : "sip:%s%s@sipgate.net"%(recipient.land, recipient.number),
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    84
            }
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    85
        return self.proxy().callRemote("samurai.SessionInitiate",args)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    86
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    87
    def _status(self,value,typ):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    88
        """returns a :class:`~iro.model.status.Status` object.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    89
        :raises: :exc:`iro.error.NoTyp`
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    90
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    91
        if typ not  in self.typs.keys():
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    92
            raise NoTyp(typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    93
        return Status(self, None, Decimal(getattr(self,"price_"+typ)), 1, value["SessionID"])
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    94
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    95
    def send(self, typ, recipient, msg):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    96
        """send msg to recipient.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    97
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    98
        :param string typ: Typ of message.
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    99
        :param `iro.telnumber.Telnumber` recipient: telnumber of recipient
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   100
        :param msg: the msg to send
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   101
        :type msg: :class:`iro.model.message.Fax` or :class:`iro.model.message.SMS`
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   102
        :return: a deferrer, that returns a :class:`~iro.model.status.Status` object
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   103
        :raises: :exc:`iro.error.NoTyp`
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   104
        """
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   105
        if typ not  in self.typs.keys():
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   106
            raise NoTyp(typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   107
        d = getattr(self,typ)(recipient, msg)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   108
        d.addCallback(self._status, typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   109
        return d
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   110
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   111
    def getSendFunc(self, typ, route):
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   112
        """returns :meth:`send` method with bound typ, if typ and route is valid."""
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   113
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   114
        Provider.getSendFunc(self, typ, route)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   115
        return partial(self.send, typ)
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   116
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   117
providers["sipgate"] = Sipgate
97826c8248f9 adding sipgate backend
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
   118