X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=PLC%2FMethods%2FGetSliceKeys.py;h=8ac27160181d3a90927eec8cbb206310f054ddbf;hb=053fd6410f733aef90482cda571059ed116d40e1;hp=7306a010b5a90a9ae821aea28e9bf0db5ca6fbae;hpb=f5cd72e35593c96b9996ab4e49674cccc7525c48;p=plcapi.git diff --git a/PLC/Methods/GetSliceKeys.py b/PLC/Methods/GetSliceKeys.py index 7306a01..8ac2716 100644 --- a/PLC/Methods/GetSliceKeys.py +++ b/PLC/Methods/GetSliceKeys.py @@ -11,11 +11,11 @@ from PLC.Keys import Key, Keys class GetSliceKeys(Method): """ - Returns an array of structs containing public key info for users in - the specified slices. If slice_filter is specified and is an array - of slice identifiers or slice names, or a struct of slice - attributes, only slices matching the filter will be returned. If - return_fields is specified, only the specified details will be + Returns an array of structs containing public key info for users in + the specified slices. If slice_filter is specified and is an array + of slice identifiers or slice names, or a struct of slice + attributes, only slices matching the filter will be returned. If + return_fields is specified, only the specified details will be returned. Users may only query slices of which they are members. PIs may @@ -35,21 +35,21 @@ class GetSliceKeys(Method): ] returns = [ - { - 'slice_id': Slice.fields['slice_id'], - 'name': Slice.fields['name'], - 'person_id': Person.fields['person_id'], - 'email': Person.fields['email'], - 'key': Key.fields['key'] - }] + { + 'slice_id': Slice.fields['slice_id'], + 'name': Slice.fields['name'], + 'person_id': Person.fields['person_id'], + 'email': Person.fields['email'], + 'key': Key.fields['key'] + }] def call(self, auth, slice_filter = None, return_fields = None): - slice_fields = ['slice_id', 'name'] - person_fields = ['person_id', 'email'] - key_fields = ['key'] + slice_fields = ['slice_id', 'name'] + person_fields = ['person_id', 'email'] + key_fields = ['key'] - # If we are not admin, make sure to return only viewable - # slices. + # If we are not admin, make sure to return only viewable + # slices. if isinstance(self.caller, Person) and \ 'admin' not in self.caller['roles']: # Get slices that we are able to view @@ -65,72 +65,71 @@ class GetSliceKeys(Method): if slice_filter is None: slice_filter = valid_slice_ids - if return_fields: - slice_return_fields = filter(lambda field: field in slice_fields, return_fields) - person_return_fields = filter(lambda field: field in person_fields, return_fields) - key_return_fields = filter(lambda field: field in key_fields, return_fields) - else: - slice_return_fields = slice_fields - person_return_fields = person_fields - key_return_fields = key_fields - - # Must query at least Slice.slice_id, Slice.person_ids, - # and Person.person_id and Person.key_ids so we can join data correctly + if return_fields: + slice_return_fields = filter(lambda field: field in slice_fields, return_fields) + person_return_fields = filter(lambda field: field in person_fields, return_fields) + key_return_fields = filter(lambda field: field in key_fields, return_fields) + else: + slice_return_fields = slice_fields + person_return_fields = person_fields + key_return_fields = key_fields + + # Must query at least Slice.slice_id, Slice.person_ids, + # and Person.person_id and Person.key_ids so we can join data correctly slice_added_fields = set(['slice_id', 'person_ids']).difference(slice_return_fields) slice_return_fields += slice_added_fields - person_added_fields = set(['person_id', 'key_ids']).difference(person_return_fields) - person_return_fields += person_added_fields - key_added_fields = set(['key_id']).difference(key_return_fields) - key_return_fields += key_added_fields + person_added_fields = set(['person_id', 'key_ids']).difference(person_return_fields) + person_return_fields += person_added_fields + key_added_fields = set(['key_id']).difference(key_return_fields) + key_return_fields += key_added_fields - # Get the slices + # Get the slices all_slices = Slices(self.api, slice_filter, slice_return_fields).dict('slice_id') - slice_ids = all_slices.keys() - slices = all_slices.values() + slice_ids = all_slices.keys() + slices = all_slices.values() - # Filter out slices that are not viewable + # Filter out slices that are not viewable if isinstance(self.caller, Person) and \ 'admin' not in self.caller['roles']: slices = filter(lambda slice: slice['slice_id'] in valid_slice_ids, slices) - - # Get the persons - person_ids = set() - for slice in slices: - person_ids.update(slice['person_ids']) - - all_persons = Persons(self.api, list(person_ids), person_return_fields).dict('person_id') - person_ids = all_persons.keys() - persons = all_persons.values() - - # Get the keys - key_ids = set() - for person in persons: - key_ids.update(person['key_ids']) - - all_keys = Keys(self.api, list(key_ids), key_return_fields).dict('key_id') - key_ids = all_keys.keys() - keys = all_keys.values() - - # Create slice_keys list - slice_keys = [] - slice_fields = list(set(slice_return_fields).difference(slice_added_fields)) - person_fields = list(set(person_return_fields).difference(person_added_fields)) - key_fields = list(set(key_return_fields).difference(key_added_fields)) - - for slice in slices: - slice_key = dict.fromkeys(slice_fields + person_fields + key_fields) - if not slice['person_ids']: - continue - for person_id in slice['person_ids']: - person = all_persons[person_id] - if not person['key_ids']: - continue - for key_id in person['key_ids']: - key = all_keys[key_id] - slice_key.update(dict(filter(lambda (k, v): k in slice_fields, slice.items()))) - slice_key.update(dict(filter(lambda (k, v): k in person_fields, person.items()))) - slice_key.update(dict(filter(lambda (k, v): k in key_fields, key.items()))) - slice_keys.append(slice_key.copy()) - - return slice_keys + # Get the persons + person_ids = set() + for slice in slices: + person_ids.update(slice['person_ids']) + + all_persons = Persons(self.api, list(person_ids), person_return_fields).dict('person_id') + person_ids = all_persons.keys() + persons = all_persons.values() + + # Get the keys + key_ids = set() + for person in persons: + key_ids.update(person['key_ids']) + + all_keys = Keys(self.api, list(key_ids), key_return_fields).dict('key_id') + key_ids = all_keys.keys() + keys = all_keys.values() + + # Create slice_keys list + slice_keys = [] + slice_fields = list(set(slice_return_fields).difference(slice_added_fields)) + person_fields = list(set(person_return_fields).difference(person_added_fields)) + key_fields = list(set(key_return_fields).difference(key_added_fields)) + + for slice in slices: + slice_key = dict.fromkeys(slice_fields + person_fields + key_fields) + if not slice['person_ids']: + continue + for person_id in slice['person_ids']: + person = all_persons[person_id] + if not person['key_ids']: + continue + for key_id in person['key_ids']: + key = all_keys[key_id] + slice_key.update(dict(filter(lambda (k, v): k in slice_fields, slice.items()))) + slice_key.update(dict(filter(lambda (k, v): k in person_fields, person.items()))) + slice_key.update(dict(filter(lambda (k, v): k in key_fields, key.items()))) + slice_keys.append(slice_key.copy()) + + return slice_keys