svn keywords
[plcapi.git] / PLC / Accessors / Factory.py
index c4950ca..02de440 100644 (file)
@@ -1,5 +1,6 @@
 # Thierry Parmentelat - INRIA
 # $Id$
+# $URL$
 
 from types import NoneType
 
@@ -27,10 +28,10 @@ taggable_classes = { Node : {'table_class' : Nodes,
                              '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
                      }
 
@@ -38,26 +39,35 @@ taggable_classes = { Node : {'table_class' : Nodes,
 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
@@ -72,12 +82,8 @@ def define_accessors (module, objclass, 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") ]
 
@@ -129,7 +135,7 @@ def define_accessors (module, objclass, methodsuffix,
             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]
@@ -171,6 +177,14 @@ def define_accessors (module, objclass, methodsuffix,
             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)