doc/provider.rst
author Sandro Knauß <knauss@netzguerilla.net>
Wed, 25 Apr 2012 00:04:47 +0200
branchdevel
changeset 274 1653470ccaff
parent 252 d0de2ca7201a
permissions -rw-r--r--
doc: adding sipgate documentation writing a new provider
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
252
d0de2ca7201a using sphinx for documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     1
Creating a new Providerbackend for Iro
d0de2ca7201a using sphinx for documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     2
======================================
d0de2ca7201a using sphinx for documentation.
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
     3
274
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
     4
See also class documentation :class:`iro.offer.provider.Provider`.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
     5
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
     6
A very simple provider 
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
     7
----------------------
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
     8
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
     9
For testing purpose it is nice to create a small provider.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    10
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    11
.. code-block:: python
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    12
    :linenos:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    13
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    14
    from iro.offer import providers, Provider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    15
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    16
    class TestProvider(Provider):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    17
        def __init__(self,name):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    18
            Provider.__init__(self, name, {"sms" : ["a",]})
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    19
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    20
    providers["myveryspecialProvider"] = TestProvider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    21
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    22
- *line 3* --  a Provider that supports message type **sms**, and has one route named **a**. 
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    23
- *line 5* -- register the provider type **TestProvider** in the global **providers** dict. Following section in configuraton file will create a new TestProvider object, with ``name="blablub"``::
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    24
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    25
   [blablub]
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    26
   #see line 5
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    27
   typ = myveryspecialProvider 
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    28
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    29
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    30
Normally a new Provider wants to have extra options for configuration file:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    31
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    32
.. code-block:: python
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    33
    :linenos:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    34
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    35
    from iro.offer import providers, Provider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    36
    from iro.config import Option
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    37
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    38
    def validater(value, field):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    39
        return value
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    40
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    41
    class TestProvider(Provider):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    42
        def __init__(self,name):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    43
            options =[("key", Option(validater,long="My Option explanation", must=True)),]
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    44
            Provider.__init__(self, name, {"sms" : ["a",]}, options)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    45
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    46
    providers["myveryspecialProvider"] = TestProvider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    47
 
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    48
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    49
in *line 9* we create a item list ( ``[(name,Option),...]`` -- more information about :class:`iro.config.Option`). **validater** have to be a function that returns value, if the value is valid. With this following section in configuration file is possible::
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    50
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    51
   [balblub]
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    52
   typ = myveryspecialProvider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    53
   #My Option explanation
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    54
   key = mykey
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    55
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    56
Ok, now we know to get settings into the provider. But we have to do anything, when user want to send anything. So we have to create a send function.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    57
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    58
Creating sipgate provider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    59
-------------------------
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    60
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    61
Sipgate supports sending sms and faxes via XML-RPC. so it is easy to create a new providerbackend for iro via sipgate. First we get the XML-RPC Api documention for sipgate (http://www.sipgate.de/beta/public/static/downloads/basic/api/sipgate_api_documentation.pdf). Sipgate uses HTTP Basic Authentification, that's we he create to options for our sipgate provider:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    62
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    63
.. code-block:: python
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    64
    :linenos:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    65
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    66
    from iro.offer import providers, Provider
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    67
    from iro.config import Option
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    68
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    69
    class Sipgate(Provider):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    70
        def __init__(self,name):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    71
            options =[("username", Option(lambda x,y: x,long="Loginname for sipgate", must=True)),
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    72
                      ("password", Option(lambda x,y: x,long="Password for sipgate", must=True)),]
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    73
            Provider.__init__(self, name, {"sms" : [None], "fax":[None]}, options)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    74
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    75
    providers["sipgate"] = Sipgate
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    76
 
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    77
- *line 6/7* -- we don't have any ideas what is allowed as username/password, so we create a validator that accepts everything.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    78
- *line 8* -- sipgate supports fax and sms, but now diffrent routes, that's we use ``None``.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    79
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    80
Now we have to possible options to implement the send function. either we implement a  blocking interface or use the recommended solution: twisted non blocking solution. We show here the recommended version.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    81
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    82
The Twisted Way (recommended solution)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    83
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    84
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    85
First we start to implement the ``fax`` and ``sms`` methods:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    86
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    87
.. code-block:: python
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    88
    :linenos:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    89
    
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    90
    def proxy(self):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    91
        return Proxy("https://%s:%s@samurai.sipgate.net/RPC2"%(self.username, self.password))
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    92
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    93
    def sms(self, recipient, sms):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    94
        args={
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    95
                "TOS" : "text",
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    96
                "Content" : sms.getContent(),
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    97
                "RemoteUri" : "sip:%s%s@sipgate.net"%(recipient.land, recipient.number),
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    98
                }
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
    99
        return self.proxy().callRemote("samurai.SessionInitiate",args)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   100
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   101
    def fax(self, recipient, fax):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   102
        args={
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   103
            "TOS" : "fax",
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   104
            "Content" : xmlrpclib.Binary(fax.getAttachment(0)),
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   105
            "RemoteUri" : "sip:%s%s@sipgate.net"%(recipient.land, recipient.number),
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   106
            }
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   107
        return self.proxy().callRemote("samurai.SessionInitiate",args)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   108
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   109
The code is straight forward with the API documentation from sipgate. Now we have to implement the heat of the provider the ``send`` method:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   110
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   111
.. code-block:: python
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   112
    :linenos:
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   113
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   114
    def _status(self,value,typ):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   115
        if typ not  in self.typs.keys():
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   116
            raise NoTyp(typ)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   117
        return Status(self, None, Decimal("1.00"), 1, value["SessionID"])
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   118
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   119
    def send(self, typ, recipient, msg):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   120
        if typ not  in self.typs.keys():
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   121
            raise NoTyp(typ)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   122
        d = getattr(self,typ)(recipient, msg)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   123
        d.addCallback(self._status, typ)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   124
        return d
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   125
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   126
    def getSendFunc(self, typ, route):
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   127
        """returns :meth:`send` method, if typ and route is valid."""
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   128
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   129
        Provider.getSendFunc(self, typ, route)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   130
        return partial(self.send, typ)
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   131
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   132
Because sipgate doesn't support different routes, we implement a send function without route argument.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   133
That's why we have to rewrite the ``getSendFunc`` method. It now returns a partial function with only a binded ``typ``.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   134
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   135
The ``send`` method first test the for a valid typ (*line 7/8*), than it execute the ``sms`` or ``fax`` method.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   136
For a valid provider we have to return a :class:`~iro.model.status.Status` object.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   137
There for we add a callback that returns a :class:`~iro.model.status.Status` object (see ``_status`` method).
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   138
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   139
Unfortunatelly sipgate doesn't support methods to get the price for one action.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   140
So we have to set set a fixed price here ``Decimal('1.00')``.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   141
In the wild we implement new configuration parameters for priceing.
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   142
1653470ccaff doc: adding sipgate documentation
Sandro Knauß <knauss@netzguerilla.net>
parents: 252
diff changeset
   143
Now the provider is ready to use. For complete source of this tutorial see :class:`iro.offer.sipgate`.