From: Jeff Davis Date: Thu, 9 May 2013 19:03:58 +0000 (-0700) Subject: Expose bib source in TPAC X-Git-Url: https://old-git.evergreen-ils.org/?a=commitdiff_plain;h=d058329872e5fb429c714fbeab484ee7005ec5e0;p=working%2FEvergreen.git 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 --- 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..e852277fcb --- /dev/null +++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.unapi_include_bib_source.sql @@ -0,0 +1,145 @@ +-- 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 fa3ed902c2..41f99618e8 100644 --- a/Open-ILS/src/templates/opac/parts/misc_util.tt2 +++ b/Open-ILS/src/templates/opac/parts/misc_util.tt2 @@ -285,6 +285,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