fill extendProvider with life devel
authorSandro Knauß <knauss@netzguerilla.net>
Mon, 13 Feb 2012 17:16:54 +0100
branchdevel
changeset 148 11e0fdc1a58c
parent 147 e96e50ae6352
child 149 bb3e16224bbd
fill extendProvider with life
iro/model/offer.py
iro/model/schema.py
iro/offer/offer.py
--- a/iro/model/offer.py	Mon Feb 13 17:16:14 2012 +0100
+++ b/iro/model/offer.py	Mon Feb 13 17:16:54 2012 +0100
@@ -1,3 +1,4 @@
+from .dbdefer import dbdefer
 from ..config import config
 
 def getPossibleOffers(recipient, os):
@@ -6,6 +7,21 @@
         ret.append(offers[offer])
     return ret
 
+@dbdefer
+def extendProvider(session, user, typ, providers):
+    user = session.merge(user)
+    ret = []
+    for p in providers:
+        if p in offers.keys() and  p not in ret and user.has_right(typ, offer_name = p): 
+                ret.append(p)
+        elif user.has_right(typ,provider=p):
+            rs = [route for route in offers[p].routes if route not in ret]
+            for r in rs:
+                n = user.has_right(typ, provider=p, route=r)
+                if n:
+                    ret.append(n)
+    return ret
+
 def loadOffers():
     pass
 
--- a/iro/model/schema.py	Mon Feb 13 17:16:14 2012 +0100
+++ b/iro/model/schema.py	Mon Feb 13 17:16:54 2012 +0100
@@ -100,13 +100,38 @@
         return "<User('%s','%s')>"%(self.name,self.apikey)
     
     def routes(self, typ, isDefault = None):
+        '''returns a query object to get all possible routes for a given typ'''
         filters=[User.name == self.name,
                 Offer.typ == typ, 
                 ]
         if isDefault is not None:
             filters.append(Userright.isDefault==isDefault)
         return object_session(self).query(Userright.offer_name).join(Offer,User).filter(and_(*filters))
-    
+   
+    def providers(self, typ, isDefault = None):
+        '''return a query object for all possible providers for a given typ'''
+        filters=[User.name == self.name,
+                Offer.typ == typ, 
+                ]
+        if isDefault is not None:
+            filters.append(Userright.isDefault==isDefault)
+        return object_session(self).query(Offer.provider).join(Userright,User).filter(and_(*filters))
+
+    def has_right(self, typ, offer_name = None, provider = None, route = None):
+        '''returns offer_name, if the user is allowed to use offer otherwise None
+            !if there are more than one possible solution it only returns the first!'''
+        filters=[User.name == self.name,
+                Offer.typ == typ, 
+                ]
+        if offer_name:
+            filters.append(Userright.offer_name==offer_name)
+        if provider:
+            filters.append(Offer.provider==provider)
+        if route:
+            filters.append(Offer.route==route)
+
+        return object_session(self).query(Userright.offer_name).join(Offer,User).filter(and_(*filters)).scalar()
+
     def job(self, id):
         job = object_session(self).query(Job).join(User).filter(and_(User.name == self.name, Job.id==id)).first()
         if job is None:
--- a/iro/offer/offer.py	Mon Feb 13 17:16:14 2012 +0100
+++ b/iro/offer/offer.py	Mon Feb 13 17:16:54 2012 +0100
@@ -1,8 +1,9 @@
 from ..model.job import Status
 
 class Offer():
-    def __init__(self,name):
+    def __init__(self, name, routes):
         self.name = name
+        self.routes = routes
 
     def send(self, recipient, message):
         return Status(self.name, Status.error, errtext="Error: Test")