Пример #1
0
 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)
Пример #2
0
 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]
Пример #3
0
 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]
Пример #4
0
 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]
Пример #5
0
    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()))
Пример #6
0
 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
Пример #7
0
    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')
Пример #8
0
 def update_path(dir_key):
     dir_key.last_backup_path = CakePath.ensure_it(backup_path)
Пример #9
0
 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