smstrade.StatusCode update devel
authorSandro Knauß <knauss@netzguerilla.net>
Mon, 05 Mar 2012 19:47:08 +0100
branchdevel
changeset 215 5bacdb7e94d1
parent 214 bacf50bc46bf
child 216 ab8e2f26718e
smstrade.StatusCode update
iro/model/job.py
iro/model/schema.py
iro/model/status.py
iro/offer/smstrade.py
tests/smstrade.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))
--- 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.')