renaming SliceAttribute into SliceTag and InterfaceSetting into InterfaceTag
[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 def rename (x):
26     if x=='nodenetwork_id':
27         return 'interface_id'
28     if x=='nodenetwork_ids':
29         return 'interface_ids'
30     else:
31         return x
32
33 # apply rename on list (columns) or dict (filter) args
34 def patch_legacy_arg (arg):
35     if isinstance(arg,list):
36         return [rename(x) for x in arg]
37     if isinstance(arg,dict):
38         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
39     return arg
40
41 def legacy_method (legacyname):
42     # new method name
43     newname=legacyname.replace("NodeNetwork","Interface").replace("Setting","Tag")
44     # locate new class
45     newclass=getattr(import_deep("PLC.Methods."+newname),newname)
46     # create class for legacy name
47     legacyclass = type(legacyname,(newclass,), 
48                        {"__doc__":"Legacy method - please use %s instead"%newname})
49     # xxx should rewrite 'call' to handle any argument using nodenetwork_id(s)
50     for internal in ["roles","accepts","returns"]:
51         setattr(legacyclass,internal,getattr(newclass,internal))
52     # turn off type checking, as introspection code fails on wrapped_call
53     setattr(legacyclass,"skip_typecheck",True)
54     # rewrite call
55     def wrapped_call (self,auth,*args, **kwds):
56         newargs=[patch_legacy_arg(x) for x in args]
57         newkwds=dict ( [ (k,patch_legacy_arg(v)) for (k,v) in kwds.iteritems() ] )
58         return getattr(newclass,"call")(self,auth,*newargs,**newkwds)
59     setattr(legacyclass,"call",wrapped_call)
60
61     return legacyclass
62
63 import sys
64 current_module=sys.modules[__name__]
65
66 # attach
67 for legacyname in methods:
68     setattr(current_module,legacyname,legacy_method(legacyname))
69