iro/offer/provider.py
author Sandro Knauß <bugs@sandroknauss.de>
Tue, 15 Apr 2025 01:22:19 +0200
changeset 316 63c681b8e92c
parent 294 0e75bd39767d
permissions -rw-r--r--
fix link to about.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
294
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     1
# Copyright (c) 2012 netzguerilla.net <iro@netzguerilla.net>
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     2
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     3
# This file is part of Iro.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     4
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     5
# Permission is hereby granted, free of charge, to any person obtaining a copy of
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     6
# this software and associated documentation files (the "Software"), to deal in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     7
# the Software without restriction, including without limitation the rights to use,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     8
# copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
     9
# #Software, and to permit persons to whom the Software is furnished to do so,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    10
# subject to the following conditions:
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    11
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    12
# The above copyright notice and this permission notice shall be included in
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    13
# all copies or substantial portions of the Software.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    14
# 
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    15
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    16
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    17
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    18
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    19
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    20
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
0e75bd39767d adding LICENSE to all files
Sandro Knauß <knauss@netzguerilla.net>
parents: 282
diff changeset
    21
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    22
from functools import partial
282
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 275
diff changeset
    23
try:
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 275
diff changeset
    24
    from collections import OrderedDict
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 275
diff changeset
    25
except ImportError:
50cc13814bfb make iro working with python v2.6
Sandro Knauß <knauss@netzguerilla.net>
parents: 275
diff changeset
    26
    from ordereddict import OrderedDict
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    27
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    28
from ..error import NoRoute, NoTyp, ValidateException, NoProvider
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    29
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
    30
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    31
class Provider(Config):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    32
    """Base class for Providerbackends."""
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
    testmode = False
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    35
    """- **True** -- no message to external provider should be send.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    36
    - **False** (default) -- message are send to external provider."""
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 254
diff changeset
    37
    def __init__(self, name, typs={}, options=[]):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    38
        """Constructor for Provider class.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    39
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    40
        :param string name: Name of the Provider.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    41
        :param dict typs: A Dictonary with typs and routes.
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 254
diff changeset
    42
        :param items options: [("name",Option(...)),...]
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    43
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    44
        >>> p = Provider("myProvider",{"sms":["route1","route2"]})
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    45
        """
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    46
269
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 254
diff changeset
    47
        Config.__init__(self, name, OrderedDict([
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 254
diff changeset
    48
                    ("typ",Option(vProvider, long="One available provider typ.", must=True, default=name))
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 254
diff changeset
    49
                    ]+options)
0d134b173cb1 iro.config: using OrderedDict instead of Dict + List for Options.
Sandro Knauß <knauss@netzguerilla.net>
parents: 254
diff changeset
    50
                )
166
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 161
diff changeset
    51
        self.typs=typs
6d6890f7e3f8 adding smtp provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 161
diff changeset
    52
        self.testmode = False
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    53
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    54
    def send(self, typ, route, recipient, message):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    55
        """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
    56
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    57
        .. note::
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    58
            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
    59
        pass
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    60
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    61
    def getSendFunc(self, typ, route):
275
88d45c846f2b docu fixes
Sandro Knauß <knauss@netzguerilla.net>
parents: 269
diff changeset
    62
        """Returns the actually send function for a given typ and route.
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    63
        
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    64
        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
    65
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    66
        :raises: :exc:`~iro.error.NoRoute`, :exc:`~iro.error.NoTyp`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    67
        """
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    68
171
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    69
        try:
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    70
            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
    71
                raise NoRoute(route)
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    72
        except KeyError:
5619596a0053 getSendFunc logic from smtp to Provider(offer.provider)
Sandro Knauß <knauss@netzguerilla.net>
parents: 169
diff changeset
    73
            raise NoTyp(route)
161
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    74
        return partial(self.send, typ, route)
072ee139eb67 sending part now in provoder class
Sandro Knauß <knauss@netzguerilla.net>
parents: 159
diff changeset
    75
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    76
def getProvider(name, typ, config):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    77
    '''creates a provider object and init this with config.
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 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
    80
    :param string typ: A valid typ
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    81
    :raises: :exc:`~iro.error.NoProvider`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    82
    '''
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    83
    try:
186
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    84
        p = providers[typ](name)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    85
        p.load(config)
b381eaa774ab refactoring ifo.config
Sandro Knauß <knauss@netzguerilla.net>
parents: 183
diff changeset
    86
        return p
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    87
    except KeyError:
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    88
        raise NoProvider(typ)
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    89
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
    90
def vProvider(typ, field):
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    91
    '''validator to test the existence of the typ.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    92
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    93
    :param string typ: A typ
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    94
    :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
    95
    :return:
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    96
        - valid -- returns typ
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
    97
        - invalid -- raises :class:`~iro.error.ValidateException`
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
    :raises: :exc:`~iro.error.ValidateException`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   100
    '''
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
   101
    if typ not in providers.keys():
254
de301b8c58d9 offer.provider.Provider.vProvider uses field argument.
Sandro Knauß <knauss@netzguerilla.net>
parents: 253
diff changeset
   102
        raise ValidateException(field=field)
180
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
   103
    return typ
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
   104
55ab949cf0f8 providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents: 171
diff changeset
   105
providers={}
253
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   106
"""Avalable Providers.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   107
    - **key** -- typ of provider (see configuration typ field).
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   108
    - **value** -- class to handle specific Providertyp.
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   109
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   110
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
   111
see :doc:`provider`
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   112
   
e8d56537c9cc start documenting with reST syntax.
Sandro Knauß <knauss@netzguerilla.net>
parents: 220
diff changeset
   113
"""