- def call(self, auth, slice_id_or_name, slice_attribute_id_list = None):
- slices = Slices(self.api, [slice_id_or_name]).values()
- if not slices:
- raise PLCInvalidArgument, "No such slice"
- slice = slices[0]
-
- if 'admin' not in self.caller['roles']:
- if self.caller['person_id'] in slice['person_ids']:
- pass
- elif 'pi' not in self.caller['roles']:
- raise PLCPermissionDenied, "Not a member of the specified slice"
- elif slice['site_id'] not in self.caller['site_ids']:
- raise PLCPermissionDenied, "Specified slice not associated with any of your sites"
-
- if slice_attribute_id_list is None:
- slice_attribute_id_list = slice['slice_attribute_ids']
+ def call(self, auth, slice_attribute_filter = None, return_fields = None):
+ # If we are not admin, make sure to only return our own slice
+ # and sliver attributes.
+ if isinstance(self.caller, Person) and \
+ 'admin' not in self.caller['roles']:
+ # Get slices that we are able to view
+ valid_slice_ids = self.caller['slice_ids']
+ if 'pi' in self.caller['roles'] and self.caller['site_ids']:
+ sites = Sites(self.api, self.caller['site_ids'])
+ for site in sites:
+ valid_slice_ids += site['slice_ids']
+
+ if not valid_slice_ids:
+ return []
+
+ # Get slice attributes that we are able to view
+ valid_slice_attribute_ids = []
+ slices = Slices(self.api, valid_slice_ids)
+ for slice in slices:
+ valid_slice_attribute_ids += slice['slice_attribute_ids']
+
+ if not valid_slice_attribute_ids:
+ return []
+
+ if slice_attribute_filter is None:
+ slice_attribute_filter = valid_slice_attribute_ids
+
+ # Must query at least slice_attribute_id (see below)
+ if return_fields is not None and 'slice_attribute_id' not in return_fields:
+ return_fields.append('slice_attribute_id')
+ added_fields = True