view scripts/api/py_api_wrapper/api_fun.py @ 11:08c950a22cee

new: add getAllDataverseAlias api for LGServices
author Zoe Hong <zhong@mpiwg-berlin.mpg.de>
date Wed, 09 Sep 2015 17:13:18 +0200
parents a50cf11e5178
children
line wrap: on
line source

import os, sys
import time
import json
from dataverse_api_link import DataverseAPILink

def msg(s): print s
def dashes(char='-'): msg(40*char)
def msgt(s): dashes(); msg(s); dashes()
def msgx(s): dashes('\/'); msg(s); dashes('\/'); sys.exit(0)

def get_dataverse_link_object(apikey='pete'):
    server_with_api = 'http://localhost:8080/'
    #server_with_api = 'https://dvn-build.hmdc.harvard.edu'
    return DataverseAPILink(server_with_api, use_https=False, apikey=apikey)

def check_dv():    
    dat = get_dataverse_link_object()
    dat.save_current_metadata('local-data')

    #add_and_publish_dataverses('local-data/dataverses_2014-0612_11.json','pete')
    add_and_publish_dataverses('demo-data/dataverses_2014-0609_16.json','pete')

def load_users_from_api_file(fname):
    """
    Given the JSON results of the list users command (/api/builtin-users):
        (a) Iterate through the list
        (b) Check if a user exists (by id)
        (c) If the user is not found, create the user
        
    :param fname: full path to a file with user info in JSON format
    """
    if not os.path.isfile(fname):
        msgx('File not found: %s' % fname)
        
    # Load the JSON file
    user_dict = json.loads(open(fname,'r').read())

    # Get a the DataverseAPILink object
    dv_lnk_obj = get_dataverse_link_object('pete')
    dv_lnk_obj.set_return_mode_python()
    
    # Iterate through json
    for user_info in user_dict.get('data', []):
        # check if user exists via api
        current_user_info = dv_lnk_obj.get_user_data(user_info.get('id', None))
        if current_user_info and current_user_info.get('status') == 'OK': 
            continue    # The user exist, loop to the next user

        user_info.pop('id')     # Use the param, except for the 'id'
        
        # Create the user, passing user params and a password
        #
        
        new_password = user_info.get('userName')
        dv_lnk_obj.create_user(user_info, new_password)
        
def add_and_publish_dataverses(fname, apikey):
    if not os.path.isfile(fname):
        msgx('File not found: %s' % fname)

    # Load the JSON file
    dv_dict = json.loads(open(fname,'r').read())

    # Get a the DataverseAPILink object
    dv_lnk_obj = get_dataverse_link_object(apikey)
    dv_lnk_obj.set_return_mode_python()

    # Iterate through json
    previous_alias = "root"
    for dv_info in dv_dict.get('data', []):
        # check if user exists via api
        current_dv_info = dv_lnk_obj.get_dataverse_by_id_or_alias(dv_info.get('id', None))
        
        # DV exists, continue loop
        if current_dv_info and current_dv_info.get('status') == 'OK': 
            msg('>>> FOUND IT')
            previous_alias = current_dv_info['data']['alias']
            continue    # The user exist, loop to the next user
            
        # No DV, create it
        keys_not_needed = ['id', 'ownerID', 'creationDate', 'creator']
        for key in keys_not_needed:
            if dv_info.has_key(key):
                dv_info.pop(key)
        
        msg('params to send: %s' % dv_info)
        # If created,  publish it
        json_resp = dv_lnk_obj.create_dataverse(previous_alias, dv_info)
        if json_resp.get('status') == 'OK': 
            new_dv_data = json_resp.get('data', {})
            new_id = new_dv_data.get('id', None)
            if new_id is not None:
                dv_lnk_obj.publish_dataverse(new_id)
        previous_alias = current_dv_info.get("alias", "root")
        #break
            
def add_dataverses(name, cnt=1, parent_dv_name_or_id=1, apikey='snoopy'):
    # get the DataverseAPILink
     dat = get_dataverse_link_object(apikey=apikey)
     dat.set_return_mode_python()
     
     for x in range(249, 260):      
         dat.publish_dataverse(x)
     return
     for x in range(0, cnt):        
        num  = x+1
        alias_str = "new_dv_%d" % num
        dv_params_str = """{ "alias":"%s",
                    "name":"%s %s",
                    "affiliation":"Affiliation value",
                    "contactEmail":"pete@malinator.com",
                    "permissionRoot":true,
                    "description":"More API testing"
                    }""" % (alias_str, name, num)
    
        dv_params = json.loads(dv_params_str)
        dat.create_dataverse(parent_dv_name_or_id, dv_params, )
        if x % 20 == 0: time.sleep(1)


def delete_dataverses_id_greather_than(id_num, apikey):
     if not type(id_num) == int:
         raise('id_num needs be an int--not a %s' % type(id_num))

     # get the DataverseAPILink
     dat = get_dataverse_link_object(apikey=apikey)
     dat.set_return_mode_python()
     
     # List the dataverses
     dv_json = dat.list_dataverses()
     print dv_json
     # Pull dataverse ids > 30
     dv_ids = [dv['id'] for dv in dv_json.get("data") if dv['id'] > id_num]

     # reverse order ids
     dv_ids.sort()
     dv_ids.reverse()

     # delete them
     for dv_id in dv_ids:
         print dat.delete_dataverse_by_id(dv_id)
     #print dat.list_datasets()
     
if __name__ == '__main__':
    check_dv()
    #load_users_from_api_file('demo-data/users_2014-0609_14.json')
    #load_users_from_api_file('demo-data/rp_users.json')
    #add_and_publish_dataverses('demo-data/dataverses_2014-0609_14.json', 'gromit')
    #add_and_publish_dataverses('demo-data/rp_dataverses.json', 'gromit')
    
    #add_dataverses('Other DV #', 17, 23, 'snoopy')
    #add_dataverses('Uma\'s Other Retricted DVs #', 7, 8, 'pete')
    #delete_dataverses_id_greather_than(177, 'pete')