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