--- /dev/null
+from types import StringTypes
+import time
+import re
+
+from PLC.Faults import *
+from PLC.Parameter import Parameter, Mixed
+from PLC.Filter import Filter
+from PLC.Debug import profile
+from PLC.Table import Row, Table
+from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations
+from PLC.Nodes import Node
+from PLC.Persons import Person, Persons
+from PLC.SliceTags import SliceTag
+from PLC.Timestamp import Timestamp
+
+class Policy(Table):
+ def __init__(self, api, caller, states):
+ self.api = api
+ self.caller = caller
+ self.states = states
+ self.state_function = iter(self.states)
+ # Compatibility for current state of API methods, this should go away
+ self.clutter = {}
+ return
+
+ def incoming(self, row_id_filter, column_name_filter, row_value_filter):
+ return {'row_id_filter':slices,'column_filter':column_name_filter,'value_filter':row_value_filter}
+
+ def outgoing(self, rows):
+ return rows
--- /dev/null
+from types import StringTypes
+import time
+import re
+
+from PLC.Faults import *
+from PLC.Parameter import Parameter, Mixed
+from PLC.Filter import Filter
+from PLC.Debug import profile
+from PLC.Table import Row, Table
+from PLC.SliceInstantiations import SliceInstantiation, SliceInstantiations
+from PLC.Nodes import Node
+from PLC.Persons import Person, Persons
+from PLC.SliceTags import SliceTag
+from PLC.Timestamp import Timestamp
+
+class SlicesPolicy(Policy):
+ def __init__(self, api, caller, states):
+ slice_states = ['incoming','outgoing']
+ return Policy(api, caller, slice_states)
+
+ def incoming(self, slice_filter, column_filter, value_filter):
+ """
+ Returns set of rows/columns caller is allowed to touch
+ """
+ # 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
+ valid_slice_ids = self.caller['slice_ids']
+ if 'pi' in self.caller['roles'] and 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 []
+
+ if slice_filter is None:
+ slice_filter = valid_slice_ids
+
+ # Must query at least slice_id (see below)
+ if return_fields is not None and 'slice_id' not in return_fields:
+ return_fields.append('slice_id')
+ self.clutter['added_fields'] = True
+ else:
+ self.clutter['added_fields'] = False
+
+ # This is redundant given the code above - Sapan
+ # 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)
+
+
+ return {'row_filter':slices,'column_filter':column_filter,'value_filter':value_filter}
+
+
+ def outgoing(self, api, caller, rows):
+ state = self.state_function.next()
+ if (state is not 'outgoing'):
+ raise Exception('Outgoing hook called in state %s'%state)
+
+ # Remove slice_id if not specified
+ if self.clutter['added_fields']:
+ for slice in rows:
+ if 'slice_id' in slice:
+ del slice['slice_id']
+
+ return rows