Merge from trunk
[plcapi.git] / trunk / PLC / Methods / GetPeers.py
diff --git a/trunk/PLC/Methods/GetPeers.py b/trunk/PLC/Methods/GetPeers.py
new file mode 100644 (file)
index 0000000..e93fe36
--- /dev/null
@@ -0,0 +1,47 @@
+#
+# Thierry Parmentelat - INRIA
+# 
+
+from PLC.Faults import *
+from PLC.Method import Method
+from PLC.Parameter import Parameter, Mixed
+from PLC.Filter import Filter
+from PLC.Auth import Auth
+
+from PLC.Persons import Person
+from PLC.Peers import Peer, Peers
+
+class GetPeers (Method):
+    """
+    Returns an array of structs containing details about peers. If
+    person_filter is specified and is an array of peer identifiers or
+    peer names, or a struct of peer attributes, only peers matching
+    the filter will be returned. If return_fields is specified, only the
+    specified details will be returned.
+    """
+
+    roles = ['admin', 'node','pi','user']
+
+    accepts = [
+        Auth(),
+        Mixed([Mixed(Peer.fields['peer_id'],
+                     Peer.fields['peername'])],
+              Filter(Peer.fields)),
+        Parameter([str], "List of fields to return", nullok = True)        
+        ]
+
+    returns = [Peer.fields]
+
+    def call (self, auth, peer_filter = None, return_fields = None):
+        
+        peers = Peers(self.api, peer_filter, return_fields)
+
+        # Remove admin only fields
+        if not isinstance(self.caller, Person) or \
+                'admin' not in self.caller['roles']:
+            for peer in peers:    
+               for field in ['key', 'cacert']:
+                    if field in peer:
+                        del peer[field]
+
+        return peers