--- 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)
+