model.offer.loadOffers implemented devel
authorSandro Knauß <knauss@netzguerilla.net>
Mon, 13 Feb 2012 22:19:31 +0100
branchdevel
changeset 157 0192f9107870
parent 156 a4ad521b127b
child 158 e045e628a519
model.offer.loadOffers implemented
iro/model/offer.py
iro/offer/__init__.py
iro/offer/offer.py
iro/offer/provider.py
tests/offer.py
--- a/iro/model/offer.py	Mon Feb 13 22:18:06 2012 +0100
+++ b/iro/model/offer.py	Mon Feb 13 22:19:31 2012 +0100
@@ -1,6 +1,9 @@
 from .dbdefer import dbdefer
+from sqlalchemy import and_
+
 import schema
 from ..config import config
+from ..offer import getProvider, Offer
 
 @dbdefer
 def extendProvider(session, user, typ, providers):
@@ -16,8 +19,17 @@
                     ret.append(n)
     return ret
 
-def loadOffers():
-    pass
+@dbdefer
+def loadOffers(session):
+    offers.clear()
+    providers.clear()
+    for provider in ( s for s in config.sections() if not s in ["main",]):
+        p=getProvider(provider,config.get(provider,"typ"),config.items(provider))
+        for r in p.routes:
+            for o in  session.query(schema.Offer.name, schema.Offer.route).filter(and_(schema.Offer.provider==provider,
+                schema.Offer.route==r)):
+                    offers[o[0]]=Offer(provider=p,route=r,typ=o[1],name=o[0])
+        providers[provider]=p
 
 offers={}
 providers={}
--- a/iro/offer/__init__.py	Mon Feb 13 22:18:06 2012 +0100
+++ b/iro/offer/__init__.py	Mon Feb 13 22:19:31 2012 +0100
@@ -0,0 +1,13 @@
+from .offer import Offer
+from .provider import Provider
+
+from ..error import NoProvider
+
+providers={}
+
+def getProvider(name, typ, config):
+    try:
+        return providers[typ](name,config)
+    except KeyError:
+        raise NoProvider(typ)
+
--- a/iro/offer/offer.py	Mon Feb 13 22:18:06 2012 +0100
+++ b/iro/offer/offer.py	Mon Feb 13 22:19:31 2012 +0100
@@ -1,9 +1,10 @@
 from  ..model.status import Status
 
 class Offer():
-    def __init__(self, name, routes=[]):
+    def __init__(self, name, provider, route, typ):
         self.name = name
-        self.routes = routes
+        self.route = route
+        self.provider = provider
 
     def send(self, recipient, message):
         return Status(self.name, Status.error, errtext="Error: Test")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/iro/offer/provider.py	Mon Feb 13 22:19:31 2012 +0100
@@ -0,0 +1,9 @@
+class Provider():
+    def __init__(self, name, config, routes=[]):
+        self.name = name
+        self.config = config
+        self.routes=routes
+        self.loadConfig()
+
+    def loadConfig(self):
+        pass
--- a/tests/offer.py	Mon Feb 13 22:18:06 2012 +0100
+++ b/tests/offer.py	Mon Feb 13 22:19:31 2012 +0100
@@ -1,12 +1,14 @@
 from twisted.internet import reactor
 from twisted.internet.defer import inlineCallbacks
 
+import io
+
 from iro.model import offer
 from iro.config import config
-
-from iro.offer.offer import Offer
+from iro.offer import Offer, providers as OfferProviders, Provider
 from iro.model.schema import User, Offer as DBOffer, Userright
 from iro.controller.pool  import dbPool
+from iro.error import NoProvider
 from .dbtestcase import DBTestCase
 
 class TestOffers(DBTestCase):
@@ -18,6 +20,11 @@
     def tearDown(self):
         dbPool.pool.stop()
         offer.offers.clear()
+        try:
+            del(OfferProviders["test"])
+        except KeyError:
+            pass
+        offer.providers.clear()
         DBTestCase.tearDown(self)
 
     def testReloadList(self):
@@ -60,7 +67,7 @@
             o=DBOffer(name="oh", provider="bla", route="a", typ="sms")
             u.rights.append(Userright(o)) 
         
-        offer.offers={"bla":Offer("bla",["a","b","c"])}
+        offer.providers={"bla":Provider("bla",None, ["a","b","c"])}
 
         for l in [['bla'],['oh'],['oh','bla'],['bla','oh']]:
             ret = yield offer.extendProvider(u, "sms", l)
@@ -77,7 +84,7 @@
             o=DBOffer(name="a", provider="bla", route="b", typ="sms")
             u.rights.append(Userright(o)) 
         
-        offer.offers={"bla":Offer("bla",["a","b","c"])}
+        offer.providers={"bla":Provider("bla", None, ["a","b","c"])}
 
         ret = yield offer.extendProvider(u, "sms",  ["bla"])
         self.assertEqual(ret, ["oh","a"])
@@ -88,3 +95,36 @@
         ret = yield offer.extendProvider(u, "sms",  ["bla", "a"])
         self.assertEqual(ret, ["oh","a"])
 
+    @inlineCallbacks
+    def testLoadOffers(self):
+        
+        class TestProvider(Provider):
+            def __init__(self,name,config):
+                Provider.__init__(self,name,config,["a",])
+        
+        with self.session() as session:
+            session.add(DBOffer(name="oh", provider="p", route="a", typ="sms"))
+
+        sample_config = """[p]
+typ = test
+"""
+        config.readfp(io.BytesIO(sample_config))
+        OfferProviders["test"]=TestProvider
+        yield offer.loadOffers()        
+        self.assertEqual(offer.offers.keys(),["oh"])
+        self.assertEqual(offer.providers.keys(),["p"])
+        self.assertEqual(offer.providers["p"].name,"p")
+        self.assertEqual(offer.providers["p"].typ,"test")
+        self.assertEqual(offer.offers["oh"],Offer(provider=offer.providers["p"], name="oh", route="a", typ="sms"))
+
+    def testLoadOffersUnknown(self):
+        with self.session() as session:
+            session.add(DBOffer(name="oh", provider="p", route="a", typ="sms"))
+
+        sample_config = """[p]
+typ = unknown
+"""
+        config.readfp(io.BytesIO(sample_config))
+        d = offer.loadOffers()        
+        self.assertFailure(d, NoProvider)
+