# Récupérer les DOIs de l'UGA depuis Rechrche Data Gouv
## 2023-12-01, Elias Chetouane

"""
## todo
/

## Documentation
* Noms des champs à requêter : https://entrepot.recherche.data.gouv.fr/api/metadatablocks/citation
* Doc API Dataverse : https://guides.dataverse.org/en/5.12.1/api/search.html

## Remarques
- Problème : certaines affiliations renseignent la ville, mais le labo n'est pas affilié à l'UGA. Cela les fait apparaitre alors qu'il ne faudrait pas les prendre en compte...
- Obligation de cherche Greoble et UGA car champ libre, donc parfois l'affiliation à l'UGA est renseignée par UGA et parfois Univ Greoble Alpes
- Adapter une fois mise en place du ROR
"""

import requests

# requetes de base sur chaque champ qui nous intéresse : affiliation du contact, auteurs, producteur et contributeurs
# dans chaque champ, recherche "UGA" ou "Grenoble"
urls = [
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=datasetContactAffiliation%3AUGA',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=authorAffiliation%3AUGA',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=producerAffiliation%3AUGA',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=contributorAffiliation%3AUGA',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=datasetContactAffiliation%3AGrenoble',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=authorAffiliation%3AGrenoble',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=producerAffiliation%3AGrenoble',
    'https://entrepot.recherche.data.gouv.fr/api/search?q=*&fq=contributorAffiliation%3AGrenoble'
    # possiblilité d'ajouter d'autres requêtes
]

# on définit une fonction pour la lancer la requete avec chaque url pour les différentes affiliations
def get_results(url):
    req = requests.get(url)
    results = [req.json()]
    
    # obtenir les résultats de chaque page dans la liste results
    nb_res = results[0]["data"]["count_in_response"]
    count = nb_res
    page = 1
    while(nb_res > 0):
        newurl = url+"&start="+str(count)
        req = requests.get(newurl)
        results.append(req.json())
        nb_res = results[page]["data"]["count_in_response"]
        count += nb_res
        page += 1
    return results

# on crée une fonction pour ajouter les DOIs dans une liste

def get_dois(results):
    dois = []
    nb_dois = 0

    # prendre en compte les résultats de chaque page
    for res in results:
        num_dois = res["data"]["items"]
        nb_dois += len(num_dois)

        for item in num_dois :
            dois.append(item["global_id"])
        
    print("Nombre de résultats trouvés : " + str(nb_dois))
    return dois

# on récupère les dois

dois = []

for url in urls:
    dois += get_dois(get_results(url))

# on supprime les doublons

unique_dois = list(set(dois))

print("Nombre de dois différents trouvés : " + str(len(unique_dois)))

# exporter la liste de DOI au format txt

with open("rdg-dois.txt", 'w') as f :
    [f.write(f"{line[4:]}\n") for line in unique_dois] # [4:] pour retirer "doi:" au début de chaque ligne