From 96a836d92ab9a19db8a9a04a0b72a55f148782e6 Mon Sep 17 00:00:00 2001 From: artunit Date: Mon, 14 Feb 2011 03:37:00 +0000 Subject: [PATCH] ils updates for items, more testing to do but basic layer works git-svn-id: svn://svn.open-ils.org/ILS-Contrib/servres/trunk@1228 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- conifer/integration/uwindsor.py | 42 +++++++---------------------- conifer/libsystems/evergreen/item_status.py | 4 ++- conifer/libsystems/evergreen/opensrf.py | 41 ++++++++++++++++++++++++++++ conifer/syrup/views/items.py | 33 +++++++++++++++++++++++ 4 files changed, 87 insertions(+), 33 deletions(-) create mode 100644 conifer/libsystems/evergreen/opensrf.py diff --git a/conifer/integration/uwindsor.py b/conifer/integration/uwindsor.py index e420266..ed4155d 100644 --- a/conifer/integration/uwindsor.py +++ b/conifer/integration/uwindsor.py @@ -11,7 +11,6 @@ from memoization import memoize from xml.etree import ElementTree as ET import csv import datetime -import hashlib import time import os import re @@ -66,8 +65,6 @@ STATUS_DECODE = [(str(x['id']), x['name']) AVAILABLE = [id for id, name in STATUS_DECODE if name == 'Available'][0] RESHELVING = [id for id, name in STATUS_DECODE if name == 'Reshelving'][0] -RESERVES_DESK_NAME = 'Leddy: Course Reserves - Main Bldng - 1st Flr - Reserve Counter at Circulation Desk' - def item_status(item): """ Given an Item object, return three numbers: (library, desk, @@ -89,12 +86,13 @@ def item_status(item): CACHE_TIME = 300 -@memoize(timeout=CACHE_TIME) +# @memoize(timeout=CACHE_TIME) def _item_status(bib_id): if bib_id: try: counts = E1(settings.OPENSRF_COPY_COUNTS, bib_id, 1, 0) + lib = desk = avail = vol = 0 dueinfo = '' callno = '' @@ -120,12 +118,12 @@ def _item_status(bib_id): """ attachtest = re.search(settings.ATTACHMENT, callnum) - if loc == RESERVES_DESK_NAME: + if loc == settings.RESERVES_DESK_NAME: desk += anystatus_here avail += avail_here dueinfo = '' - if (voltest and vol > 0): + if (voltest and vol > 0 ): if (int(voltest.group(1)) > vol): callsuffix = "/" + callnum else: @@ -139,9 +137,9 @@ def _item_status(bib_id): callno = callnum lib += anystatus_here + print "PRE" copyids = E1(settings.OPENSRF_CN_CALL, bib_id, callnum, org) - """ we want to return the resource that will be returned first if already checked out @@ -153,7 +151,7 @@ def _item_status(bib_id): if thisloc: thisloc = thisloc.get("name") - if thisloc == RESERVES_DESK_NAME: + if thisloc == settings.RESERVES_DESK_NAME: bringfw = attachtest # multiple volumes @@ -164,7 +162,7 @@ def _item_status(bib_id): circmod = circinfo.get("circ_modifier") circs = circinfo.get("circulations") - if circs and len(circs) > 0: + if circs and len(circs) > 0 and circs.isdigit(): circ = circs[0] rawdate = circ.get("due_date") #remove offset info, %z is flakey for some reason @@ -209,7 +207,7 @@ def _item_status(bib_id): alldisplay = callnum + ' (Available)' - if circs and len(circs) > 0: + if circs and len(circs) > 0 and circs.isdigit(): alldisplay = '%s (DUE: %s)' % (callnum, time.strftime(settings.DUE_FORMAT,duetime)) alldues.append(alldisplay) @@ -229,26 +227,6 @@ def _item_status(bib_id): pass # fail silently in production if there's an opensrf or time related error. return None -#for example: auth_token("username@uwindsor.ca", "password", "OWA", "workstation") -def auth_token(username, password, org, workstation): - try: - authtoken = None - payload = E1('open-ils.auth.authenticate.init', username) - pw = hashlib.md5(password).hexdigest() - pw = hashlib.md5(payload + pw).hexdigest() - authinfo = E1('open-ils.auth.authenticate.complete',{"password":pw, "type":"staff", - "org": org, "username":username, - "workstation":workstation}) - if authinfo: - payload = authinfo.get("payload") - authtoken = payload.get("authtoken") - except: - print "authentication problem: ", username - print "*** print_exc:" - traceback.print_exc() - pass # fail silently in production - return authtoken - def cat_search(query, start=1, limit=10): bibid=0 bc = re.search('\d{14}', query.strip()) @@ -319,8 +297,8 @@ def bib_id_to_url(bib_id): Given a bib ID, return either a URL for examining the bib record, or None. """ if bib_id: - return ('http://windsor.concat.ca/opac/en-CA' - '/skin/uwin/xml/rdetail.xml?r=%s&l=1&d=0' % bib_id) + return ('%sopac/en-CA' + '/skin/uwin/xml/rdetail.xml?r=%s&l=1&d=0' % (EG_BASE, bib_id)) if False: # if USE_Z3950: # only if we are using Z39.50 for catalogue search. Results including diff --git a/conifer/libsystems/evergreen/item_status.py b/conifer/libsystems/evergreen/item_status.py index 1433a51..cd5b656 100644 --- a/conifer/libsystems/evergreen/item_status.py +++ b/conifer/libsystems/evergreen/item_status.py @@ -1,5 +1,6 @@ import support from support import ER, E1 +from django.conf import settings import re import urllib2 @@ -32,7 +33,8 @@ def url_to_marcxml(url): return xml if __name__ == '__main__': - support.initialize('http://windsor.concat.ca/') + EG_BASE = 'http://%s/' % settings.EVERGREEN_GATEWAY_SERVER + support.initialize(EG_BASE) print url_to_marcxml('http://windsor.concat.ca/opac/en-CA/skin/uwin/xml/rdetail.xml?r=1971331&t=evergreen&tp=keyword&l=106&d=1&hc=210&rt=keyword') # from xml.etree import ElementTree as ET # for t in ET.fromstring(bib_id_to_marcxml('2081089')).getiterator(): diff --git a/conifer/libsystems/evergreen/opensrf.py b/conifer/libsystems/evergreen/opensrf.py new file mode 100644 index 0000000..87904f0 --- /dev/null +++ b/conifer/libsystems/evergreen/opensrf.py @@ -0,0 +1,41 @@ +# session-based opensrf calls go here + +from conifer.libsystems import marcxml as M +from conifer.libsystems.evergreen import item_status as I +from conifer.libsystems.evergreen.support import initialize, E1 +from datetime import date +from django.conf import settings +import hashlib +import os +import re +import traceback + +def auth_token(username, password, org, workstation): + try: + authtoken = None + payload = E1(settings.OPENSRF_AUTHENTICATE_INIT, username) + pw = hashlib.md5(password).hexdigest() + pw = hashlib.md5(payload + pw).hexdigest() + authinfo = E1(settings.OPENSRF_AUTHENTICATE,{"password":pw, "type":"staff", + "org": org, "username":username, + "workstation":workstation}) + if authinfo: + payload = authinfo.get("payload") + authtoken = payload.get("authtoken") + except: + print "authentication problem: ", username + print "*** print_exc:" + traceback.print_exc() + pass # fail silently in production + return authtoken + +def session_cleanup(authtoken): + try: + payload = E1(settings.OPENSRF_CLEANUP, authtoken) + except: + print "session problem: ", authtoken + print "*** print_exc:" + traceback.print_exc() + pass # fail silently in production + + return True diff --git a/conifer/syrup/views/items.py b/conifer/syrup/views/items.py index cf3fd36..578c58c 100644 --- a/conifer/syrup/views/items.py +++ b/conifer/syrup/views/items.py @@ -3,8 +3,41 @@ import hashlib from _common import * from conifer.plumbing.hooksystem import * from conifer.syrup import integration +from django.conf import settings from xml.etree import ElementTree as ET from collections import defaultdict +from conifer.libsystems.evergreen.support import initialize, E1 +from conifer.libsystems.evergreen.opensrf import * + +@instructors_only +def item_ils_update(request): + """Update item in ILS""" + # this works in my tests, need to try more variations + # disable in production for now + return simple_message(_('testing.'), _('testing.')) + token = auth_token(settings.OPENSRF_STAFF_USERID, settings.OPENSRF_STAFF_PW, + settings.OPENSRF_STAFF_ORG, settings.OPENSRF_STAFF_WORKSTATION) + null = None + true = True + # barcode will come from form + barcode = "31862005297755" + barcode_copy = E1(settings.OPENSRF_CN_BARCODE, token, barcode); + copy = None + if barcode_copy: + copy = barcode_copy.get("copy") + if copy: + detailid = copy['__p'][21] + details = E1(settings.OPENSRF_FLESHEDCOPY_CALL, [detailid]) + print "details", details + location = details[0]['__p'][23]['__p'][3] + details[0]['__p'][6] = "CIRC" + details[0]['__p'][23] = location + details[0]['__p'].append(None) + details[0]['__p'].append('1') + updaterec = E1(settings.OPENSRF_BATCH_UPDATE, token, details,true) + print "updaterec", updaterec + session_cleanup(token) + return simple_message(_('testing.'), _('testing.')) @members_only def item_detail(request, site_id, item_id): -- 2.11.0