You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
3.3 KiB
89 lines
3.3 KiB
3 years ago
|
import csv, requests, time, logging
|
||
|
|
||
|
def write_csv_from_list(cID, wrapper_list):
|
||
|
# takes ID and csv wrapper to write file with ID name
|
||
|
# need to use different paths, can add in folder structure to cID field
|
||
|
with open('./%s' % cID, 'w', encoding='utf-8') as f:
|
||
|
csv.writer(f).writerows(wrapper_list)
|
||
|
|
||
|
def read_csv_to_list_wrapper(path):
|
||
|
wrapper = []
|
||
|
with open(path, 'r', encoding='utf-8') as f:
|
||
|
csv_reader = csv.reader(f)
|
||
|
for row in csv_reader:
|
||
|
if row == []:
|
||
|
# handling for blank rows, which exist for some reason?
|
||
|
pass
|
||
|
else:
|
||
|
wrapper.append(row)
|
||
|
return wrapper
|
||
|
|
||
|
def add_ishare_to_wrapper(alma_wrapper):
|
||
|
call_heading = 'Permanent Call Number'
|
||
|
alma_wrapper[0].append('# in IShare')
|
||
|
total_entries = len(alma_wrapper) - 1
|
||
|
logname = 'primo_query.log'
|
||
|
|
||
|
logging.basicConfig(filename=logname,
|
||
|
filemode='a',
|
||
|
format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s',
|
||
|
datefmt='%H:%M:%S',
|
||
|
level=logging.DEBUG)
|
||
|
|
||
|
logging.info('Primo_http_errors')
|
||
|
|
||
|
# this isn't actually as bad as it looks
|
||
|
for index, column_heading in enumerate(alma_wrapper[0]):
|
||
|
if (column_heading == call_heading):
|
||
|
for row_index, row in enumerate(alma_wrapper[1:]):
|
||
|
time.sleep(15/10)
|
||
|
primo_results = primo_api(row[index])
|
||
|
if (primo_results.status_code == 200):
|
||
|
row.append(how_many_ishare(primo_results.json()))
|
||
|
else:
|
||
|
logging.error('something died at ' + row[index])
|
||
|
logging.error(primo_results.status_code)
|
||
|
logging.error(primo_results.text)
|
||
|
print('something died at ' + row[index])
|
||
|
print(primo_results.status_code)
|
||
|
print(primo_results.text)
|
||
|
continue
|
||
|
print('almost there!: ' + str(row_index + 1) + '/' + str(total_entries))
|
||
|
break
|
||
|
|
||
|
def how_many_ishare(primo_results):
|
||
|
for c in primo_results['facets']:
|
||
|
if (c['name'] == 'institution'):
|
||
|
return len(c['values'])
|
||
|
|
||
|
def is_available_ishare(call_number):
|
||
|
# returns 1 if available in IShare, 0 if not
|
||
|
primo_results = primo_api(call_number).json()
|
||
|
if (not primo_results['docs'][0]['delivery']['almaInstitutionsList']):
|
||
|
return 0
|
||
|
else:
|
||
|
return 1
|
||
|
|
||
|
def inst_code(primo_results):
|
||
|
return primo_results['docs'][0]['delivery']['almaInstitutionsList'][0]['instCode']
|
||
|
|
||
|
def availability_status(primo_results):
|
||
|
return primo_results['docs'][0]['delivery']['almaInstitutionsList'][0]['availabilityStatus']
|
||
|
|
||
|
def primo_api(query):
|
||
|
# takes primo query term and searches all ishare institutions, returns response. seems to work well using call number field
|
||
|
|
||
|
api_key = <api_key>
|
||
|
url = 'https://api-na.hosted.exlibrisgroup.com/primo/v1/pnxs?vid=01CARLI_UIS:CARLI_UIS&tab=NewDiscoveryNetwork&scope=NewDiscoveryNetwork&q=any,contains,'
|
||
|
assembled = url + query + api_key
|
||
|
response = requests.get(assembled)
|
||
|
return response
|
||
|
|
||
|
if __name__ == "__main__":
|
||
|
alma_wrapper = read_csv_to_list_wrapper('./test_csv.csv')
|
||
|
|
||
|
add_ishare_to_wrapper(alma_wrapper)
|
||
|
|
||
|
write_csv_from_list('api_list_ishare.csv', alma_wrapper)
|
||
|
|