Skip to main content
ExLibris

Knowledge Assistant

BETA
 
  • Subscribe by RSS
  • Back
    Alma

     

    Ex Libris Knowledge Center
    1. Search site
      Go back to previous article
      1. Sign in
        • Sign in
        • Forgot password
    1. Home
    2. Alma
    3. Community Knowledge
    4. Python script to change missing UNIV items to the UNIV XM location, as determined by an Alma Analytics report

    Python script to change missing UNIV items to the UNIV XM location, as determined by an Alma Analytics report

    1. Last updated
    2. Save as PDF
    3. Share
      1. Share
      2. Tweet
      3. Share
    No headers
    Created By: Lisa Hamlett
    Created on: 6/3/2019



    #!/opt/rh/python27/root/usr/bin/python
    """
       This script changes missing UNIV items to the UNIV XM location, as determined by an Alma Analytics report
    """
    __author__= 'Lisa Hamlett'
    __date__ = 'May 2019'

    import sys
    import requests
    import xml.etree.ElementTree as ET
    import time

    # DEFINE SECONDARY FUNCTIONS FOR USE BY MAIN FUNCTION

    ## GET ANALYTICS REPORT
    def get_analytics_report(analytics_url,path,analytics_apikey):
      payload = {'path':path, 'apikey':analytics_apikey}
      r = requests.get(analytics_url,params=payload)
      response = r.content
      url = r.url
      return response,url

    ## GET BARCODES FROM ANALYTICS REPORT
    def get_barcodes(xml):
      xml = xml.replace("\n", "")
      xml = xml.replace(' xmlns="urn:schemas-microsoft-com:xml-analysis:rowset"', "")
      tree = ET.fromstring(xml)

      barcode = ""
      parsed_xml = []
      rowset = tree.find("QueryResult/ResultXml/rowset")
      rows = rowset.findall("Row")
      if rows != None:
        for row in rows:
          barcode = row.find("Column1")
          barcode = str(barcode.text)
          parsed_xml.append(barcode)
      return parsed_xml

    ## USE CONTENT FROM API CALL TO COLLECT SETIDs
    def get_setid_from_content(xml):
      xml = xml.replace("\n", "")
      tree = ET.fromstring(xml)

      setid = ""
      parsed_xml = []
      try:
        setid = tree.find("id")
        setid = str(setid.text)
      except:
        sys.stderr.write("Could not find set id"+"\n")
      return setid

    ## CREATE A SET
    def create_set(alma_api_url,alma_apikey,xml):
      headers = {'Content-Type':'application/xml'}
      payload = {'apikey':alma_apikey}
      r = requests.post(alma_api_url,headers=headers,params=payload,data=xml)
      response = r.content
      return response

    ## ADD MEMBERS TO SET
    def add_members_to_set(alma_api_url,alma_apikey,xml):
      headers = {'Content-Type':'application/xml'}
      payload = {'id_type':"BARCODE",'op':"add_members",'apikey':alma_apikey}
      try:
        r = requests.post(alma_api_url,headers=headers,params=payload,data=xml)
        response2 = r.content
      except:
        sys.stderr.write("Could not define add members to set"+"\n")
      return response2

    ## PREPARE JOB XML
    def prepare_job_xml(setids,xml):
      xml = xml.replace("\n", "")
      xml = xml.replace("{set_id}", setids)
      return xml

    ## RUN JOB
    def job(alma_job_url,alma_apikey,xml):
      headers = {'Content-Type':'application/xml'}
      payload = {'op':"run",'apikey':alma_apikey}
      r = requests.post(alma_job_url,headers=headers,params=payload,data=xml)
      response3 = r.content
      return response3

    ## DELETE SET
    def delete_set(alma_api_url,alma_apikey):
      payload = {'apikey':alma_apikey}
      try:
        r = requests.delete(alma_api_url,params=payload)
        delresponse = r.content
      except:
        sys.stderr.write("Could not place API call to delete set"+"\n")
      return delresponse

    # DEFINE MAIN FUNCTION
    def main():

    ## OPEN CONFIGURATION FILE AND FOR EACH LINE IN THE CONFIGURATION FILE, STRIP OUT NEW LINE VALUES, SPLIT LINES AT EQUAL SIGN, AND ASSIGN VALUES FROM ARRAY TO VARIABLE
      configurations = ("job_keys_UNIV_MI_to_XM.cfg")
      configfile = open(configurations, "r")

      for line in configfile:
        line = line.rstrip("\n")
        value = line.split("=")
        if value[0] == "analytics_url":
          analytics_url = value[1]
        elif value[0] == "path":
          path = value[1]
        elif value[0] == "analytics_apikey":
          analytics_apikey = value[1]
        elif value[0] == "alma_api_url":
          alma_api_url = value[1]
        elif value[0] == "alma_apikey":
          alma_apikey = value[1]
        elif value[0] == "alma_job_url":
          alma_job_url = value[1]

    ## OPEN SET XML
      set_xml = ("set_UNIV_MI_to_XM.xml")
      univmitoxm = open(set_xml, "r")

    ## CALL SECONDARY FUNCTION TO NEW VARIABLES
      response,url = get_analytics_report(analytics_url,path,analytics_apikey)
      barcode = get_barcodes(response)
      content = create_set(alma_api_url,alma_apikey,univmitoxm)
      setids = get_setid_from_content(content)

    ## CREATE XML OF BARCODES
      barcode_xml = ""
      for line in barcode:
        barcode_xml += "<member><id>" + line + "</id></member>"
        members_xml = "<set><members>" + barcode_xml + "</members></set>"

    ## CALL SECONDARY FUNCTION TO PREPARE FINAL SET
      try:
        final_set = add_members_to_set(alma_api_url+"/"+setids,alma_apikey,members_xml)
      except:
        sys.stderr.write("Could not create final set"+"\n")

    ## OPEN JOB XML
      job_xml = ("job_xml_UNIV_MI_to_XM.xml")
      processitems = open(job_xml, "r")
      processitems = processitems.read()
     
    ## CALL TO UPDATE JOB XML WITH SET ID FROM SET CREATED ABOVE
      job_xml = prepare_job_xml(setids,processitems)

    ## CALL SECONDARY FUNCTION TO RUN JOB
      run_job = job(alma_job_url,alma_apikey,job_xml)

    ## DELAY TO ALLOW TIME FOR JOB TO RUN IN ALMA (in seconds)
      time.sleep(60)

    ## CALL TO DELETE SET
      try:
        deleteset = delete_set(alma_api_url+"/"+setids,alma_apikey)
      except:
        sys.stderr.write("Could not delete set"+"\n")

    ## CLOSE FILES
      configfile.close()
      univmitoxm.close()

    # EXIT SCRIPT
    if __name__ == "__main__":
      sys.exit(main())




    Report
    View article in the Exlibris Knowledge Center
    1. Back to top
      • Publish MARC records for digital inventory for the Australian National Bibliographic Database and Trove using the OAI-PMH daily update
      • Python script to delete expired patrons from Alma, as determined by an Alma Analytics report
    • Was this article helpful?

    Recommended articles

    1. Article type
      Topic
      Community Content Type
      Enhancements
      Content Type
      Documentation
      Language
      English
      Product
      Alma
    2. Tags
      This page has no tags.
    1. © Copyright 2025 Ex Libris Knowledge Center
    2. Powered by CXone Expert ®
    • Term of Use
    • Privacy Policy
    • Contact Us
    2025 Ex Libris. All rights reserved