finetuned and nicer
authorThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 19 Aug 2008 21:49:06 +0000 (21:49 +0000)
committerThierry Parmentelat <thierry.parmentelat@sophia.inria.fr>
Tue, 19 Aug 2008 21:49:06 +0000 (21:49 +0000)
PLC/Accessors/Accessors_site.py.in
PLC/Accessors/Accessors_standard.py
PLC/Accessors/Factory.py
PLC/Legacy/NodeNetworks.py
PLC/Legacy/Types.py

index 24bc977..6e18919 100644 (file)
@@ -14,11 +14,12 @@ from PLC.Interfaces import Interface
 from PLC.Slices import Slice
 from PLC.Ilinks import Ilink
 
-from PLC.Accessors.Factory import all_roles, get_set_factory
+from PLC.Accessors.Factory import define_accessors, all_roles
+
+import sys
+current_module = sys.modules[__name__]
 
 #### example : attach vlan ids on interfaces
-###(GetInterfaceVlan, SetInterfaceVlan) = \
-###    get_set_factory ( Interface, "Vlan", "vlan","interface/general", "tag for setting VLAN id",
-###                      get_roles=all_roles,
-###                      set_roles=['admin', 'pi', 'tech'] )
-###methods += [ 'GetInterfaceVlan', 'SetInterfaceVlan' ]
+###define_accessors(current_module, Interface, "Vlan", "vlan","interface/general", "tag for setting VLAN id",
+###                 get_roles=all_roles,
+###                 set_roles=['admin', 'pi', 'tech'] )
index 3b6ceae..7ada957 100644 (file)
@@ -6,15 +6,14 @@ from PLC.Interfaces import Interface
 from PLC.Slices import Slice
 from PLC.Ilinks import Ilink
 
-from PLC.Accessors.Factory import all_roles, get_set_factory
+from PLC.Accessors.Factory import define_accessors, all_roles
 
-methods=[]
+import sys
+current_module = sys.modules[__name__]
 
 # example : node architecture 
-(GetNodeArch, SetNodeArch) = \
-    get_set_factory ( Node, "Arch", 'arch',  'node/config', 'architecture name', 
-                      tag_min_role_id=40, 
-                      get_roles=all_roles,
-                      set_roles=['admin', 'pi', 'tech'] )
-methods += [ 'GetNodeArch', 'SetNodeArch' ]
+define_accessors(current_module, Node, "Arch", 'arch',  'node/config', 'architecture name', 
+                 tag_min_role_id=40,
+                 get_roles=all_roles,
+                 set_roles=['admin', 'pi', 'tech'] )
 
index 99c782e..5cee5b8 100644 (file)
@@ -48,9 +48,9 @@ all_roles = [ 'admin', 'pi', 'tech', 'user', 'node' ]
 # returns a tuple (get_method, set_method)
 # See Accessors* for examples
 
-def get_set_factory (objclass, methodsuffix, 
-                     tagname, category, description, tag_min_role_id=10,
-                     get_roles=['admin'], set_roles=['admin']):
+def define_accessors (module, objclass, methodsuffix, 
+                      tagname, category, description, tag_min_role_id=10,
+                      get_roles=['admin'], set_roles=['admin']):
     
     if objclass not in taggable_classes:
         try:
@@ -146,26 +146,43 @@ def get_set_factory (objclass, methodsuffix,
                                'min_role_id': tag_min_role_id}
             tag_type = TagType (self.api, tag_type_fields)
             tag_type.sync()
-        # proceed
         tag_type_id = tag_type['tag_type_id']
+
+        # locate the join object (e.g. NodeTag, SliceAttribute or InterfaceSetting)
         filter = {'tag_type_id':tag_type_id}
         if isinstance (id_or_name,int):
             filter[primary_key]=id_or_name
         else:
             filter[secondary_key]=id_or_name
         joins = joins_class (self.api,filter)
-        if not joins:
-            join = join_class (self.api)
-            join['tag_type_id']=tag_type_id
-            join[primary_key]=primary_id
-            join[value_key]=tagvalue
-            join.sync()
+        # setting to something non void
+        if tagvalue is not None:
+            if not joins:
+                join = join_class (self.api)
+                join['tag_type_id']=tag_type_id
+                join[primary_key]=primary_id
+                join[value_key]=tagvalue
+                join.sync()
+            else:
+                joins[0][value_key]=tagvalue
+                joins[0].sync()
+        # providing an empty value means clean up
         else:
-            joins[0][value_key]=tagvalue
-            joins[0].sync()
+            if joins:
+                join=joins[0]
+                join.delete()
 
     # attach it
     setattr (set_class,"call",set_call)
 
-    return ( get_class, set_class )
+    # define in module
+    setattr(module,get_name,get_class)
+    setattr(module,set_name,set_class)
+    # add in <module>.methods
+    try:
+        methods=getattr(module,'methods')
+    except:
+        methods=[]
+    methods += [get_name,set_name]
+    setattr(module,'methods',methods)
 
index 7e805e5..0c34ea7 100644 (file)
@@ -38,7 +38,7 @@ def patch_legacy_arg (arg):
         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
     return arg
 
-def factory (legacyname):
+def legacy_method (legacyname):
     # new method name
     newname=legacyname.replace("NodeNetwork","Interface")
     # locate new class
@@ -60,19 +60,10 @@ def factory (legacyname):
 
     return legacyclass
 
-# this does not work, as __module__ is not yet supported
-#for legacyname in methods:
-#   setattr(__module__,legacyname,factory(legacyname))
-# this does not work either, as we are importing the module so we cannot locate it yet
-#for legacyname in methods:
-#    this_module = import_deep(__name__)
-#    setattr(__module__,legacyname,factory(legacyname))
+import sys
+current_module=sys.modules[__name__]
+
+# attach
+for legacyname in methods:
+    setattr(current_module,legacyname,legacy_method(legacyname))
 
-AddNodeNetwork=factory("AddNodeNetwork")
-AddNodeNetworkSetting=factory("AddNodeNetworkSetting")
-DeleteNodeNetwork=factory("DeleteNodeNetwork")
-DeleteNodeNetworkSetting=factory("DeleteNodeNetworkSetting")
-GetNodeNetworkSettings=factory("GetNodeNetworkSettings")
-GetNodeNetworks=factory("GetNodeNetworks")
-UpdateNodeNetwork=factory("UpdateNodeNetwork")
-UpdateNodeNetworkSetting=factory("UpdateNodeNetworkSetting")
index 71b2309..6077c29 100644 (file)
@@ -21,8 +21,6 @@ map = {
     "UpdateNodeNetworkSettingType"  : "UpdateTagType",
 }    
 
-methods = map.keys()
-
 # does any required renaming
 def rename (x):
     if x=='name':
@@ -38,7 +36,7 @@ def patch_legacy_arg (arg):
         return dict ( [ (rename(k),v) for (k,v) in arg.iteritems() ] )
     return arg
 
-def factory (legacyname, newname):
+def legacy_method (legacyname, newname):
     # locate new class
     newclass=getattr(import_deep("PLC.Methods."+newname),newname)
     # create class for legacy name
@@ -57,13 +55,11 @@ def factory (legacyname, newname):
 
     return legacyclass
 
-# see NodeNetworks for attempts to avoid this
+import sys
+current_module=sys.modules[__name__]
+
+for (legacyname,newname) in map.iteritems():
+    setattr(current_module,legacyname,legacy_method(legacyname,newname))
+
+methods = map.keys()
 
-AddSliceAttributeType=factory("AddSliceAttributeType","AddTagType")
-DeleteSliceAttributeType=factory("DeleteSliceAttributeType","DeleteTagType")
-GetSliceAttributeTypes=factory("GetSliceAttributeTypes","GetTagTypes")
-UpdateSliceAttributeType=factory("UpdateSliceAttributeType","UpdateTagType")
-AddNodeNetworkSettingType=factory("AddNodeNetworkSettingType","AddTagType")
-DeleteNodeNetworkSettingType=factory("DeleteNodeNetworkSettingType","DeleteTagType")
-GetNodeNetworkSettingTypes=factory("GetNodeNetworkSettingTypes","GetTagTypes")
-UpdateNodeNetworkSettingType=factory("UpdateNodeNetworkSettingType","UpdateTagType")