From 4f4c29b9cfba445c5b0818b6f14245448b58f913 Mon Sep 17 00:00:00 2001 From: Jeff Davis Date: Thu, 9 May 2013 12:03:58 -0700 Subject: [PATCH] LP#1178377: Expose bib source in TPAC - Add unapi.cbs database function to grab config.bib_source data, and include this in unapi.bre XML output. - Make bib_source.id and bib_source.source available as record attributes in TPAC. Signed-off-by: Jeff Davis Signed-off-by: Ben Shum --- Open-ILS/src/sql/Pg/990.schema.unapi.sql | 28 ++++ .../XXXX.schema.unapi_include_bib_source.sql | 144 ++++++++++++++++++ .../src/templates/opac/parts/misc_util.tt2 | 5 + 3 files changed, 177 insertions(+) create mode 100644 Open-ILS/src/sql/Pg/upgrade/XXXX.schema.unapi_include_bib_source.sql diff --git a/Open-ILS/src/sql/Pg/990.schema.unapi.sql b/Open-ILS/src/sql/Pg/990.schema.unapi.sql index 8ad2ec413c..3fbf8bb366 100644 --- a/Open-ILS/src/sql/Pg/990.schema.unapi.sql +++ b/Open-ILS/src/sql/Pg/990.schema.unapi.sql @@ -406,6 +406,7 @@ DECLARE output XML; hxml XML; axml XML; + source XML; BEGIN IF org = '-' OR org IS NULL THEN @@ -433,6 +434,13 @@ BEGIN SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id; + -- grab bib_source, if any + IF me.source IS NOT NULL THEN + source := unapi.cbs(me.source,NULL,NULL,NULL,NULL); + ELSE + source := NULL::XML; + END IF; + -- grab SVF if we need them IF ('mra' = ANY (includes)) THEN axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL); @@ -462,6 +470,10 @@ BEGIN top_el := REGEXP_REPLACE(tmp_xml, E'^.*?<((?:\\S+:)?' || layout.holdings_element || ').*$', E'\\1'); + IF source IS NOT NULL THEN + tmp_xml := REGEXP_REPLACE(tmp_xml, '(.*?)$', source || '\\1'); + END IF; + IF axml IS NOT NULL THEN tmp_xml := REGEXP_REPLACE(tmp_xml, '(.*?)$', axml || '\\1'); END IF; @@ -1205,6 +1217,22 @@ CREATE OR REPLACE FUNCTION unapi.auri ( obj_id BIGINT, format TEXT, ename TEXT, GROUP BY uri.id, use_restriction, href, label; $F$ LANGUAGE SQL STABLE; +CREATE OR REPLACE FUNCTION unapi.cbs ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$ + SELECT XMLELEMENT( + name bib_source, + XMLATTRIBUTES( + NULL AS xmlns, -- TODO needs equivalent to http://open-ils.org/spec/holdings/v1 + id AS ident, + quality, + transcendant, + can_have_copies + ), + source + ) + FROM config.bib_source + WHERE id = $1; +$F$ LANGUAGE SQL STABLE; + CREATE OR REPLACE FUNCTION unapi.mra ( obj_id BIGINT, format TEXT, diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.unapi_include_bib_source.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.unapi_include_bib_source.sql new file mode 100644 index 0000000000..20ab5ae976 --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.unapi_include_bib_source.sql @@ -0,0 +1,144 @@ +-- Include bib source in XML returned by unapi.bre. +BEGIN; + +-- check whether patch can be applied +SELECT evergreen.upgrade_deps_block_check('XXXX', :eg_version); + +CREATE OR REPLACE FUNCTION unapi.cbs ( obj_id BIGINT, format TEXT, ename TEXT, includes TEXT[], org TEXT, depth INT DEFAULT NULL, slimit HSTORE DEFAULT NULL, soffset HSTORE DEFAULT NULL, include_xmlns BOOL DEFAULT TRUE ) RETURNS XML AS $F$ + SELECT XMLELEMENT( + name bib_source, + XMLATTRIBUTES( + NULL AS xmlns, -- TODO needs equivalent to http://open-ils.org/spec/holdings/v1 + id AS ident, + quality, + transcendant, + can_have_copies + ), + source + ) + FROM config.bib_source + WHERE id = $1; +$F$ LANGUAGE SQL STABLE; + +CREATE OR REPLACE FUNCTION unapi.bre ( + obj_id BIGINT, + format TEXT, + ename TEXT, + includes TEXT[], + org TEXT, + depth INT DEFAULT NULL, + slimit HSTORE DEFAULT NULL, + soffset HSTORE DEFAULT NULL, + include_xmlns BOOL DEFAULT TRUE, + pref_lib INT DEFAULT NULL +) +RETURNS XML AS $F$ +DECLARE + me biblio.record_entry%ROWTYPE; + layout unapi.bre_output_layout%ROWTYPE; + xfrm config.xml_transform%ROWTYPE; + ouid INT; + tmp_xml TEXT; + top_el TEXT; + output XML; + hxml XML; + axml XML; + source XML; +BEGIN + + IF org = '-' OR org IS NULL THEN + SELECT shortname INTO org FROM evergreen.org_top(); + END IF; + + SELECT id INTO ouid FROM actor.org_unit WHERE shortname = org; + + IF ouid IS NULL THEN + RETURN NULL::XML; + END IF; + + IF format = 'holdings_xml' THEN -- the special case + output := unapi.holdings_xml( obj_id, ouid, org, depth, includes, slimit, soffset, include_xmlns); + RETURN output; + END IF; + + SELECT * INTO layout FROM unapi.bre_output_layout WHERE name = format; + + IF layout.name IS NULL THEN + RETURN NULL::XML; + END IF; + + SELECT * INTO xfrm FROM config.xml_transform WHERE name = layout.transform; + + SELECT * INTO me FROM biblio.record_entry WHERE id = obj_id; + + -- grab bib_source, if any + IF me.source IS NOT NULL THEN + source := unapi.cbs(me.source,NULL,NULL,NULL,NULL); + ELSE + source := NULL::XML; + END IF; + + -- grab SVF if we need them + IF ('mra' = ANY (includes)) THEN + axml := unapi.mra(obj_id,NULL,NULL,NULL,NULL); + ELSE + axml := NULL::XML; + END IF; + + -- grab holdings if we need them + IF ('holdings_xml' = ANY (includes)) THEN + hxml := unapi.holdings_xml(obj_id, ouid, org, depth, evergreen.array_remove_item_by_value(includes,'holdings_xml'), slimit, soffset, include_xmlns, pref_lib); + ELSE + hxml := NULL::XML; + END IF; + + + -- generate our item node + + + IF format = 'marcxml' THEN + tmp_xml := me.marc; + IF tmp_xml !~ E'(.*?)$', source || '\\1'); + END IF; + + IF axml IS NOT NULL THEN + tmp_xml := REGEXP_REPLACE(tmp_xml, '(.*?)$', axml || '\\1'); + END IF; + + IF hxml IS NOT NULL THEN -- XXX how do we configure the holdings position? + tmp_xml := REGEXP_REPLACE(tmp_xml, '(.*?)$', hxml || '\\1'); + END IF; + + IF ('bre.unapi' = ANY (includes)) THEN + output := REGEXP_REPLACE( + tmp_xml, + '(.*?)', + XMLELEMENT( + name abbr, + XMLATTRIBUTES( + 'http://www.w3.org/1999/xhtml' AS xmlns, + 'unapi-id' AS class, + 'tag:open-ils.org:U2@bre/' || obj_id || '/' || org AS title + ) + )::TEXT || '\\1' + ); + ELSE + output := tmp_xml; + END IF; + + output := REGEXP_REPLACE(output::TEXT,E'>\\s+<','><','gs')::XML; + RETURN output; +END; +$F$ LANGUAGE PLPGSQL STABLE; + +COMMIT; diff --git a/Open-ILS/src/templates/opac/parts/misc_util.tt2 b/Open-ILS/src/templates/opac/parts/misc_util.tt2 index 0af121c4e5..8edeab5f12 100644 --- a/Open-ILS/src/templates/opac/parts/misc_util.tt2 +++ b/Open-ILS/src/templates/opac/parts/misc_util.tt2 @@ -449,6 +449,11 @@ ou_hiding_disabled = ctx.org_hiding_disabled(); + # explicitly grabbing the first bib_source node, though there should be only one anyway + bib_source = xml.findnodes('//*[local-name()="bib_source"][1]'); + args.bib_source.id = bib_source.getAttribute('ident'); + args.bib_source.source = bib_source.textContent; + FOR volume IN xml.findnodes('//*[local-name()="volumes"]/*[local-name()="volume"]'); # Check volume visibility - could push this into XPath -- 2.43.2