# Thierry Parmentelat - INRIA
# $Id$
+# $URL$
from types import NoneType
'secondary_key': 'hostname'},
Interface : {'table_class' : Interfaces,
'joins_class': InterfaceTags, 'join_class': InterfaceTag,
- },
+ 'secondary_key' : 'ip'},
Slice: {'table_class' : Slices,
'joins_class': SliceTags, 'join_class': SliceTag,
- 'secondary_key':'login_base'},
+ 'secondary_key':'name'},
# Ilink : xxx
}
all_roles = [ 'admin', 'pi', 'tech', 'user', 'node' ]
tech_roles = [ 'admin', 'pi', 'tech' ]
+#
# generates 2 method classes:
# Get<classname><methodsuffix> (auth, id_or_name) -> value or None
# Set<classname><methodsuffix> (auth, id_or_name, value) -> None
# value is always a string, no cast nor typecheck for now
#
+# The expose_in_api flag tells whether this tag may be handled
+# through the Add/Get/Update methods as a native field
+#
# note: tag_min_role_id gets attached to the tagtype instance,
# while get_roles and set_roles get attached to the created methods
+# this might need a cleanup
#
-# returns a tuple (get_method, set_method)
-# See Accessors* for examples
-def define_accessors (module, 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,
+ get_roles=['admin'], set_roles=['admin'],
+ tag_min_role_id=10, expose_in_api = False):
if objclass not in taggable_classes:
try:
raise PLCInvalidArgument,"PLC.Accessors.Factory: unknown class %s"%objclass.__name__
except:
raise PLCInvalidArgument,"PLC.Accessors.Factory: unknown class ??"
+
+ # side-effect on, say, Node.tags, if required
+ if expose_in_api:
+ getattr(objclass,'tags')[tagname]=Parameter(str,"accessor")
+
classname=objclass.__name__
get_name = "Get" + classname + methodsuffix
set_name = "Set" + classname + methodsuffix
# accepts
get_accepts = [ Auth () ]
primary_key=objclass.primary_key
- try:
- secondary_key = taggable_classes[objclass]['secondary_key']
- get_accepts += [ Mixed (objclass.fields[primary_key], objclass.fields[secondary_key]) ]
- except:
- secondary_key = None
- get_accepts += [ objclass.fields[primary_key] ]
+ secondary_key = taggable_classes[objclass]['secondary_key']
+ get_accepts += [ Mixed (objclass.fields[primary_key], objclass.fields[secondary_key]) ]
# for set, idem set of arguments + one additional arg, the new value
set_accepts = get_accepts + [ Parameter (str,"New tag value") ]
filter={primary_key:id_or_name}
else:
filter={secondary_key:id_or_name}
- objs = table_class(self.api, filter,[primary_key])
+ objs = table_class(self.api, filter,[primary_key,secondary_key])
if not objs:
raise PLCInvalidArgument, "Cannot set tag on %s %r"%(objclass.__name__,id_or_name)
primary_id = objs[0][primary_key]
if joins:
join=joins[0]
join.delete()
+ # log it
+ self.event_objects= { objclass.__name__ : [primary_id] }
+ self.message=objclass.__name__
+ if secondary_key in objs[0]:
+ self.message += " %s "%objs[0][secondary_key]
+ else:
+ self.message += " %d "%objs[0][primary_key]
+ self.message += "updated"
# attach it
setattr (set_class,"call",set_call)