From 382fb1a953dd63ccf32338cf46423f3738862d1e Mon Sep 17 00:00:00 2001 From: Ba Thien LE Date: Wed, 3 Sep 2025 13:03:51 +0200 Subject: [PATCH 1/2] feat: add import example --- examples/import_datasets.py | 48 +++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 examples/import_datasets.py diff --git a/examples/import_datasets.py b/examples/import_datasets.py new file mode 100644 index 0000000..e4ea1bd --- /dev/null +++ b/examples/import_datasets.py @@ -0,0 +1,48 @@ +"""Example to import datasets into Cytomine.""" + +import logging +import sys +from argparse import ArgumentParser + +from cytomine import Cytomine +from cytomine.models import StorageCollection + +logging.basicConfig() +logger = logging.getLogger("cytomine.client") +logger.setLevel(logging.INFO) + + +if __name__ == "__main__": + parser = ArgumentParser(description="Example to import datasets into Cytomine") + + parser.add_argument( + "--host", + default="demo.cytomine.be", + help="The Cytomine host", + ) + parser.add_argument( + "--public_key", + help="The Cytomine public key", + ) + parser.add_argument( + "--private_key", + help="The Cytomine private key", + ) + params, _ = parser.parse_known_args(sys.argv[1:]) + + with Cytomine( + host=params.host, + public_key=params.public_key, + private_key=params.private_key, + ) as cytomine: + # To import the datasets, we need to know the ID of your Cytomine storage. + storages = StorageCollection().fetch() + storage = next( + filter(lambda storage: storage.user == cytomine.current_user.id, storages) + ) + if not storage: + raise ValueError("Storage not found") + + response = cytomine.import_datasets(storage.id) + + print(response) From 6027bfe027180aa7d74dcdbf5ead4062c33456f5 Mon Sep 17 00:00:00 2001 From: Ba Thien LE Date: Wed, 3 Sep 2025 13:25:42 +0200 Subject: [PATCH 2/2] feat: add import function --- cytomine/cytomine.py | 33 +++++++++++++++++++++++++++++++++ examples/import_datasets.py | 5 ++++- 2 files changed, 37 insertions(+), 1 deletion(-) diff --git a/cytomine/cytomine.py b/cytomine/cytomine.py index 3dd2094..fe674e7 100644 --- a/cytomine/cytomine.py +++ b/cytomine/cytomine.py @@ -977,3 +977,36 @@ def _process_upload_response(self, response_data: Dict[str, Any]) -> "UploadedFi uf.images.append(data) # type: ignore return uf + + def import_datasets( + self, + storage_id: int, + dataset_names: Optional[str] = None, + create_project: bool = False, + ) -> Dict[str, str]: + """Import datasets from a given path.""" + + upload_host = self._base_url(with_base_path=False) + + response = self._session.post( + f"{upload_host}/import", + auth=CytomineAuth( + self._public_key, + self._private_key, + upload_host, + "", + ), + headers=self._headers(content_type="text/plain"), + params={ + "storage_id": storage_id, + "dataset_names": dataset_names, + "create_project": create_project, + }, + ) + + if response.status_code != requests.codes.ok: + self._logger.error("Error during datasets upload: %s", response.text) + return {} + + self._logger.info("Datasets uploaded successfully") + return response.json() diff --git a/examples/import_datasets.py b/examples/import_datasets.py index e4ea1bd..cb591fb 100644 --- a/examples/import_datasets.py +++ b/examples/import_datasets.py @@ -43,6 +43,9 @@ if not storage: raise ValueError("Storage not found") - response = cytomine.import_datasets(storage.id) + response = cytomine.import_datasets( + storage.id, + create_project=True, # Create a project based on folder name + ) print(response)