예제 #1
0
    def upload_node(self, node: TreeNode, parent_id: str = "LOCAL_ROOT"):
        """Carica un nodo, all'interno del parent passato"""
        headers = {"cookie": self.cookie}

        name = node.get_name()
        content = open(node.get_payload().path, "rb")
        updated_at = node.get_updated_at()
        created_at = node.get_payload().created_at

        multipart_form = {
            "command": "upload",
            "name": name,
            "content": content,
            "parent": self.get_user_id() + "/" + parent_id,
            "updated-at": updated_at,
            "created-at": created_at
        }

        response = requests.post(self.url_files,
                                 headers=headers,
                                 files=multipart_form)

        if response.ok:
            self.logger.info(
                f"Upload del file {name}, completato con successo")
        else:
            self.logger.info(f"Upload del file {name}, fallito")
            # alzo le eccezioni del caso
            self.check_status_code(response)
예제 #2
0
 def _test_tree_node(self, node_to_test: TreeNode, test_node: TreeNode):
     self.assertEqual(node_to_test.get_name(), test_node.get_name())
     payload_to_test = node_to_test.get_payload()
     test_payload = test_node.get_payload()
     self.assertEqual(payload_to_test.id, test_payload.id)
     self.assertEqual(payload_to_test.type, test_payload.type)
     self.assertEqual(payload_to_test.updated_at, test_payload.updated_at)
     self.assertEqual(payload_to_test.created_at, test_payload.created_at)
     self.assertEqual(payload_to_test.path, test_payload.path)
예제 #3
0
def _compareFiles(client: TreeNode, server: TreeNode) -> list:

    client_files = _get_only_files(client._children)
    server_files = _get_only_files(server._children)

    update_files: list = []

    for cl_file in client_files:
        trovato = False
        for sr_file in server_files:
            if cl_file.get_name() == sr_file.get_name():
                if cl_file.get_updated_at() > sr_file.get_updated_at():
                    update_files.append({
                        "node": cl_file,
                        "id": server.get_payload().id,
                        "action": Actions.CLIENT_UPDATE_FILE
                    })
                elif sr_file.get_updated_at() > cl_file.get_updated_at():
                    update_files.append({
                        "node":
                        sr_file,
                        "path":
                        client.get_payload().path,
                        "snap_last_update":
                        cl_file.get_updated_at(),
                        "action":
                        Actions.SERVER_UPDATE_FILE
                    })
                trovato = True
                break
        if not trovato:
            # Il client ha un file che nel server non c'è
            update_files.append({
                "node": cl_file,
                "id": server.get_payload().id,
                "action": Actions.CLIENT_NEW_FILE
            })

    for sr_file in server_files:
        trovato = False
        for cl_file in client_files:
            if sr_file.get_name() == cl_file.get_name():
                trovato = True
        if not trovato:
            # Il server ha un file che nel client non c'è
            update_files.append({
                "node": sr_file,
                "path": client.get_payload().path,
                "action": Actions.SERVER_NEW_FILE
            })

    return update_files
예제 #4
0
def download_file(node: TreeNode, path_folder: str) -> Optional[dict]:
    node_id = node.get_payload().id
    if settings_model.is_id_in_sync_list(node_id):
        quota_libera = settings_model.get_quota_libera()
        return network_model.download_node(node, path_folder, quota_libera)
    else:
        return None
예제 #5
0
 def __init__(self, tree: TreeNode, override_name: str = None):
     self._name = tree.get_name(
     ) if override_name is None else override_name
     self._node = tree
     self._files = []
     self._dirs = []
     self._path = tree.get_payload().path
     self.update_list_of_content()
예제 #6
0
def compareFolders(client: TreeNode, server: TreeNode) -> list:
    update_files: list = []

    # Controllo prima SOLO i file
    update_files.extend(_compareFiles(client, server))

    client_folders = _get_only_folders(client._children)
    server_folders = _get_only_folders(server._children)

    for cl_folder in client_folders:
        trovato = False
        for sr_folder in server_folders:
            if cl_folder.get_name() == sr_folder.get_name():
                trovato = True
                update_files.extend(compareFolders(cl_folder, sr_folder))
        if not trovato:
            # Il client ha un cartella che nel server non c'è
            update_files.append({
                "node": cl_folder,
                "id": server.get_payload().id,
                "action": Actions.CLIENT_NEW_FOLDER
            })

    for sr_folder in server_folders:
        trovato = False
        for cl_folder in client_folders:
            if sr_folder.get_name() == cl_folder.get_name():
                trovato = True
        if not trovato:
            # Il server ha una cartella che nel client non c'è
            update_files.append({
                "node": sr_folder,
                "path": client.get_payload().path,
                "action": Actions.SERVER_NEW_FOLDER
            })
    return update_files
예제 #7
0
    def download_node(self, node: TreeNode, path_folder: str,
                      quota_libera: float) -> dict:
        remote_node = self.api_implementation.get_content_from_node(
            node.get_payload().id)
        file_size = remote_node["getNode"]["size"]

        # Se ho spazio procedo al download
        if quota_libera > file_size:
            result = self.api_implementation.download_node(node, path_folder)
            return {
                "node_name": node.get_name(),
                "result": result,
                "type": "network_error" if not result else ""
            }

        return {
            "node_name": node.get_name(),
            "result": False,
            "type": "space_error"
        }
예제 #8
0
    def download_node(self, node: TreeNode, path: str) -> bool:
        """Il TreeNode viene scaricato e salvato nel path, ritorna un bool a seconda dell'esito"""
        headers = {"cookie": self.cookie}
        payload = node.get_payload()
        url = f"{self.url_files}{self.get_user_id()}/{payload.id}"
        response = requests.get(url, headers=headers)

        if response.ok:
            path = os.path.join(path, payload.name)
            with open(path, "wb") as fh:
                fh.write(response.content)
            # Cambiare la data di creazione sembra non funzionare
            os.utime(path, (payload.created_at, payload.updated_at))
            self.logger.info(
                f"Download del file {payload.name}, completato con successo")
            return True
        else:
            self.logger.info(f"Download del file {payload.name}, fallito")
            # alzo le eccezioni del caso
            self.check_status_code(response)
            return False
예제 #9
0
 def __init__(self, node: TreeNode):
     super().__init__(node)
     self._path = node.get_payload().path
     self._size = SettingsModel.convert_size(
         os.stat(node.get_payload().path).st_size)
예제 #10
0
class TestTreeNode(unittest.TestCase):
    def setUp(self):
        """Metodo che viene chiamato prima di ogni metodo"""
        self.files: list[Node] = [
            Node("CLIENT_NODE", "Test", Type.File, 1000, 1022,
                 "root/file.txt"),
            Node("CLIENT_NODE", "Test2", Type.File, 1000, 1024,
                 "root/file2.txt"),
            Node("CLIENT_NODE", "Test3", Type.File, 1000, 1026,
                 "root/root2/file3.txt"),
        ]
        self.folders: list[Node] = [
            Node("CLIENT_NODE", "Test Folder", Type.Folder, 1000, 1022,
                 "root"),
            Node("CLIENT_NODE", "Test Folder2", Type.Folder, 1000, 1025,
                 "root/root2"),
        ]

        self.tree_node = TreeNode(self.folders[0])
        self.tree_node.add_node(TreeNode(self.files[0]))
        self.tree_node.add_node(TreeNode(self.files[1]))
        self.tree_node_sub = TreeNode(self.folders[1])
        self.tree_node_sub.add_node(TreeNode(self.files[2]))
        self.tree_node.add_node(self.tree_node_sub)

    def test_is_directory(self) -> None:
        self.assertTrue(self.tree_node.is_directory())
        self.assertFalse(self.tree_node._children[0].is_directory())
        self.assertFalse(self.tree_node._children[1].is_directory())
        self.assertTrue(self.tree_node._children[2].is_directory())
        self.assertFalse(
            self.tree_node._children[2]._children[0].is_directory())

    def test_get_name(self) -> None:
        tests = {
            "Test Folder": self.tree_node.get_name(),
            "Test": self.tree_node._children[0].get_name(),
            "Test2": self.tree_node._children[1].get_name(),
            "Test Folder2": self.tree_node._children[2].get_name(),
            "Test3": self.tree_node._children[2]._children[0].get_name()
        }
        for expected, values in tests.items():
            self.assertEqual(expected, values)

    def test_get_updated_at(self) -> None:
        self.assertEqual(1022, self.tree_node.get_updated_at())
        self.assertEqual(1022, self.tree_node._children[0].get_updated_at())
        self.assertEqual(1024, self.tree_node._children[1].get_updated_at())
        self.assertEqual(1025, self.tree_node._children[2].get_updated_at())
        self.assertEqual(
            1026, self.tree_node._children[2]._children[0].get_updated_at())

    def test_get_children(self) -> None:
        self.assertEqual(self.folders[0], self.tree_node.get_payload())
        self.assertEqual(self.files[0],
                         self.tree_node._children[0].get_payload())
        self.assertEqual(self.files[1],
                         self.tree_node._children[1].get_payload())
        self.assertEqual(self.folders[1],
                         self.tree_node._children[2].get_payload())
        self.assertEqual(
            self.files[2],
            self.tree_node._children[2]._children[0].get_payload())

    def test_get_payload(self) -> None:
        self.assertEqual(3, len(self.tree_node.get_children()))
        self.assertEqual(
            self.files[2],
            self.tree_node._children[2]._children[0].get_payload())

    def test_parent(self) -> None:
        self.assertEqual(self.tree_node, self.tree_node._children[0]._parent)
        self.assertEqual(self.tree_node, self.tree_node._children[1]._parent)
        self.assertEqual(self.tree_node, self.tree_node._children[2]._parent)
        self.assertEqual(self.tree_node._children[2],
                         self.tree_node._children[2]._children[0]._parent)

    def test_add_node_exception(self) -> None:
        root = TreeNode(self.files[0])
        with self.assertRaises(ValueError):
            root.add_node(TreeNode(self.files[1]))

    def test_str(self) -> None:
        res = ("Test Folder - Folder (1022 -> 01/01/1970 00:17:02)\n"
               " Test (1022 -> 01/01/1970 00:17:02)\n"
               " Test2 (1024 -> 01/01/1970 00:17:04)\n"
               " Test Folder2 - Folder (1025 -> 01/01/1970 00:17:05)\n"
               "  Test3 (1026 -> 01/01/1970 00:17:06)\n")
        self.assertEqual(res, str(self.tree_node))
예제 #11
0
 def __init__(self, node: TreeNode):
     self._name = node.get_name()
     self._creation_date = self._convert_int_to_date(
         node.get_payload().created_at)
     self._last_modified_date = self._convert_int_to_date(
         node.get_updated_at())
예제 #12
0
 def __init__(self, node: TreeNode):
     super().__init__(node)
     self.id = node.get_payload().id
     self.size = SettingsModel.convert_size(node.get_payload().size)
     self.last_editor = node.get_payload().last_editor