ee791b338aa966e04cc7f78b7e2f247bfb3df4f4
[plcapi.git] / PLC / Legacy / NodeNetworks.py
1 # Thierry Parmentelat - INRIA
2 # $Id$
3
4 from PLC.Method import Method
5
6 def import_deep(name):
7     mod = __import__(name)
8     components = name.split('.')
9     for comp in components[1:]:
10         mod = getattr(mod, comp)
11     return mod
12
13 methods = [
14     "AddNodeNetwork",
15     "AddNodeNetworkSetting",
16     "DeleteNodeNetwork",
17     "DeleteNodeNetworkSetting",
18     "GetNodeNetworkSettings",
19     "GetNodeNetworks",
20     "UpdateNodeNetwork",
21     "UpdateNodeNetworkSetting",
22 ]
23
24 # does any required renaming
25 v42_to_v43_renaming = {
26     "nodenetwork_id":"interface_id",
27     "nodenetwork_ids":"interface_ids",
28     "nodenetworksetting_ids":"interface_tag_ids",
29     }
30
31 v43_to_v42_renaming = dict([ (v,k) for k,v in v42_to_v43_renaming.iteritems()])
32
33 for k,v in v42_to_v43_renaming.iteritems():
34     v43_to_v42_renaming[v]=k
35
36 def v42rename (x):
37     return v42_to_v43_renaming.get(x,x)
38
39 def v43rename (x):
40     return v43_to_v42_renaming.get(x,x)
41
42
43 # apply rename on list (columns) or dict (filter) args
44 def patch_legacy_arg (arg,rename):
45     if isinstance(arg,list):
46         return [rename(x) for x in arg]
47     if isinstance(arg,dict):
48         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
49     return rename(arg)
50
51 def patch_legacy_return (retval,rename):
52     if isinstance(retval,list):
53         for i in range(0,len(retval)):
54             retval[i] = patch_legacy_return(retval[i],rename)
55         return retval
56     if isinstance(retval,dict):
57         return dict ( [ (rename(k),v) for (k,v) in retval.iteritems() ] )
58     return rename(retval)
59
60 def legacy_method (legacyname):
61     # new method name
62     newname=legacyname.replace("NodeNetwork","Interface").replace("Setting","Tag")
63     # locate new class
64     newclass=getattr(import_deep("PLC.Methods."+newname),newname)
65     # create class for legacy name
66     legacyclass = type(legacyname,(newclass,), 
67                        {"__doc__":"Legacy method - please use %s instead"%newname})
68     # xxx should rewrite 'call' to handle any argument using nodenetwork_id(s)
69     for internal in ["roles","accepts","returns"]:
70         setattr(legacyclass,internal,getattr(newclass,internal))
71     # turn off type checking, as introspection code fails on wrapped_call
72     setattr(legacyclass,"skip_typecheck",True)
73     # rewrite call
74     def wrapped_call (self,auth,*args, **kwds):
75         print "%s: self.caller = %s, self=%s" % (legacyname,self.caller,self)
76         newargs=[patch_legacy_arg(x,v42rename) for x in args]
77         newkwds=dict ( [ (k,patch_legacy_arg(v,v42rename)) for (k,v) in kwds.iteritems() ] )
78         results = getattr(newclass,"call")(self,auth,*newargs,**newkwds)
79         return patch_legacy_return(results,v43rename)
80     setattr(legacyclass,"call",wrapped_call)
81
82     return legacyclass
83
84 import sys
85 current_module=sys.modules[__name__]
86
87 # attach
88 for legacyname in methods:
89     setattr(current_module,legacyname,legacy_method(legacyname))
90