From 0d64e79f8400b67733d91f94e688cc0c23dae767 Mon Sep 17 00:00:00 2001 From: artunit Date: Sat, 18 Jul 2009 01:14:47 +0000 Subject: [PATCH] extracting yax and expect dependencies, some info on running under windows git-svn-id: svn://svn.open-ils.org/ILS-Contrib/servres/trunk@590 6d9bc8c9-1ec2-4278-b937-99fde70a366f --- conifer/README | 198 +++++++++++++++++++------------------- conifer/custom/lib_integration.py | 192 ++++++++++++++++++------------------ 2 files changed, 194 insertions(+), 196 deletions(-) diff --git a/conifer/README b/conifer/README index 369620a..b0e94e9 100644 --- a/conifer/README +++ b/conifer/README @@ -1,101 +1,99 @@ -Syrup: A Reserves application ------------------------------- - -For more information, see -http://open-ils.org/dokuwiki/doku.php?id=scratchpad:reserves - -or contact -Art Rhyno -Graham Fawcett - - -State of the application ------------------------------- - -Coming along nicely, thank you! With a bit of patience, you ought to -be able to get a basic Syrup system running in no time. Integrating it -with your backend library and other systems will take longer, of -course. - -Required components ------------------------------- - -Most likely you will need a Unix-like system: Linux, BSD, or OS X -ought all to work. Most development and testing is being done on -Linux. No testing on Windows has been done. - -You need Python. Probably Python 2.5, I haven't tested with other -versions. You also need sqlite3 or another Django-compatible -database. Sqlite3 is recommended for kicking the tires, PostgreSQL for -production. - -Third-party Python dependencies: - - sudo easy_install Django Genshi Babel BabelDjango pexpect - -(You'll need 'setuptools' in order to have 'easy_install'.) - -Graham has the following versions installed. Not saying you need these -exact ones, just that they are known to work. - - Django-1.0.1_final-py2.5 - Babel-0.9.4-py2.5 - BabelDjango-0.2.2-py2.5 - Genshi-0.5.1-py2.5 - pexpect-2.4-py2.5 - -You will need 'yaz-client' for the Z39.50 stuff. On Ubuntu, this works: - - sudo apt-get install yaz libyaz3 - - -Getting this thing to run ------------------------------- - -This might work: - -* Review settings.py. Maybe you need to edit stuff. Probably not for a - quick test. - -* ./manage.py syncdb - -* During syncdb, create yourself a superuser account. - -* ./pybabel-extract (currently, this is optional) - -* ./manage.py runserver - -* visit http://localhost:8000/ and log in. - -* create at least one Term and one Department under Admin Options. - -* make yourself a course. - -* click on all of the links and see what they do. - - -Contents [out of date -- Ed.] ------------------------------- - -syrup/ -- the reserves app -middleware/ -- middleware component to integrate Genshi -locale/ -- the gettext files -templates/ -- the Genshi templates -static/ -- static JS, CSS, image files -doc/ -- documentation on the app - -local_settings.py.in -- a template for local_settings.py -genshi_support.py -- Genshi template integration -pybabel-extract -- a "make all" for the i18n files -babel.cfg -- Babel (i18n) configuration file - -The rest is straightforward Django stuff. - - -Customization ------------------------------- - -The 'custom' directory contains (or should contain!) all of the bits -that you really need to customize for your institution. More -documentation is needed here, but the source code is mostly +Syrup: A Reserves application +------------------------------ + +For more information, see +http://open-ils.org/dokuwiki/doku.php?id=scratchpad:reserves + +or contact +Art Rhyno +Graham Fawcett + + +State of the application +------------------------------ + +Coming along nicely, thank you! With a bit of patience, you ought to +be able to get a basic Syrup system running in no time. Integrating it +with your backend library and other systems will take longer, of +course. + +Required components +------------------------------ + +You need Python. Probably Python 2.5, I haven't tested with other +versions. You also need sqlite3 or another Django-compatible +database. Sqlite3 is recommended for kicking the tires, PostgreSQL for +production. + +Third-party Python dependencies: + + sudo easy_install Django Genshi Babel BabelDjango + +(You'll need 'setuptools' in order to have 'easy_install'.) + +Windows is very similar, see: + +http://groups.google.com/group/syrup-reserves-discuss/web/installing-syrup-in-windows + +Graham has the following versions installed. Not saying you need these +exact ones, just that they are known to work. + + Django-1.0.1_final-py2.5 + Babel-0.9.4-py2.5 + BabelDjango-0.2.2-py2.5 + Genshi-0.5.1-py2.5 + +Getting this thing to run +------------------------------ + +This might work: + +* Review settings.py. Maybe you need to edit stuff. Probably not for a + quick test. + +* ./manage.py syncdb + +Note: don't use the "./" syntax in windows for the commands, e.g.: + +C:\src\syrup\trunk\conifer>manage.py syncdb + +* During syncdb, create yourself a superuser account. + +* ./pybabel-extract (currently, this is optional) + +* ./manage.py runserver + +* visit http://localhost:8000/ and log in. + +* create at least one Term and one Department under Admin Options. + +* make yourself a course. + +* click on all of the links and see what they do. + + +Contents [out of date -- Ed.] +------------------------------ + +syrup/ -- the reserves app +middleware/ -- middleware component to integrate Genshi +locale/ -- the gettext files +templates/ -- the Genshi templates +static/ -- static JS, CSS, image files +doc/ -- documentation on the app + +local_settings.py.in -- a template for local_settings.py +genshi_support.py -- Genshi template integration +pybabel-extract -- a "make all" for the i18n files +babel.cfg -- Babel (i18n) configuration file + +The rest is straightforward Django stuff. + + +Customization +------------------------------ + +The 'custom' directory contains (or should contain!) all of the bits +that you really need to customize for your institution. More +documentation is needed here, but the source code is mostly well-documented. \ No newline at end of file diff --git a/conifer/custom/lib_integration.py b/conifer/custom/lib_integration.py index 5b8854a..14afb95 100644 --- a/conifer/custom/lib_integration.py +++ b/conifer/custom/lib_integration.py @@ -1,96 +1,96 @@ -# Our integration-point with back-end library systems. - -# This is a work in progress. I'm trying to separate out the actual -# protocol handlers (in libsystems) from the configuration decicions -# (in settings.py), and use this as sort of a merge-point between -# those two decisions. - -# TODO: write some documentation about the lib_integration interface. - -# Our example configuration: -# Z39.50 for catalogue search, -# SIP for patron and item_info, and for item checkout and checkin, -# OpenSRF for extended item info. - -# define a @caching decorator to exploit the Django cache. Fixme, move -# this somewhere else. -from django.core.cache import cache -import cPickle -def caching(prefix, timeout=60): - def g(func): - def f(*args): - # wtf! Django encodes string-values as - # unicode-strings. That's bad, like stupid-bad! I'm - # putting explicit utf8-conversions here to make debugging - # easier if this code dies. - key = ','.join([prefix] + map(str, args)) - v = cache.get(key) - if v: - return cPickle.loads(v.encode('utf-8')) - else: - v = func(*args) - if v: - cache.set(key, unicode(cPickle.dumps(v), 'utf-8'), timeout) - return v - return f - return g - - -from django.conf import settings - -from conifer.libsystems.evergreen.support import initialize -EG_BASE = 'http://%s/' % settings.EVERGREEN_GATEWAY_SERVER -try: - initialize(EG_BASE) -except: - import warnings - warnings.warn('Evergreen inaccessible! Integration will suck eggs!') - -from conifer.libsystems.evergreen import item_status as I -from conifer.libsystems.sip.sipclient import SIP -from conifer.libsystems.z3950 import yaz_search -from conifer.libsystems.z3950.marcxml import marcxml_to_dictionary - - -@caching('patroninfo', timeout=300) -@SIP -def patron_info(conn, barcode): - return conn.patron_info(barcode) - -@caching('itemstatus', timeout=300) -@SIP -def item_status(conn, barcode): - return conn.item_info(barcode) - -@SIP -def checkout(conn, patron_barcode, item_barcode): - return conn.checkout(patron_barcode, item_barcode, '') - -@SIP -def checkin(conn, item_barcode): - return conn.checkin(item_barcode, institution='', location='') - - -@caching('bcbi', timeout=3600) -def barcode_to_bib_id(barcode): - return I.barcode_to_bib_id(barcode) - -@caching('bccp', timeout=3600) -def barcode_to_copy(barcode): - return I.barcode_to_copy(barcode) - -@caching('bimx', timeout=3600) -def bib_id_to_marcxml(bib_id): - return I.bib_id_to_marcxml(bib_id) - - -def cat_search(query, start=1, limit=10): - # this is a total hack for conifer. If the query is a Conifer - # title-detail URL, then return just that one item. - if query.startswith(EG_BASE): - results = marcxml_to_dictionary(I.url_to_marcxml(query), multiples=True) - numhits = len(results) - else: - cat_host, cat_db = settings.Z3950_CONFIG - results, numhits = yaz_search.search(cat_host, cat_db, query, start, limit) - return results, numhits +# Our integration-point with back-end library systems. + +# This is a work in progress. I'm trying to separate out the actual +# protocol handlers (in libsystems) from the configuration decicions +# (in settings.py), and use this as sort of a merge-point between +# those two decisions. + +# TODO: write some documentation about the lib_integration interface. + +# Our example configuration: +# Z39.50 for catalogue search, +# SIP for patron and item_info, and for item checkout and checkin, +# OpenSRF for extended item info. + +# define a @caching decorator to exploit the Django cache. Fixme, move +# this somewhere else. +from django.core.cache import cache +import cPickle +def caching(prefix, timeout=60): + def g(func): + def f(*args): + # wtf! Django encodes string-values as + # unicode-strings. That's bad, like stupid-bad! I'm + # putting explicit utf8-conversions here to make debugging + # easier if this code dies. + key = ','.join([prefix] + map(str, args)) + v = cache.get(key) + if v: + return cPickle.loads(v.encode('utf-8')) + else: + v = func(*args) + if v: + cache.set(key, unicode(cPickle.dumps(v), 'utf-8'), timeout) + return v + return f + return g + + +from django.conf import settings + +from conifer.libsystems.evergreen.support import initialize +EG_BASE = 'http://%s/' % settings.EVERGREEN_GATEWAY_SERVER +try: + initialize(EG_BASE) +except: + import warnings + warnings.warn('Evergreen inaccessible! Integration will suck eggs!') + +from conifer.libsystems.evergreen import item_status as I +from conifer.libsystems.sip.sipclient import SIP +#from conifer.libsystems.z3950 import yaz_search +from conifer.libsystems.z3950.marcxml import marcxml_to_dictionary + + +@caching('patroninfo', timeout=300) +@SIP +def patron_info(conn, barcode): + return conn.patron_info(barcode) + +@caching('itemstatus', timeout=300) +@SIP +def item_status(conn, barcode): + return conn.item_info(barcode) + +@SIP +def checkout(conn, patron_barcode, item_barcode): + return conn.checkout(patron_barcode, item_barcode, '') + +@SIP +def checkin(conn, item_barcode): + return conn.checkin(item_barcode, institution='', location='') + + +@caching('bcbi', timeout=3600) +def barcode_to_bib_id(barcode): + return I.barcode_to_bib_id(barcode) + +@caching('bccp', timeout=3600) +def barcode_to_copy(barcode): + return I.barcode_to_copy(barcode) + +@caching('bimx', timeout=3600) +def bib_id_to_marcxml(bib_id): + return I.bib_id_to_marcxml(bib_id) + + +def cat_search(query, start=1, limit=10): + # this is a total hack for conifer. If the query is a Conifer + # title-detail URL, then return just that one item. + if query.startswith(EG_BASE): + results = marcxml_to_dictionary(I.url_to_marcxml(query), multiples=True) + numhits = len(results) + else: + cat_host, cat_db = settings.Z3950_CONFIG + results, numhits = yaz_search.search(cat_host, cat_db, query, start, limit) + return results, numhits -- 2.11.0