From da587f8598c5e22c951cb0f0278e82a0f0f07462 Mon Sep 17 00:00:00 2001 From: Thierry Parmentelat Date: Tue, 19 Aug 2008 21:49:06 +0000 Subject: [PATCH] finetuned and nicer --- PLC/Accessors/Accessors_site.py.in | 13 +++++---- PLC/Accessors/Accessors_standard.py | 15 +++++----- PLC/Accessors/Factory.py | 43 ++++++++++++++++++++--------- PLC/Legacy/NodeNetworks.py | 23 +++++---------- PLC/Legacy/Types.py | 20 ++++++-------- 5 files changed, 59 insertions(+), 55 deletions(-) diff --git a/PLC/Accessors/Accessors_site.py.in b/PLC/Accessors/Accessors_site.py.in index 24bc977..6e18919 100644 --- a/PLC/Accessors/Accessors_site.py.in +++ b/PLC/Accessors/Accessors_site.py.in @@ -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'] ) diff --git a/PLC/Accessors/Accessors_standard.py b/PLC/Accessors/Accessors_standard.py index 3b6ceae..7ada957 100644 --- a/PLC/Accessors/Accessors_standard.py +++ b/PLC/Accessors/Accessors_standard.py @@ -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'] ) diff --git a/PLC/Accessors/Factory.py b/PLC/Accessors/Factory.py index 99c782e..5cee5b8 100644 --- a/PLC/Accessors/Factory.py +++ b/PLC/Accessors/Factory.py @@ -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 .methods + try: + methods=getattr(module,'methods') + except: + methods=[] + methods += [get_name,set_name] + setattr(module,'methods',methods) diff --git a/PLC/Legacy/NodeNetworks.py b/PLC/Legacy/NodeNetworks.py index 7e805e5..0c34ea7 100644 --- a/PLC/Legacy/NodeNetworks.py +++ b/PLC/Legacy/NodeNetworks.py @@ -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") diff --git a/PLC/Legacy/Types.py b/PLC/Legacy/Types.py index 71b2309..6077c29 100644 --- a/PLC/Legacy/Types.py +++ b/PLC/Legacy/Types.py @@ -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") -- 2.43.0