iro/offer/provider.py
author Sandro Knauß <knauss@netzguerilla.net>
Sun, 25 Mar 2012 20:14:35 +0200
branchdevel
changeset 253 e8d56537c9cc
parent 220 602720314930
child 254 de301b8c58d9
permissions -rw-r--r--
start documenting with reST syntax.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
     1
from functools import partial
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
     2
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
     3
from ..error import NoRoute, NoTyp, ValidateException, NoProvider
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
     4
from ..config import Option, Config
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
     5
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
     6
class Provider(Config):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
     7
    """Base class for Providerbackends."""
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
     8
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
     9
    testmode = False
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    10
    """- **True** -- no message to external provider should be send.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    11
    - **False** (default) -- message are send to external provider."""
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    12
    def __init__(self, name, typs={}):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    13
        """Constructor for Provider class.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    14
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    15
        :param string name: Name of the Provider.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    16
        :param dict typs: A Dictonary with typs and routes.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    17
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    18
        >>> p = Provider("myProvider",{"sms":["route1","route2"]})
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    19
        """
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    20
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    21
        Config.__init__(self, name)
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 161
diff changeset
    22
        self.typs=typs
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 161
diff changeset
    23
        self.testmode = False
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    24
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    25
        self.options = {
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 186
diff changeset
    26
                "typ":Option(vProvider, long="One available provider typ.", must=True, default=name)
183
07ee5543751b offer.provider now handles the options dict and loadConfig is only in Provider class
Sandro Knauß <knauss@netzguerilla.net>
parents: 180
diff changeset
    27
                }
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    28
        """Options dict for Options used in configuration file (see :class:`iro.config.Option`). Ordering of configuration fields are done by :attr:`order`. 
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    29
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    30
        Sample::
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    31
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    32
               {"typ":Option(vProvider, long="One available provider typ.", must=True, default="default")}
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    33
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    34
        A child class typically use update to add more options (see code of :class:`iro.offer.smtp.SMTP`).
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    35
        """
157
0192f9107870 model.offer.loadOffers implemented
Sandro Knauß <knauss@netzguerilla.net>
parents:
diff changeset
    36
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 186
diff changeset
    37
        self.order = ["typ"]
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    38
        """ A list for ordering the options dict (:attr:`options`). """
220
602720314930 adding config.Config.sampleConf for creating a sample configuration
Sandro Knauß <knauss@netzguerilla.net>
parents: 186
diff changeset
    39
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    40
    def send(self, typ, route, recipient, message):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    41
        """Main send function, that is called, for every single message.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    42
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    43
        .. note::
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    44
            This function is not used directly. Normally :func:`~iro.offer.provider.Provider.getSendFunc` return this function with typ and route bound."""
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    45
        pass
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    46
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    47
    def getSendFunc(self, typ, route):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    48
        """Returns the actually send Functionfor a given typ and route.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    49
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    50
        Normally it returns the send function with typ and route bound.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    51
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    52
        :raises: :exc:`~iro.error.NoRoute`, :exc:`~iro.error.NoTyp`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    53
        """
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    54
171
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    55
        try:
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    56
            if route not in self.typs[typ]:
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    57
                raise NoRoute(route)
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    58
        except KeyError:
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    59
            raise NoTyp(route)
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    60
        return partial(self.send, typ, route)
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    61
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    62
def getProvider(name, typ, config):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    63
    '''creates a provider object and init this with config.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    64
   
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    65
    :param dict config: The Configuration dict. Normally you use ``configParser.items("section")``.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    66
    :param string typ: A valid typ
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    67
    :raises: :exc:`~iro.error.NoProvider`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    68
    '''
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    69
    try:
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    70
        p = providers[typ](name)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    71
        p.load(config)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    72
        return p
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    73
    except KeyError:
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    74
        raise NoProvider(typ)
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    75
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    76
def vProvider(typ, field):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    77
    '''validator to test the existence of the typ.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    78
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    79
    :param string typ: A typ
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    80
    :param string field: A field name used for the Exception.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    81
    :return:
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    82
        - valid -- returns typ
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    83
        - invalid -- raises :class:`~iro.error.ValidateException`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    84
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    85
    :raises: :exc:`~iro.error.ValidateException`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    86
    '''
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    87
    if typ not in providers.keys():
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    88
        raise ValidateException()
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    89
    return typ
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    90
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    91
providers={}
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    92
"""Avalable Providers.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    93
    - **key** -- typ of provider (see configuration typ field).
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    94
    - **value** -- class to handle specific Providertyp.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    95
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    96
To extend provider typs, just add this new typ to this dict.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    97
see :doc:`provider`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    98
   
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    99
"""