--- a/iro/model/job.py Sat Mar 03 03:54:53 2012 +0100
+++ b/iro/model/job.py Mon Mar 05 19:47:08 2012 +0100
@@ -51,7 +51,7 @@
if status.costs > 0:
o = schema.Offer.get(session, status.provider.name, status.route, self.message.typ)
- job.messages.append(schema.Message(price=status.costs, isBilled=False, recipient=str(task.recipient), date=datetime.today(), offer=o))
+ job.messages.append(schema.Message(price=status.costs, isBilled=False, recipient=str(task.recipient), count=status.count, exID=status.exID, date=datetime.today(), offer=o))
session.commit()
log.msg("Job(%s) to '%s' ended sucecessfully via %s:%s."%(self.dbjob, task.recipient, status.provider.name,status.route))
--- a/iro/model/schema.py Sat Mar 03 03:54:53 2012 +0100
+++ b/iro/model/schema.py Mon Mar 05 19:47:08 2012 +0100
@@ -78,6 +78,8 @@
isBilled = Column(Boolean)
date = Column(DateTime)
price = Column(Numeric(8,4))
+ count = Column(Integer)
+ exID = Column(String(100))
job_id = Column("job", String(40), ForeignKey('job.id'))
job = relationship("Job", backref=backref('messages'))
offer_id = Column("offer",String(100), ForeignKey('offer.name'))
--- a/iro/model/status.py Sat Mar 03 03:54:53 2012 +0100
+++ b/iro/model/status.py Mon Mar 05 19:47:08 2012 +0100
@@ -1,7 +1,9 @@
class Status:
'''status for one recipient'''
- def __init__(self, provider, route):
+ def __init__(self, provider, route, costs=0.0, count=0, exID=None):
self.provider = provider
self.route = route
- self.costs = 0
+ self.costs = costs
+ self.count = count
+ self.exID = exID
--- a/iro/offer/smstrade.py Sat Mar 03 03:54:53 2012 +0100
+++ b/iro/offer/smstrade.py Mon Mar 05 19:47:08 2012 +0100
@@ -13,16 +13,17 @@
import urllib
-import copy
from functools import partial
+from decimal import Decimal
+#import copy
from ..config import Option
from ..model.status import Status
from .provider import Provider, providers
from ..error import RejectRecipient, ExternalException
-import logging
-logger=logging.getLogger("smstrade")
+#import logging
+#logger=logging.getLogger("smstrade")
statusCodes = {10 : "Empfaengernummer nicht korrekt.",
20 : "Absenderkennung nicht korrekt.",
@@ -39,38 +40,31 @@
}
-class StatusException(ExternalException):
+class SmstradeException(ExternalException):
def __init__(self,status):
ExternalException.__init__(self)
self.status = status
- self.str_ = "%i: unknown statuscode."%status
- try:
- self.str_="%i: %s"%(status, statusCodes[int(status)])
- except KeyError:
- pass
+ self.str_=str(status)
+
def __str__(self):
return "%s\n%s"%(ExternalException.__str__(self),self.str_)
class StatusCode:
- def __init__(self,code, mID=None, cost=None, count=None):
- if code in statusCodes.keys():
- self.code = code
- else:
- raise StatusException(code)
- self.mID=mID
- self.cost = cost
- self.count = count
+ def __init__(self,code, exID=None, costs=Decimal("0.0"), count=0):
+ self.code = code
+
+ self.exID = exID
+ self.costs = Decimal(costs)
+ self.count = int(count)
def __str__(self):
- try:
+ if self.code in statusCodes.keys():
return "%i: %s"%(self.code, statusCodes[self.code])
- except IndexError:
- raise StatusException(self.code)
+
+ return "%i: unknown statuscode."%self.code
def __int__(self):
- if not self.code in statusCodes.keys():
- raise StatusException(self.code)
return self.code
class Smstrade(Provider):
@@ -92,7 +86,8 @@
def send(self, route, sms, recipient):
"""send SMS with $sms to $recipients"""
- logger.debug('smstrade.sendSMS(%s,%s)'%(sms, recipient))
+ #logger.debug('smstrade.sendSMS(%s,%s)'%(sms, recipient))
+
route = unicode(route)
if recipient.land != '49' and route == "basic":
@@ -100,20 +95,19 @@
to ='00'+recipient.land+recipient.number
- 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)
- elif int(smsSendStatus) in (70,71,):
- raise RejectRecipient(recipient, status=smsSendStatus)
+ s = self.__send(route, to, sms)
+ if int(s) in (100,):
+ return Status(self,route, exID=s.exID, costs=s.costs, count=s.count)
+ elif int(s) in (70,71,):
+ raise RejectRecipient(recipient, status=s)
else:
- raise StatusException(smsSendStatus)
+ raise SmstradeException(s)
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))
+ #logger.debug('smstrade._send(%s,%s,%s)'%( route, to, sms))
parameters= {"key": self.key,
"route": route,
"to": to,
@@ -140,20 +134,20 @@
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])
+ ps[p]=int(bool(parameters[p]))
else:
ps[p] = parameters[p]
params = urllib.urlencode(ps)
- dp=copy.deepcopy(ps)
- dp["key"]="<KEY>"
- logger.debug('smstrade._send-parameters:%s\n\t->%s'%(str(dp), urllib.urlencode(dp)) )
+ #dp=copy.deepcopy(ps)
+ #dp["key"]="<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])
+ return StatusCode(int(data[0]),exID=data[1],costs=data[2],count=data[3])
def getSendFunc(self, typ, route):
Provider.getSendFunc(self, typ, route)
--- a/tests/smstrade.py Sat Mar 03 03:54:53 2012 +0100
+++ b/tests/smstrade.py Mon Mar 05 19:47:08 2012 +0100
@@ -1,11 +1,12 @@
from twisted.trial import unittest
-
+from decimal import Decimal
from mock import patch, Mock
from iro.error import NoRoute, NoTyp, NeededOption, RejectRecipient
from iro.telnumber import Telnumber
from iro.model.message import SMS
-from iro.offer.smstrade import Smstrade, StatusException
+from iro.offer.smstrade import Smstrade, SmstradeException, StatusCode
+
HOST = "localhost"
PORT = 9999
@@ -35,7 +36,7 @@
p=self.getProvider()
content = "Hello World"
- p.send("gold",SMS(content,None), Telnumber("01701234567"))
+ r = p.send("gold",SMS(content,None), Telnumber("01701234567"))
ca = mock_urlopen.call_args[0]
c=ca[1].split("&")
@@ -45,10 +46,30 @@
self.assertEqual(c,params)
self.assertEqual(f.readlines.call_count,1)
+ self.assertEqual(r.provider, p)
+ self.assertEqual(r.route, 'gold')
+ self.assertEqual(r.costs, Decimal('0.055'))
+ self.assertEqual(r.exID, '12345678')
+ self.assertEqual(r.count, 1)
+
def testStatusCode(self):
- pass
-
- testStatusCode.todo = "to implement"
+ s = StatusCode(10,"12345678","1.10",1)
+ self.assertEqual(str(s),'10: Empfaengernummer nicht korrekt.')
+ self.assertEqual(int(s),10)
+ self.assertEqual(s.count,1)
+ self.assertEqual(s.costs,Decimal("1.10"))
+ self.assertEqual(s.exID,'12345678')
+
+
+ def testUnknownStatusCode(self):
+ s = StatusCode(999)
+ self.assertEqual(str(s),'999: unknown statuscode.')
+ self.assertEqual(int(s),999)
+ self.assertEqual(s.count,0)
+ self.assertEqual(s.costs,Decimal("0.00"))
+ self.assertEqual(s.exID, None)
+
+
def testRejectRecipient(self):
p=self.getProvider()
@@ -78,18 +99,18 @@
p=self.getProvider()
content = "Hello World"
- e = self.assertRaises(StatusException, p.send , "basic", SMS(content,None), Telnumber("01701234567"))
+ e = self.assertRaises(SmstradeException, p.send , "basic", SMS(content,None), Telnumber("01701234567"))
self.assertEqual(str(e),'950:Error in external API.\n703: unknown statuscode.')
@patch("urllib.urlopen")
- def testStatusException(self,mock_urlopen):
+ def testSmstradeException(self,mock_urlopen):
f = Mock()
f.readlines.return_value = ["10"]
mock_urlopen.return_value = f
p=self.getProvider()
content = "Hello World"
- e = self.assertRaises(StatusException, p.send , "basic", SMS(content,None), Telnumber("01701234567"))
+ e = self.assertRaises(SmstradeException, p.send , "basic", SMS(content,None), Telnumber("01701234567"))
self.assertEqual(str(e),'950:Error in external API.\n10: Empfaengernummer nicht korrekt.')