getting job status form db devel
authorSandro Knauß <knauss@netzguerilla.net>
Mon, 30 Jan 2012 06:51:28 +0100
branchdevel
changeset 125 19b3f383c9ce
parent 124 6efcdf7e2d62
child 126 1ac2439a68b5
getting job status form db
iro/controller/viewinterface.py
iro/error.py
iro/model/schema.py
iro/model/user.py
iro/validate.py
tests/xmlrpc.py
--- a/iro/controller/viewinterface.py	Mon Jan 30 06:44:39 2012 +0100
+++ b/iro/controller/viewinterface.py	Mon Jan 30 06:51:28 2012 +0100
@@ -9,7 +9,8 @@
     @validate(kwd="detailed", func=vBool, need=False)
     @validate(kwd="id", func=vHash, need=False, maxlength=40)
     @vUser
-    def status(self, user, id=None, detailed=False):
+    @dbdefer
+    def status(self, session, user, id=None, detailed=False):
         '''Gibt den aktuellen Status eines Auftrages oder Mehreren zurück.
 
         Keywords:
@@ -24,12 +25,15 @@
 
 
         '''
-        if id or detailed:
-            return str(user),id,detailed
+        user = session.merge(user)
+        ret={}
+        if not id:
+            for job in  user.jobs:
+                ret[job.hash]={"status":job.status}
         else:
-            return str(user)
-        #return user.status(id,detailed)
-        return ""
+            ret[id]={"status":user.job(id).status}
+
+        return ret
 
     @vUser
     @validate(kwd="id", func=vHash,maxlength=40)
@@ -108,7 +112,7 @@
     @validate(kwd="typ", func=vTyp)
     @vUser
     @dbdefer
-    def routes(self, user, typ, session):
+    def routes(self, session, user, typ):
         '''Gibt eine Liste aller verfügbaren Provider zurück.
 
         Keywords:
@@ -127,7 +131,7 @@
     @validate(kwd="typ", func=vTyp)
     @vUser
     @dbdefer
-    def defaultRoute(self, user, typ, session):
+    def defaultRoute(self, session, user, typ):
         '''Gibt den Standardprovider zurück.
  
         Keywords:
--- a/iro/error.py	Mon Jan 30 06:44:39 2012 +0100
+++ b/iro/error.py	Mon Jan 30 06:51:28 2012 +0100
@@ -15,6 +15,10 @@
     def __init__(self):
         InterfaceException.__init__(self, 901, u"Der API-Key ist ungültig.")
 
+class JobNotFound(InterfaceException):
+    def __init__(self):
+        InterfaceException.__init__(self, 902, u"Die Jobid ist ungültig.")
+
 class ExternalException(InterfaceException):
     def __init__(self):
         InterfaceException.__init__(self, 950, "Fehler in externer API.")
--- a/iro/model/schema.py	Mon Jan 30 06:44:39 2012 +0100
+++ b/iro/model/schema.py	Mon Jan 30 06:51:28 2012 +0100
@@ -9,6 +9,8 @@
 
 from sqlalchemy import and_ 
 
+from ..error import JobNotFound
+
 Base = declarative_base()
 
 __tables__=["User", "Job", "Message", "Offer", "Userright"]
@@ -78,3 +80,9 @@
         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 job(self, id):
+        job = object_session(self).query(Job).join(User).filter(and_(User.name == self.name, Job.hash==id)).first()
+        if job is None:
+            raise JobNotFound()
+        return job
--- a/iro/model/user.py	Mon Jan 30 06:44:39 2012 +0100
+++ b/iro/model/user.py	Mon Jan 30 06:51:28 2012 +0100
@@ -11,7 +11,7 @@
 
 @validate(kwd="apikey", func=vHash, minlength=15, maxlength=15)
 @dbdefer
-def getuser(apikey, session):
+def getuser(session, apikey):
     user = session.query(User).filter_by(apikey=apikey).first()
     if user is None:
         raise UserNotFound()
--- a/iro/validate.py	Mon Jan 30 06:44:39 2012 +0100
+++ b/iro/validate.py	Mon Jan 30 06:51:28 2012 +0100
@@ -7,6 +7,7 @@
 from .error import ValidateException
 
 def vBool(value, field):
+    '''Validator for boolean values'''
     t=[True, 1, "true", "True", "TRUE"]
     f=[False, 0, "false", "False", "FALSE"]
     if value in t:
@@ -18,6 +19,7 @@
 
 
 def vHash(value,field,minlength=None,maxlength=None):
+    '''Validator for hash values'''
     if not re.match(r'^[a-f0-9]*$', value.lower()):
         raise ValidateException(field=field)
     if minlength and len(value)<minlength:
--- a/tests/xmlrpc.py	Mon Jan 30 06:44:39 2012 +0100
+++ b/tests/xmlrpc.py	Mon Jan 30 06:51:28 2012 +0100
@@ -9,7 +9,7 @@
 from iro.model.utils import WithSession
 from iro.model import POOL_SIZE as DB_POOL_SIZE
 
-from iro.model.schema import User, Base, Offer, Userright
+from iro.model.schema import User, Base, Offer, Userright, Job
 import iro.model.schema as schema
 
 from ngdatabase.mysql import Server, createConfig, Database
@@ -74,15 +74,33 @@
     def testStatus(self):
         ''' test the status function'''
         with WithSession(md.engine, autocommit=True) as session:
+            u = User(name='test',apikey='abcdef123456789')
             session.add(User(name='test',apikey='abcdef123456789'))
-        ret = self.__rpc2().status('abcdef123456789')
-        self.failUnlessEqual(ret, "<User('test','abcdef123456789')>")
-        self.failUnlessEqual(self.__rpc2().status('abcdef123456789','abcde'), ["<User('test','abcdef123456789')>",'abcde',False])
-        self.failUnlessEqual(self.__rpc2().status('abcdef123456789','abcde', True), ["<User('test','abcdef123456789')>",'abcde', True])
-        self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 'true'), ["<User('test','abcdef123456789')>", '', True])
-        self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 'false'), "<User('test','abcdef123456789')>")
-        self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 0), "<User('test','abcdef123456789')>")
-        self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 1), ["<User('test','abcdef123456789')>", '', True])
+        self.failUnlessEqual(self.__rpc2().status('abcdef123456789'), {})
+        
+        with WithSession(md.engine, autocommit=True) as session:
+            u = session.merge(u)
+            j = Job(hash="a1", info='info', status="started")
+            j.user=u
+            session.add(j)
+       
+        status = {'a1':{"status":"started"}}
+        self.failUnlessEqual(self.__rpc2().status('abcdef123456789'), status)
+        self.failUnlessEqual(self.__rpc2().status('abcdef123456789',"a1"), status)
+        self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 'false'), status)
+        self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 0), status)
+
+        #JobNotFound
+        with self.assertRaises(Fault) as fault:
+            self.__rpc2().status('abcdef123456789',"b")
+        exc = fault.exception
+        unf = IroError.JobNotFound()
+        self.failUnlessEqual(exc.faultCode, unf.code)
+        self.failUnlessEqual(exc.faultString, unf.msg)
+
+        #self.failUnlessEqual(self.__rpc2().status('abcdef123456789','abcde', True), ["<User('test','abcdef123456789')>",'abcde', True])
+        #self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 'true'), ["<User('test','abcdef123456789')>", '', True])
+        #self.failUnlessEqual(self.__rpc2().status('abcdef123456789', '', 1), ["<User('test','abcdef123456789')>", '', True])
     
     def testNoSuchUser(self):
         '''a unknown user should raise a UserNotNound Exception