validate decorator can handle deferd validators devel
authorSandro Knauß <knauss@netzguerilla.net>
Sat, 28 Jan 2012 04:00:47 +0100
branchdevel
changeset 118 e16c0250c974
parent 117 351a02310dd8
child 119 3462c2c90f95
validate decorator can handle deferd validators
iro/model/decorators.py
iro/model/user.py
iro/validate.py
--- a/iro/model/decorators.py	Fri Jan 27 21:21:41 2012 +0100
+++ b/iro/model/decorators.py	Sat Jan 28 04:00:47 2012 +0100
@@ -13,13 +13,11 @@
         return f(*args, **kwargs)
     return wrapper
 
-from .utils import WithSession
-#@dbdefer
-def vTyp(value,field):
-    with WithSession(dbdefer.engine) as session:
-        for typ in session.query(Offer.typ).distinct():
-            if value == typ[0]:
-                break
-        else:
-            raise ValidateException(field=field,msg='Typ is not valid.')
+@dbdefer
+def vTyp(value,field, session):
+    for typ in session.query(Offer.typ).distinct():
+        if value == typ[0]:
+            break
+    else:
+        raise ValidateException(field=field,msg='Typ is not valid.')
     return value
--- a/iro/model/user.py	Fri Jan 27 21:21:41 2012 +0100
+++ b/iro/model/user.py	Sat Jan 28 04:00:47 2012 +0100
@@ -1,3 +1,4 @@
+from twisted.internet import defer
 from inspect import getcallargs
 from decorator import decorator
 
@@ -8,8 +9,8 @@
 from ..error import UserNotFound, InterfaceException
 
 
+@validate(kwd="apikey", func=vHash, minlength=15, maxlength=15)
 @dbdefer
-@validate(kwd="apikey", func=vHash, minlength=15, maxlength=15)
 def getuser(apikey, session):
     user = session.query(User).filter_by(apikey=apikey).first()
     if user is None:
@@ -27,9 +28,9 @@
     
     def _gotResult(_user):
         kp["user"]=_user
-        return f(**kp)
-
-    d=getuser(apikey=apikey)
+        e =  defer.maybeDeferred(f,**kp)
+        return e
+    d = defer.maybeDeferred(getuser, apikey=apikey)
     return d.addCallback(_gotResult)
 
 
--- a/iro/validate.py	Fri Jan 27 21:21:41 2012 +0100
+++ b/iro/validate.py	Sat Jan 28 04:00:47 2012 +0100
@@ -1,6 +1,8 @@
 import re
 from decorator import decorator
 
+from twisted.internet import defer
+
 from inspect import getcallargs
 from .error import ValidateException
 
@@ -40,14 +42,20 @@
     @decorator
     def v(f,*a,**k):
         kp=getcallargs(f,*a,**k)
+        def dfunc(*x,**y):
+            return None
         try:
             if need or kp[kwd] is not None:
-                kp[kwd] = func(kp[kwd],kwd,*args,**kargs)
-            else:
-                kp[kwd] = None
+                dfunc=func
         except KeyError:
             if need:
                 raise ValidateException(field=kwd,msg="%s is nessasary"%kwd)
-        return f(**kp)
+
+        def _gotResult(value):
+            kp[kwd] = value
+            e = defer.maybeDeferred(f,**kp)
+            return e
+        d = defer.maybeDeferred(dfunc, kp[kwd],kwd,*args,**kargs)
+        return d.addCallback(_gotResult)
     return v