modularized more... probably only Get* functions work
[plcapi.git] / PLC / Legacy / v42legacy.py
1 # $Id: $
2
3 def import_deep(name):
4     mod = __import__(name)
5     components = name.split('.')
6     for comp in components[1:]:
7         mod = getattr(mod, comp)
8     return mod
9
10 # apply rename on list (columns) or dict (filter) args
11 def patch (arg,rename):
12     if isinstance(arg,list):
13         for i in range(0,len(arg)):
14             arg[i] = patch(arg[i],rename)
15         return arg
16     if isinstance(arg,dict):
17         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
18     return rename(arg)
19
20
21 def make_class (legacyname,newname,path,v42rename,v43rename):
22     # locate new class
23     newclass=getattr(import_deep(path+newname),newname)
24     # create class for legacy name
25     legacyclass = type(legacyname,(newclass,), 
26                        {"__doc__":"Legacy method - please use %s instead"%newname})
27     for internal in ["roles","accepts","returns"]:
28         setattr(legacyclass,internal,getattr(newclass,internal))
29     # turn off type checking, as introspection code fails on wrapped_call
30     setattr(legacyclass,"skip_typecheck",True)
31     # rewrite call
32     def wrapped_call (self,auth,*args, **kwds):
33         # print "%s: self.caller = %s, self=%s" % (legacyname,self.caller,self)
34         newargs=[patch(x,v42rename) for x in args]
35         newkwds=dict ( [ (k,patch(v,v42rename)) for (k,v) in kwds.iteritems() ] )
36         results = getattr(newclass,"call")(self,auth,*newargs,**newkwds)
37         return patch(results,v43rename)
38     setattr(legacyclass,"call",wrapped_call)
39
40     return legacyclass
41