# HG changeset patch # User Sandro Knauß # Date 1329167971 -3600 # Node ID 0192f9107870d2f34cb95e52c040fb3c01547668 # Parent a4ad521b127b68fcee47886ee7539954d5fdab9f model.offer.loadOffers implemented diff -r a4ad521b127b -r 0192f9107870 iro/model/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={} diff -r a4ad521b127b -r 0192f9107870 iro/offer/__init__.py --- 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) + diff -r a4ad521b127b -r 0192f9107870 iro/offer/offer.py --- 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") diff -r a4ad521b127b -r 0192f9107870 iro/offer/provider.py --- /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 diff -r a4ad521b127b -r 0192f9107870 tests/offer.py --- 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) +