add new slice functions
[plcapi.git] / PLC / Methods / GetSlices.py
1 from PLC.Method import Method
2 from PLC.Parameter import Parameter, Mixed
3 from PLC.Auth import PasswordAuth
4 from PLC.Slices import Slice, Slices
5
6 class GetSlices(Method):
7     """
8     Return an array of structs containing details about slices. If
9     slice_id_or_name_list is specified, only the specified slices will
10     be queried.
11
12     Users may only query slices of which they are members. PIs may
13     query any of the slices at their sites. Admins may query any
14     slice. If a slice that cannot be queried is specified in
15     slice_id_or_name_list, details about that slice will not be
16     returned.
17     """
18
19     roles = ['admin', 'pi', 'user', 'tech']
20
21     accepts = [
22         PasswordAuth(),
23         [Mixed(Slice.fields['slice_id'],
24                Slice.fields['name'])],
25         Parameter([str], 'List of fields to return')
26         ]
27
28     # Filter out is_deleted field
29     can_return = lambda (field, value): field not in ['is_deleted']
30     return_fields = dict(filter(can_return, Slice.fields.items()))
31     returns = [return_fields]
32
33     def call(self, auth, slice_id_or_name_list = None):
34         # Get slice information
35         slices = Slices(self.api, slice_id_or_name_list).values()
36
37         # Filter out slices that are not viewable
38         if 'admin' not in self.caller['roles']:
39             member_of = lambda slice: self.caller['person_id'] in slice['person_ids']
40             if 'pi' in self.caller['roles']:
41                 can_view = lambda slice: \
42                            member_of(slice) or \
43                            slice['site_id'] in self.caller['site_ids']
44             else:
45                 can_view = member_of
46             slices = filter(can_view, slices)
47
48         # Filter out undesired or None fields (XML-RPC cannot marshal
49         # None) and turn each slice into a real dict.
50         valid_return_fields_only = lambda (key, value): value is not None
51         slices = [dict(filter(valid_return_fields_only, slice.items())) \
52                  for slice in slices]
53
54         return slices