| 
8 | 8 | from aws_library.s3._constants import STREAM_READER_CHUNK_SIZE  | 
9 | 9 | from aws_library.s3._models import S3ObjectKey  | 
10 | 10 | from models_library.api_schemas_storage.storage_schemas import S3BucketName  | 
11 |  | -from models_library.projects import ProjectID  | 
 | 11 | +from models_library.projects import ProjectID, ProjectIDStr  | 
12 | 12 | from models_library.projects_nodes_io import (  | 
 | 13 | +    NodeIDStr,  | 
13 | 14 |     SimcoreS3DirectoryID,  | 
14 | 15 |     SimcoreS3FileID,  | 
15 | 16 |     StorageFileID,  | 
 | 
27 | 28 | from ..models import FileMetaData, FileMetaDataAtDB, GenericCursor, PathMetaData  | 
28 | 29 | from ..modules.db.access_layer import AccessLayerRepository  | 
29 | 30 | from ..modules.db.file_meta_data import FileMetaDataRepository, TotalChildren  | 
 | 31 | +from ..modules.db.projects import ProjectRepository  | 
30 | 32 | from .utils import convert_db_to_model  | 
31 | 33 | 
 
  | 
32 | 34 | 
 
  | 
@@ -165,17 +167,55 @@ def _base_path_parent(base_path: UserSelectionStr, s3_object: S3ObjectKey) -> st  | 
165 | 167 |     return f"{result}"  | 
166 | 168 | 
 
  | 
167 | 169 | 
 
  | 
 | 170 | +def _get_project_ids(user_selecton: set[UserSelectionStr]) -> list[ProjectID]:  | 
 | 171 | +    results = []  | 
 | 172 | +    for selected in user_selecton:  | 
 | 173 | +        project_id = ProjectID(Path(selected).parts[0])  | 
 | 174 | +        results.append(project_id)  | 
 | 175 | +    return results  | 
 | 176 | + | 
 | 177 | + | 
 | 178 | +def _replace_node_id_project_id_in_path(  | 
 | 179 | +    ids_names_map: dict[ProjectID, dict[ProjectIDStr | NodeIDStr, str]], path: str  | 
 | 180 | +) -> str:  | 
 | 181 | +    path_parts = Path(path).parts  | 
 | 182 | +    if len(path_parts) == 0:  | 
 | 183 | +        return path  | 
 | 184 | + | 
 | 185 | +    if len(path_parts) == 1:  | 
 | 186 | +        return ids_names_map[ProjectID(path)][path].replace("/", "_")  | 
 | 187 | + | 
 | 188 | +    project_id_str = path_parts[0]  | 
 | 189 | +    project_id = ProjectID(project_id_str)  | 
 | 190 | +    node_id_str = path_parts[1]  | 
 | 191 | +    return "/".join(  | 
 | 192 | +        (  | 
 | 193 | +            ids_names_map[project_id][project_id_str].replace("/", "_"),  | 
 | 194 | +            ids_names_map[project_id][node_id_str].replace("/", "_"),  | 
 | 195 | +            *path_parts[2:],  | 
 | 196 | +        )  | 
 | 197 | +    )  | 
 | 198 | + | 
 | 199 | + | 
168 | 200 | async def create_and_upload_export(  | 
169 | 201 |     s3_client: SimcoreS3API,  | 
 | 202 | +    project_repository: ProjectRepository,  | 
170 | 203 |     bucket: S3BucketName,  | 
171 | 204 |     *,  | 
172 | 205 |     source_object_keys: set[tuple[UserSelectionStr, StorageFileID]],  | 
173 | 206 |     destination_object_keys: StorageFileID,  | 
174 | 207 |     progress_bar: ProgressBarData,  | 
175 | 208 | ) -> None:  | 
 | 209 | +    ids_names_map = await project_repository.get_project_id_and_node_id_to_names_map(  | 
 | 210 | +        project_uuids=_get_project_ids(user_selecton={x[0] for x in source_object_keys})  | 
 | 211 | +    )  | 
 | 212 | + | 
176 | 213 |     archive_entries: ArchiveEntries = [  | 
177 | 214 |         (  | 
178 |  | -            _base_path_parent(selection, s3_object),  | 
 | 215 | +            _base_path_parent(  | 
 | 216 | +                _replace_node_id_project_id_in_path(ids_names_map, selection),  | 
 | 217 | +                _replace_node_id_project_id_in_path(ids_names_map, s3_object),  | 
 | 218 | +            ),  | 
179 | 219 |             await s3_client.get_bytes_streamer_from_object(bucket, s3_object),  | 
180 | 220 |         )  | 
181 | 221 |         for (selection, s3_object) in source_object_keys  | 
 | 
0 commit comments