diff --git a/dorel_export_v_0.1/get_batch_dataset_metadata_with_subcollections.py b/dorel_export_v_0.1/get_batch_dataset_metadata_with_subcollections.py new file mode 100644 index 0000000000000000000000000000000000000000..5c3ac9a088e2b5319f106cc95b37cc5be389e0d5 --- /dev/null +++ b/dorel_export_v_0.1/get_batch_dataset_metadata_with_subcollections.py @@ -0,0 +1,201 @@ +# =================================================================================== +# Export des métadonnées de l'ensemble des jeux de données d'une collection Dataverse +# (incluant les sous-collections jusqu'à 4 niveaux) +# =================================================================================== + + +print ("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n") +print ("# ===========================================================================#") +print ("# Export des métadonnées de l'ensemble des jeux de #") +print ("# données d'une collection Dataverse #") +print ("# (incluant les sous-collections jusqu'à 4 niveaux) #") +print ("# ===========================================================================#") + + +# !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +# !!!!!!!!! TODO !!!!!!!!!!!!!!!!! +# - Version parallèle à réaliser acceptant les paramètres d'entrepôt et de collection comme arguments d'une commande en ligne. + +# ----------------------- +# Imports et déclarations +# ----------------------- + +import json +import os +from pyDataverse.api import NativeApi, DataAccessApi +from pyDataverse.models import Dataverse + +# ---------------------------------------------------- +# Déclaration de l'entrepôt Dataverse (URL et clé API) +# ---------------------------------------------------- + +repositories = { + "1. Entrepôt CODR" : "https://tested-dataverse5.univ-lorraine.fr" , + "2. Entrepôt bac à sable" : "https://bac-dataverse.univ-lorraine.fr" , + "3. DOREL / production" : "https://dorel.univ-lorraine.fr", + "4. Démo Dataverse" : "https://demo.dataverse.org" +} + +print ("Depuis quel entrepôt voulez-vous effectuer cet export ? ") +for repository_name, repository_URL in repositories.items(): + print (f"\t{repository_name} : {repository_URL})") +choice_repository = 0 +while choice_repository not in ("1", "2", "3", "4"): + choice_repository = input ("Effectuez votre choix : ") + for repository_name, repository_URL in repositories.items(): + if choice_repository == repository_name [0]: + base_url = repository_URL + break +print (f"Adresse de l'entrepôt : {base_url}") + +api_key = input ("Entrez ici votre clé API (facultatif pour l'export de métadonnées) : ") + +api = NativeApi(base_url,api_key) +data_api = DataAccessApi(base_url,api_key) + +# Test de renvoi de version et de code http +print("Test de renvoi de version et de code http...") +resp = api.get_info_version() +print (resp.json()) +print (resp.status_code) +print (resp) + +# Entrée de la collection à exporter +dataverse_root = input ("Entrez ici le nom de la collection dataverse à exporter (défaut : univ-lorraine) : ") +if dataverse_root != "": + dataverse_root = dataverse_root +elif dataverse_root == "": + dataverse_root = "univ-lorraine" + +# --------------------------------------------------------------- +# Création d'une liste des identifiants de collections dataverses +# --------------------------------------------------------------- + +# détermination de la liste des collections et sous-collections +# la hiérarchie des listes de collections est : dataverse_list > dataverse_children_level_2 > dataverse_children_level_3 > ... +# la hiérarchie des noms de collections est : dataverse entry > dataverse_child_level_2 > dataverse_child_level_3 > ... +# TODO : revoir ça plus élégamment avec des fonctions... + +print ("\nÉnumération des sous-collections...") +dataverse_list = api.get_children(dataverse_root, children_types = ["dataverses"]) +dataverse_list = json.dumps(dataverse_list) # dump de la sortie json générée précédemment +dataverse_list = json.loads(dataverse_list) # Conversion en dictionnaire de la liste des datasets +dataverse_id_list = [] +dataverse_alias_list = [] +for dataverse_entry in dataverse_list : # on prend chaque entrée (dictionnaire) de la liste + dataverse_alias = dataverse_entry["dataverse_alias"] # on récupère l'alias du dataverse (ex. "lmops") + dataverse_id = dataverse_entry["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "9231") + print (f"{dataverse_alias} : {dataverse_id}") + dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste + dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste + dataverse_children_level_2 = dataverse_entry["children"] # Le contenu des "children" des est stocké dans une liste + if dataverse_children_level_2 != "": +# Traitement des sous-dataverses de niveau 2 (children_level_2) + for dataverse_child_level_2 in dataverse_children_level_2: + dataverse_alias = dataverse_child_level_2["dataverse_alias"] # on récupère l'alias du dataverse enfant (ex. "sous-plateforme_spectro") + dataverse_id = dataverse_child_level_2["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "12345") + print (f"{dataverse_alias} : {dataverse_id} (est un enfant de : {dataverse_entry['dataverse_alias']}\n") + dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste + dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste + dataverse_children_level_3 = dataverse_child_level_2["children"] # Le contenu des "children" est stocké dans une liste + if dataverse_children_level_3 != "": + # Traitement des sous-dataverses de niveau 3 (children_level_3) + for dataverse_child_level_3 in dataverse_children_level_3: + dataverse_alias = dataverse_child_level_3["dataverse_alias"] # on récupère l'alias du dataverse enfant (ex. "sous-sous-plateforme_spectro") + dataverse_id = dataverse_child_level_3["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "12345") + print (f"{dataverse_alias} : {dataverse_id} (est un enfant de : {dataverse_child_level_2['dataverse_alias']}\n") + dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste + dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste + dataverse_children_level_4 = dataverse_child_level_3["children"] # Le contenu des "children" des est stocké dans une liste + if dataverse_children_level_4 != "" : + # Traitement des sous-dataverses de niveau 4 (children_level_3) + for dataverse_child_level_4 in dataverse_children_level_4: + dataverse_alias = dataverse_child_level_4["dataverse_alias"] # on récupère l'alias du dataverse enfant (ex. "sous-sous-sous-plateforme_spectro") + dataverse_id = dataverse_child_level_4["dataverse_id"] # on récupère l'identifiant du dataverse (ex. "12345") + print (f"{dataverse_alias} : {dataverse_id} (est un enfant de : {dataverse_child_level_3['dataverse_alias']}\n") + dataverse_alias_list.append(dataverse_alias) # on ajoute l'alias à la liste + dataverse_id_list.append(dataverse_id) # on ajoute l'id à la liste +print (dataverse_alias_list) + +# formattage et sortie JSON de la liste des sous-collections dataverses sous la collection à exporter + +# formatted_dataverse_list = json.dumps(dataverse_list, sort_keys=False, indent=8) +# formatted_dataverse_list_output_file = input ("Entrez un nom de fichier pour la sortie JSON de la liste des dataverses : \n") +# with open (formatted_dataverse_list_output_file, 'w') as formatted_dataverse_list_output_file_object: +# formatted_dataverse_list_output_file_object.write(formatted_dataverse_list) + +# ---------------------------- +# Création d'une liste des DOI +# ---------------------------- +print ("\nRécupération des DOI...") +pid_list=[] +for dataverse_alias_for_export in dataverse_alias_list: + dataset_list = api.get_children(dataverse_alias_for_export, children_types = ["datasets"]) + print (dataset_list) + dataset_list = json.dumps(dataset_list) # dump de la sortie json générée précédemment + dataset_list = json.loads(dataset_list) # Conversion en dictionnaire de la liste des datasets + for dataset_entry in dataset_list: # on prend chaque entrée (dictionnaire) de la liste + dataset_pid = dataset_entry["pid"] # on récupère le pid dans le dictionnaire dataset_entry + print (dataset_pid) + dataset_pid_truncated = dataset_pid[4:] # suppression des quatres premiers caractères (doi:) de la chaîne + # print (dataset_pid) + pid_list.append(dataset_pid_truncated) # on ajoute ce résultat à la liste pid_list +# print (pid_list) +print ("Liste des DOI :") +for pid in pid_list: + print (pid) +print (f" {len(pid_list)} jeu(x) de données trouvé(s). ") +print (pid_list) + +# -------------------------------------------------------------------------------------------- +# Génération des sorties JSON de chaque dataset et écriture optionnelle d'un fichier de sortie +# -------------------------------------------------------------------------------------------- + + +# file_wished_input = input("Souhaitez-vous exporter au format JSON o/n ? (défaut n) ") # Décommenter cette ligne pour rendre l'écriture optionnelle. +file_wished_input = "o" # Commenter cette ligne pour rendre l'écriture optionnelle. +if file_wished_input == "o": + file_wished = True + print("Un fichier va être créé.") + complete_list_file_name_input = input("Choisissez un nom de fichier pour la sortie, sans l'extension. Défaut [export_json]: ") + if complete_list_file_name_input == "": + complete_list_file_name = "export_json.json" + else : + complete_list_file_name = f"{complete_list_file_name_input}.json" + with open (complete_list_file_name, 'a') as complete_list_file_object: + complete_list_file_object.write("{") # ajout d'une accolade ouvrante au début du fichier +elif file_wished_input == "": + file_wished = False + print("Pas de fichier.") +complete_list = [] +counter = len(pid_list) +for pid in pid_list: + counter = counter - 1 + dataset_json = api.get_dataset(identifier = f"doi:{pid}").json()["data"] # export de la référence correspondant à 'pid' + del (dataset_json["latestVersion"]["files"]) # suppression des métadonnées de fichiers + complete_list.append(dataset_json) # ajout de la sortie json à une liste + + # Ecriture du fichier si l'utilisateur le souhaite + if file_wished == True: + print("Écriture du fichier JSON en cours...") + formatted_dataset_json = json.dumps(dataset_json, sort_keys=False, indent=4) + formatted_dataset_json_string = str (formatted_dataset_json) # Conversion en chaîne de caractères + # formatted_dataset_json_string = f'"doi" : "{pid}" , "citation" : [{formatted_dataset_json_string}] ,' + if counter > 0 : # Si c'est la dernière référence on ne met pas de virgule pour que le fichier JSON soit valide. + formatted_dataset_json_string = f'"{pid}" : [{formatted_dataset_json_string}] ,' + elif counter == 0 : + formatted_dataset_json_string = f'"{pid}" : [{formatted_dataset_json_string}] ' + + with open (complete_list_file_name, 'a') as complete_list_file_object: + complete_list_file_object.write(formatted_dataset_json_string) # ecriture de la référence formattée dans le fichier de sortie + complete_list_file_object.write("\n") + +if file_wished == True : + with open (complete_list_file_name, 'a') as complete_list_file_object: # correction en mode bourrin du fichier de sortie + complete_list_file_object.write("}") # ajout d'une accolade fermante à la fin du fichier + + +# # Optionnellement, affichage de la liste complète finale (pour débogage) +# print_complete_list = input ("Voulez-vous voir la liste complète o/n ? (défaut n) ") +# if print_complete_list == "o": +# print (complete_list)