6077c29c499181eb23532f8b003c29c938a537f2
[plcapi.git] / PLC / Legacy / Types.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 map = {
14     "AddSliceAttributeType"         : "AddTagType",
15     "DeleteSliceAttributeType"      : "DeleteTagType",
16     "GetSliceAttributeTypes"        : "GetTagTypes",
17     "UpdateSliceAttributeType"      : "UpdateTagType",
18     "AddNodeNetworkSettingType"     : "AddTagType",
19     "DeleteNodeNetworkSettingType"  : "DeleteTagType",
20     "GetNodeNetworkSettingTypes"    : "GetTagTypes",
21     "UpdateNodeNetworkSettingType"  : "UpdateTagType",
22 }    
23
24 # does any required renaming
25 def rename (x):
26     if x=='name':
27         return 'tagname'
28     else:
29         return x
30
31 # apply rename on list (columns) or dict (filter) args
32 def patch_legacy_arg (arg):
33     if isinstance(arg,list):
34         return [rename(x) for x in arg]
35     if isinstance(arg,dict):
36         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
37     return arg
38
39 def legacy_method (legacyname, newname):
40     # locate new class
41     newclass=getattr(import_deep("PLC.Methods."+newname),newname)
42     # create class for legacy name
43     legacyclass = type(legacyname,(newclass,), 
44                        {"__doc__":"Legacy method - please use %s instead"%newname})
45     for internal in ["roles","accepts","returns"]:
46         setattr(legacyclass,internal,getattr(newclass,internal))
47     # turn off type checking, as introspection code fails on wrapped_call
48     setattr(legacyclass,"skip_typecheck",True)
49     # rewrite call
50     def wrapped_call (self,auth,*args, **kwds):
51         newargs=[patch_legacy_arg(x) for x in args]
52         newkwds=dict ( [ (k,patch_legacy_arg(v)) for (k,v) in kwds.iteritems() ] )
53         return getattr(newclass,"call")(self,auth,*newargs,**newkwds)
54     setattr(legacyclass,"call",wrapped_call)
55
56     return legacyclass
57
58 import sys
59 current_module=sys.modules[__name__]
60
61 for (legacyname,newname) in map.iteritems():
62     setattr(current_module,legacyname,legacy_method(legacyname,newname))
63
64 methods = map.keys()
65