| author | Sandro Knauß <knauss@netzguerilla.net> |
| Thu, 23 Feb 2012 16:52:06 +0100 | |
| branch | devel |
| changeset 180 | 55ab949cf0f8 |
| parent 172 | adfe245c377d |
| child 183 | 07ee5543751b |
| permissions | -rw-r--r-- |
| 9 | 1 |
# -*- coding: utf-8 -*- |
2 |
#Copyright (C) 2009 Georg Bischoff |
|
3 |
||
4 |
#This program is free software; you can redistribute it and/or modify it under the terms |
|
5 |
#of the GNU General Public License as published by the Free Software Foundation; |
|
6 |
#either version 3 of the License, or any later version. |
|
7 |
#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; |
|
8 |
#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
|
9 |
#See the GNU General Public License for more details. |
|
10 |
||
11 |
#You should have received a copy of the GNU General Public License |
|
12 |
#along with this program; if not, see <http://www.gnu.org/licenses/>. |
|
13 |
||
14 |
||
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
15 |
import urllib |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
16 |
import copy |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
17 |
from functools import partial |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
18 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
19 |
from ..error import UnknownOption, NeededOption |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
20 |
from ..model.status import Status |
|
180
55ab949cf0f8
providers now handeld in offer.provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
172
diff
changeset
|
21 |
from .provider import Provider, providers |
| 9 | 22 |
|
|
23
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
23 |
import logging |
|
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
24 |
logger=logging.getLogger("smstrade") |
|
0180b538ed74
logging->logger wg. multiprocessing
Sandro Knauß <knauss@netzguerilla.net>
parents:
22
diff
changeset
|
25 |
|
| 15 | 26 |
class UnknownStatusCode(Exception): |
27 |
def __init__(self,code): |
|
28 |
self.code=code |
|
| 9 | 29 |
|
| 15 | 30 |
def __str__(self): |
31 |
return "StatusCode %i is unknown"%self.code |
|
| 9 | 32 |
|
33 |
||
| 15 | 34 |
class StatusCode: |
35 |
statusCodes = {10 : "Empfaengernummer nicht korrekt", |
|
| 9 | 36 |
20 : "Absenderkennung nicht korrekt", |
37 |
30 : "Nachrichtentext nicht korrekt", |
|
38 |
31 : "Messagetyp nicht korrekt", |
|
39 |
40 : "SMS Route nicht korrekt", |
|
40 |
50 : "Identifikation fehlgeschlagen", |
|
41 |
60 : "nicht genuegend Guthaben", |
|
42 |
70 : "Netz wird von Route nicht abgedeckt", |
|
43 |
71 : "Feature nicht ueber diese Route moeglich", |
|
44 |
80 : "Uebergabe an SMS-C fehlgeschlagen", |
|
45 |
90 : "Versand nicht moeglich", |
|
46 |
100 : "SMS wurde versendet", |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
47 |
} |
| 9 | 48 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
49 |
def __init__(self,code, mID=None, cost=None, count=None): |
| 15 | 50 |
if code in self.statusCodes.keys(): |
51 |
self.code=code |
|
52 |
else: |
|
53 |
raise UnknownStatusCode(code) |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
54 |
self.mID=mID |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
55 |
self.cost = cost |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
56 |
self.count = count |
| 15 | 57 |
|
58 |
def __str__(self): |
|
59 |
try: |
|
60 |
return self.statusCodes[self.code] |
|
61 |
except IndexError: |
|
| 49 | 62 |
raise UnknownStatusCode(self.code) |
| 15 | 63 |
|
64 |
def __int__(self): |
|
65 |
if not self.code in self.statusCodes.keys(): |
|
66 |
raise UnknownStatusCode(self.code) |
|
67 |
return self.code |
|
68 |
||
69 |
||
70 |
||
71 |
||
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
72 |
class Smstrade(Provider): |
| 15 | 73 |
""" |
74 |
s. auch http://kundencenter.smstrade.de/sites/smstrade.de.kundencenter/__pdf/SMS-Gateway_HTTP_API_v2.pdf |
|
75 |
""" |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
76 |
params= {"debug":("boolean",False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
77 |
"concat_sms":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
78 |
"message_id":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
79 |
"count":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
80 |
"cost":('boolean',False), |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
81 |
} |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
82 |
def __init__(self, name, config): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
83 |
self.url = "https://gateway.smstrade.de" |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
84 |
Provider.__init__(self,name,config,{"sms":["basic","economy","gold","direct"]}) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
85 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
86 |
def loadConfig(self): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
87 |
"""Read options from config""" |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
88 |
needed=["key"] |
| 9 | 89 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
90 |
for n in needed: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
91 |
setattr(self,n,None) |
| 9 | 92 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
93 |
for (n, v) in self.config: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
94 |
if n in needed: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
95 |
setattr(self,n,v) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
96 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
97 |
raise UnknownOption(self.name, n) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
98 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
99 |
for n in needed: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
100 |
if getattr(self,n) is None: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
101 |
raise NeededOption(self.name, n) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
102 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
103 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
104 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
105 |
def send(self, route, sms, recipient): |
| 9 | 106 |
"""send SMS with $sms to $recipients""" |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
107 |
logger.debug('smstrade.sendSMS(%s,%s)'%(sms, recipient)) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
108 |
route = unicode(route) |
| 9 | 109 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
110 |
if recipient.land != '49' and route == "basic": |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
111 |
return Exception() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
112 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
113 |
to ='00'+recipient.land+recipient.number |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
114 |
try: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
115 |
smsSendStatus = self.__send(route, to, sms) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
116 |
logger.info('smstrade._send(...)=%i(%s)'%(int(smsSendStatus),str(smsSendStatus))) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
117 |
if int(smsSendStatus) in (100,): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
118 |
return Status(self,route) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
119 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
120 |
raise Exception() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
121 |
except UnknownStatusCode: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
122 |
raise Exception() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
123 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
124 |
def __send(self, route, to, sms): |
| 9 | 125 |
""" This function is the main part of the request to the sms service. |
126 |
The function has to return a unicode formated string that will represent the answer of the sms service |
|
127 |
to the request.""" |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
128 |
logger.debug('smstrade._send(%s,%s,%s)'%( route, to, sms)) |
|
21
e6302069d772
daten sind in der klasse gespeichert - müssen nicht übergeben werden
Sandro Knauß <knauss@netzguerilla.net>
parents:
20
diff
changeset
|
129 |
parameters= {"key": self.key, |
| 15 | 130 |
"route": route, |
131 |
"to": to, |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
132 |
"message": sms.content.encode("utf-8"), |
|
18
f0d31c70744d
Unterscheidung von Dt.Mobilnetz / weltweit
Sandro Knauß <knauss@netzguerilla.net>
parents:
15
diff
changeset
|
133 |
"charset":"utf-8", |
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
134 |
"debug": self.testmode, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
135 |
"message_id":True, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
136 |
"count":True, |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
137 |
"cost":True, |
| 15 | 138 |
} |
| 9 | 139 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
140 |
doubleChar="€[]{}|\\^~" #these charactar need two GSM Chars |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
141 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
142 |
if sms.from_ is not None: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
143 |
parameters["from"] = sms.from_ |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
144 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
145 |
length=len(sms.content) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
146 |
for s in doubleChar: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
147 |
length += sms.content.count(s) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
148 |
parameters["concat_sms"] = True if length > 160 else False |
| 9 | 149 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
150 |
ps={} |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
151 |
for p in parameters: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
152 |
if p in self.params.keys(): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
153 |
if self.params[p][0] == "boolean": |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
154 |
if parameters[p] != self.params[p][1]: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
155 |
ps[p]=int(not self.params[p][1]) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
156 |
else: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
157 |
ps[p] = parameters[p] |
| 9 | 158 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
159 |
params = urllib.urlencode(ps) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
160 |
dp=copy.deepcopy(ps) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
161 |
dp["key"]="<KEY>" |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
162 |
logger.debug('smstrade._send-parameters:%s\n\t->%s'%(str(dp), urllib.urlencode(dp)) ) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
163 |
|
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
164 |
response = urllib.urlopen(self.url, params) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
165 |
data = response.readlines() |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
166 |
if len(data) == 1: |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
167 |
return StatusCode(int(data[0])) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
168 |
return StatusCode(int(data[0]),mID=data[1],cost=data[2],count=data[3]) |
| 9 | 169 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
170 |
def getSendFunc(self, typ, route): |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
171 |
Provider.getSendFunc(self, typ, route) |
|
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
172 |
return partial(self.send,route) |
| 9 | 173 |
|
|
172
adfe245c377d
adding smstrade as provider
Sandro Knauß <knauss@netzguerilla.net>
parents:
129
diff
changeset
|
174 |
providers["smstrade"]=Smstrade |