- re-enable return_fields specification
[plcapi.git] / PLC / Peers.py
1 #
2 # Thierry Parmentelat - INRIA
3
4
5 import re
6
7 from types import StringTypes
8
9 from PLC.Faults import *
10 from PLC.Parameter import Parameter
11 from PLC.Filter import Filter
12 from PLC.Table import Row, Table
13
14 class Peer (Row):
15     """
16     Stores the list of peering PLCs in the peers table. 
17     See the Row class for more details
18     """
19
20     table_name = 'peers'
21     primary_key = 'peer_id'
22     fields = {
23         'peer_id' : Parameter (int, "Peer identifier"),
24         'peername' : Parameter (str, "Peer name"),
25         'peer_url' : Parameter (str, "Peer API url"),
26         'person_id' : Parameter (int, "Person_id of the account storing credentials - temporary"),
27         'node_ids' : Parameter ([int], "This peer's nodes ids")
28         }
29
30     def validate_peer_url (self, url):
31         """
32         Validate URL, checks it looks like https 
33         """
34         invalid_url = PLCInvalidArgument("Invalid URL")
35         if not re.compile ("^https://.*$").match(url) : 
36             raise invalid_url
37         return url
38
39     def delete (self, commit=True):
40         """
41         Delete peer
42         """
43         
44         assert 'peer_id' in self
45
46         self['deleted'] = True
47         self.sync(commit)
48
49 class Peers (Table):
50     """ 
51     Maps to the peers table in the database
52     """
53     
54     def __init__ (self, api, peer_filter = None, columns = None):
55         Table.__init__(self, api, Peer, columns)
56
57         sql = "SELECT %s FROM view_peers WHERE deleted IS False" % \
58               ", ".join(self.columns)
59
60         if peer_filter is not None:
61             if isinstance(peer_filter, (list, tuple, set)):
62                 # Separate the list into integers and strings
63                 ints = filter(lambda x: isinstance(x, (int, long)), peer_filter)
64                 strs = filter(lambda x: isinstance(x, StringTypes), peer_filter)
65                 peer_filter = Filter(Peer.fields, {'peer_id': ints, 'peername': strs})
66                 sql += " AND (%s)" % peer_filter.sql(api, "OR")
67             elif isinstance(peer_filter, dict):
68                 peer_filter = Filter(Peer.fields, peer_filter)
69                 sql += " AND (%s)" % peer_filter.sql(api, "AND")
70
71         self.selectall(sql)