def cake_path(self, relative=None): path = list(self.ancestry(include_root=True)) if path[0].relative(): relative = True elif relative is None: relative = False path_names = [p.name for p in path[1:]] if relative: return CakePath(None, _root=None, _path=path_names) else: return CakePath(None, _root=path[0].portal, _path=path_names)
def __contains__(self, k): k = CakePath.ensure_it(k) nxt_path, reminder = k.next_in_relative_path() if reminder is None: if nxt_path is not None: return nxt_path in self.store else: return False else: return reminder in self.store[nxt_path]
def __getitem__(self, k): k = CakePath.ensure_it(k) nxt_path, reminder = k.next_in_relative_path() if reminder is None: if nxt_path is None: return self else: return self.store[nxt_path] else: return self.store[nxt_path][reminder]
def __delitem__(self, k): k = CakePath.ensure_it(k) self._bundle = None nxt_path, reminder = k.next_in_relative_path() if reminder is None: if nxt_path is None: raise AssertionError('Cannot delete itself') else: del self.store[nxt_path] self.clean() else: del self.store[nxt_path][reminder]
def backup(self, dir='.', remote_path=None, portal_type=None): self._check_cu_session(dir) scan_path = cscan.ScanPath(dir) dirkey = scan_path.cake_entries().dir_key() if remote_path is None: if portal_type is not None: remote = dirkey.id.transform_portal(type=portal_type) remote_path = CakePath(None, _root=remote) else: print(dirkey.id) if dirkey.last_backup_path is None: remote = dirkey.id.transform_portal(type=CakeType.PORTAL) remote_path = CakePath(None, _root=remote) else: remote_path = dirkey.last_backup_path scan_path.set_remote_path(remote_path) portal_id, latest_cake = cscan.backup(scan_path, self.remote()) print('DirId: {portal_id!s}\n' 'RemotePath: {remote_path!s}\n' 'Cake: {latest_cake!s}\n' ''.format(**locals()))
def __setitem__(self, k, cake): k = CakePath.ensure_it(k) nxt_path, reminder = k.next_in_relative_path() if reminder is None: if nxt_path is None: raise AssertionError('Cannot set itself') else: self.store[nxt_path] = CakeNode(self, nxt_path, cake) self.clean() else: if nxt_path not in self.store: self.store[nxt_path] = Neuron(self, nxt_path) self.store[nxt_path][reminder] = cake
def get_content(self, cake_or_path): ''' get_content(data_cake) -> Content permissions: Read_, Read_Any_Data Reads data by data_cake or get_content(portal_cake) -> Content permissions: Read_, Read_Any_Portal Read portal, if portal points to other portal permission needs to be check on all portals in redirect chain. redirect chain cannot be longer then 10. ''' if isinstance(cake_or_path, CakePath): return self.get_content_by_path(cake_or_path) cake = cake_or_path if cake.has_data(): return Content.from_data_and_role(role=cake.header.role, data=cake.data()) elif cake.is_resolved(): self.authorize(cake_or_path, Permissions.read_data_cake) return self.blob_store().get_content(cake_or_path) elif cake.header.type.is_portal: self.authorize(cake_or_path, Permissions.read_portal) if cake.header.type == CakeType.PORTAL: resolution_stack = dal.resolve_cake_stack( self.ctx.cake_session, cake_or_path) for resolved_portal in resolution_stack[:-1]: self.authorize(cake_or_path, Permissions.read_portal) return self.blob_store().get_content(resolution_stack[-1]) elif cake.header.type in [CakeType.DMOUNT, CakeType.VTREE]: return self.get_content_by_path( CakePath(None, _root=cake, _path=[])) else: raise AssertionError('should never get here')
def update_path(dir_key): dir_key.last_backup_path = CakePath.ensure_it(backup_path)
def _assert_vtree_(self, cake_path): cake_path = CakePath.ensure_it(cake_path) if cake_path.relative(): raise ValueError('cake_path has to be absolute: %r' % cake_path) CakeType.VTREE.assert_equals(cake_path.root.header.type) return cake_path