Skip to content
Snippets Groups Projects
nakala.py 3.69 KiB
Newer Older
Maxence Larrieu's avatar
Maxence Larrieu committed
# Récupérer les DOIs de l'UGA présents dans Nakala
## 2023-11-29, Maxence Larrieu

"""
# Particularités
- pas de données d'affiliations, on passe directement par les comptes des déposants qui nous ont été fournis par l'équipe HumaNum
- réponse de l'API dans la navigateur en XML et via requets en json

## Process
- charger les userid
- itérer sur tous les userid
- récupérer les DOIs de tous leurs dépôts
- exlure les actions de création de collection
- extra : recherche aussi de nouveau utilisateurs par l'intémédiaire des droits des dépôts effectués

## question sur le périmètre
- périmètre : est-ce qu'on inclut des personnels comme Thomas Leduc (univ. nantes) mais membre AAU ?
"""

def get_dois_n_users(user_id): 
    """
    attention logique d'utilisateurs (=compte nakala), pas d'auteur
    extrait les DOIs déposées par un user dans Nakala (les collections sont exclues)
    user_network : ressortir des userId avec qui les déposant ont partagés des droits de modif. sur leurs dépôts
    """
    
    buffer_dois = []
    other_users = []
    url_req = "https://api.nakala.fr/search?order=relevance&page=1&size=25&fq=depositor="
    req = requests.get(url_req + user_id)

    ## filtre si la requete n'aboutie pas
    if req.status_code != 200 : 
        return{
            "continue" : False,
            "content" : r,
            "other_users" : False
        }
        
    res = req.json()
    
    # iterer sur tous les résultats
    for item in res["datas"] : 
        ## exclure les collections, qui ne contiennes pas d'élement "files" 
        if not item.get("files") : 
            continue
            
        # récupérer le DOI
        buffer_dois.append( item.get("identifier") )

        # rechercher d'autres userId
        if item.get("rights") :
            ## pour toutes les personnes à qui on a ajouté des droits
            for person in item["rights"] :
                
                ## récupérer leurs userid
                person_userid = person.get("username")
                
                ## si on trouve un autre utilisateurs
                if person_userid and person_userid not in nakala_uga_users and person_userid not in other_users : 
                    other_users.append( person_userid )

    return{
        "continue" : True,
        "content" : buffer_dois,
        "other_users" : other_users
    }

import json, requests

Maxence Larrieu's avatar
Maxence Larrieu committed
print("\n\nRunning nakala.py")


Maxence Larrieu's avatar
Maxence Larrieu committed
## list to stock datas
nakala_uga_users = []
all_dois = []
other_user_finded = []

Maxence Larrieu's avatar
Maxence Larrieu committed
## load nakala users from txt file
with open('nakala-uga-users.txt', 'r') as f:
Maxence Larrieu's avatar
Maxence Larrieu committed
    ## attention bien stripper quand on import du txt sinon les sauts de ligne sont présents
    [nakala_uga_users.append( user.strip() ) for user in f.readlines()]

Maxence Larrieu's avatar
Maxence Larrieu committed
print("\tnb nakala users loaded", len(nakala_uga_users))
Maxence Larrieu's avatar
Maxence Larrieu committed

# ____n____ iterer sur les users uga
for user in nakala_uga_users : 

    ## rechercher les jeux de données
    res = get_dois_n_users(user)
    
    if res["continue"] :
Maxence Larrieu's avatar
Maxence Larrieu committed
        #print(f"{user}\n\tnb DOI {len(res['content'])}" )
Maxence Larrieu's avatar
Maxence Larrieu committed
        
        ## ajouter les DOIs trouvés
        if len(res["content"]) > 0 : 
            all_dois += res["content"]
        
        ## ajouter les personnes
        if len(res["other_users"]) >  0 : 
            #print(f"\nnew person {','.join(res['other_users'])}")
            other_user_finded += [x for x in res["other_users"] ]

Maxence Larrieu's avatar
Maxence Larrieu committed
print(f"\tnb dois finded\t\t{len(all_dois)}")

Maxence Larrieu's avatar
Maxence Larrieu committed

## ____n____ exporter les DOI au format txt

with open("nakala-dois.txt", 'w') as fh :
Maxence Larrieu's avatar
Maxence Larrieu committed
    [fh.write(f"{line}\n") for line in all_dois]

## print les autres utilisateurs trouvés
if other_user_finded : 
Maxence Larrieu's avatar
Maxence Larrieu committed
    print("\n\n\tnakala new user finded ")
    for elem in other_user_finded : 
Maxence Larrieu's avatar
Maxence Larrieu committed
        print(f"\t\t\t{elem}")