iro/model/dbdefer.py
branchdevel
changeset 123 2d685c3c10b2
parent 117 351a02310dd8
child 151 ff8448fb07e7
--- a/iro/model/dbdefer.py	Sat Jan 28 13:02:07 2012 +0100
+++ b/iro/model/dbdefer.py	Sat Jan 28 14:22:44 2012 +0100
@@ -13,12 +13,17 @@
 
     def __call__(self, func):
         @runInDBPool
-        def wrapper(func,*args, **kwargs):
+        def wrapper(func,*a, **kw):
+            pos = argspec.args.index("session")
+            ab=list(a[:pos])
+            ae=list(a[pos:])
             with WithSession(self.engine, self.autocommit) as session:
-                return func(*args, session=session, **kwargs)
+                al = ab+[session]+ae
+                return func(*al, **kw)
 
         caller=func
-        args =[i for i in inspect.getargspec(caller)[0] if i != "session" ]
+        argspec = inspect.getargspec(caller)
+        args =[i for i in argspec.args if i != "session" ]
         sargs=", ".join(args)        
         evaldict = caller.func_globals.copy()
         evaldict['_call_'] = func
@@ -26,7 +31,7 @@
         wrap = FunctionMaker.create(
               '%s(%s)' % (caller.__name__, sargs), 
               'return decorator(_call_, %s)' % sargs,
-              evaldict, undecorated=caller, __wrapped__=caller,
+              evaldict, defaults=argspec.defaults, undecorated=caller, __wrapped__=caller,
               doc=caller.__doc__, module=caller.__module__, addsource=True)
         return wrap