diff -r 5619596a0053 -r adfe245c377d iro/offer/smstrade.py --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/iro/offer/smstrade.py Sat Feb 18 19:50:36 2012 +0100 @@ -0,0 +1,175 @@ +# -*- coding: utf-8 -*- +#Copyright (C) 2009 Georg Bischoff + +#This program is free software; you can redistribute it and/or modify it under the terms +#of the GNU General Public License as published by the Free Software Foundation; +#either version 3 of the License, or any later version. +#This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; +#without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. +#See the GNU General Public License for more details. + +#You should have received a copy of the GNU General Public License +#along with this program; if not, see . + + +import urllib +import copy +from functools import partial + +from ..error import UnknownOption, NeededOption +from ..model.status import Status +from .provider import Provider +from ..offer import providers + +import logging +logger=logging.getLogger("smstrade") + +class UnknownStatusCode(Exception): + def __init__(self,code): + self.code=code + + def __str__(self): + return "StatusCode %i is unknown"%self.code + + +class StatusCode: + statusCodes = {10 : "Empfaengernummer nicht korrekt", + 20 : "Absenderkennung nicht korrekt", + 30 : "Nachrichtentext nicht korrekt", + 31 : "Messagetyp nicht korrekt", + 40 : "SMS Route nicht korrekt", + 50 : "Identifikation fehlgeschlagen", + 60 : "nicht genuegend Guthaben", + 70 : "Netz wird von Route nicht abgedeckt", + 71 : "Feature nicht ueber diese Route moeglich", + 80 : "Uebergabe an SMS-C fehlgeschlagen", + 90 : "Versand nicht moeglich", + 100 : "SMS wurde versendet", + } + + def __init__(self,code, mID=None, cost=None, count=None): + if code in self.statusCodes.keys(): + self.code=code + else: + raise UnknownStatusCode(code) + self.mID=mID + self.cost = cost + self.count = count + + def __str__(self): + try: + return self.statusCodes[self.code] + except IndexError: + raise UnknownStatusCode(self.code) + + def __int__(self): + if not self.code in self.statusCodes.keys(): + raise UnknownStatusCode(self.code) + return self.code + + + + +class Smstrade(Provider): + """ + s. auch http://kundencenter.smstrade.de/sites/smstrade.de.kundencenter/__pdf/SMS-Gateway_HTTP_API_v2.pdf + """ + params= {"debug":("boolean",False), + "concat_sms":('boolean',False), + "message_id":('boolean',False), + "count":('boolean',False), + "cost":('boolean',False), + } + def __init__(self, name, config): + self.url = "https://gateway.smstrade.de" + Provider.__init__(self,name,config,{"sms":["basic","economy","gold","direct"]}) + + def loadConfig(self): + """Read options from config""" + needed=["key"] + + for n in needed: + setattr(self,n,None) + + for (n, v) in self.config: + if n in needed: + setattr(self,n,v) + else: + raise UnknownOption(self.name, n) + + for n in needed: + if getattr(self,n) is None: + raise NeededOption(self.name, n) + + + + def send(self, route, sms, recipient): + """send SMS with $sms to $recipients""" + logger.debug('smstrade.sendSMS(%s,%s)'%(sms, recipient)) + route = unicode(route) + + if recipient.land != '49' and route == "basic": + return Exception() + + to ='00'+recipient.land+recipient.number + try: + smsSendStatus = self.__send(route, to, sms) + logger.info('smstrade._send(...)=%i(%s)'%(int(smsSendStatus),str(smsSendStatus))) + if int(smsSendStatus) in (100,): + return Status(self,route) + else: + raise Exception() + except UnknownStatusCode: + raise Exception() + + def __send(self, route, to, sms): + """ This function is the main part of the request to the sms service. + The function has to return a unicode formated string that will represent the answer of the sms service + to the request.""" + logger.debug('smstrade._send(%s,%s,%s)'%( route, to, sms)) + parameters= {"key": self.key, + "route": route, + "to": to, + "message": sms.content.encode("utf-8"), + "charset":"utf-8", + "debug": self.testmode, + "message_id":True, + "count":True, + "cost":True, + } + + doubleChar="€[]{}|\\^~" #these charactar need two GSM Chars + + if sms.from_ is not None: + parameters["from"] = sms.from_ + + length=len(sms.content) + for s in doubleChar: + length += sms.content.count(s) + parameters["concat_sms"] = True if length > 160 else False + + ps={} + for p in parameters: + if p in self.params.keys(): + if self.params[p][0] == "boolean": + if parameters[p] != self.params[p][1]: + ps[p]=int(not self.params[p][1]) + else: + ps[p] = parameters[p] + + params = urllib.urlencode(ps) + dp=copy.deepcopy(ps) + dp["key"]="" + logger.debug('smstrade._send-parameters:%s\n\t->%s'%(str(dp), urllib.urlencode(dp)) ) + + response = urllib.urlopen(self.url, params) + data = response.readlines() + if len(data) == 1: + return StatusCode(int(data[0])) + return StatusCode(int(data[0]),mID=data[1],cost=data[2],count=data[3]) + + def getSendFunc(self, typ, route): + Provider.getSendFunc(self, typ, route) + return partial(self.send,route) + +providers["smstrade"]=Smstrade