# HG changeset patch # User Sandro Knauß # Date 1330973228 -3600 # Node ID 5bacdb7e94d1d95f30c0082ade8e86471c93669e # Parent bacf50bc46bff1553aab082a563c0051bd9da68d smstrade.StatusCode update diff -r bacf50bc46bf -r 5bacdb7e94d1 iro/model/job.py --- 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)) diff -r bacf50bc46bf -r 5bacdb7e94d1 iro/model/schema.py --- 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')) diff -r bacf50bc46bf -r 5bacdb7e94d1 iro/model/status.py --- 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 diff -r bacf50bc46bf -r 5bacdb7e94d1 iro/offer/smstrade.py --- 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"]="" - logger.debug('smstrade._send-parameters:%s\n\t->%s'%(str(dp), urllib.urlencode(dp)) ) + #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]) + return StatusCode(int(data[0]),exID=data[1],costs=data[2],count=data[3]) def getSendFunc(self, typ, route): Provider.getSendFunc(self, typ, route) diff -r bacf50bc46bf -r 5bacdb7e94d1 tests/smstrade.py --- 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.')