[open-ils-commits] r7589 - trunk/Open-ILS/src/perlmods/OpenILS/WWW

svn at svn.open-ils.org svn at svn.open-ils.org
Fri Jul 27 12:34:49 EDT 2007


Author: miker
Date: 2007-07-27 12:33:33 -0400 (Fri, 27 Jul 2007)
New Revision: 7589

Added:
   trunk/Open-ILS/src/perlmods/OpenILS/WWW/Exporter.pm
Log:
web-ized the marc_export tool

Added: trunk/Open-ILS/src/perlmods/OpenILS/WWW/Exporter.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/WWW/Exporter.pm	                        (rev 0)
+++ trunk/Open-ILS/src/perlmods/OpenILS/WWW/Exporter.pm	2007-07-27 16:33:33 UTC (rev 7589)
@@ -0,0 +1,211 @@
+package OpenILS::WWW::Exporter;
+use strict;
+use warnings;
+use bytes;
+
+use Apache2::Log;
+use Apache2::Const -compile => qw(OK REDIRECT DECLINED NOT_FOUND :log);
+use APR::Const    -compile => qw(:error SUCCESS);
+use Apache2::RequestRec ();
+use Apache2::RequestIO ();
+use Apache2::RequestUtil;
+use CGI;
+use Data::Dumper;
+
+use OpenSRF::EX qw(:try);
+use OpenSRF::Utils qw/:datetime/;
+use OpenSRF::Utils::Cache;
+use OpenSRF::System;
+use OpenSRF::AppSession;
+use XML::LibXML;
+use XML::LibXSLT;
+
+use Encode;
+use Unicode::Normalize;
+use OpenILS::Utils::Fieldmapper;
+use OpenSRF::Utils::Logger qw/$logger/;
+
+use MARC::Record;
+use MARC::File::XML;
+
+use UNIVERSAL::require;
+
+our @formats = qw/USMARC UNIMARC XML BRE/;
+
+# set the bootstrap config and template include directory when
+# this module is loaded
+my $bootstrap;
+
+sub import {
+        my $self = shift;
+        $bootstrap = shift;
+}
+
+
+sub child_init {
+        OpenSRF::System->bootstrap_client( config_file => $bootstrap );
+}
+
+sub handler {
+	my $r = shift;
+	my $cgi = new CGI;
+	
+	my @records = $cgi->param('id');
+
+	return 200 unless (@records);
+
+	my $holdings = $cgi->param('holdings');
+	my $location = $cgi->param('location') || 'gaaagpl'; # just because...
+
+	my $format = $cgi->param('format') || 'USMARC';
+	$format = uc($format);
+
+	my $encoding = $cgi->param('encoding') || 'UTF-8';
+	$encoding = uc($encoding);
+
+	binmode(STDOUT, ':raw') if ($encoding ne 'UTF-8');
+	binmode(STDOUT, ':utf8') if ($encoding eq 'UTF-8');
+
+	if (!grep { uc($format) eq $_ } @formats) {
+		die	"Please select a supported format.  ".
+			"Right now that means one of [".
+			join('|', at formats). "]\n";
+	}
+
+	if ($format ne 'XML') {
+		my $type = 'MARC::File::' . $format;
+		$type->require;
+	}
+
+	my $ses = OpenSRF::AppSession->create('open-ils.cstore');
+
+	print <<"	HEADER" if ($format eq 'XML');
+<?xml version="1.0" encoding="$encoding"?>
+<collection xmlns='http://www.loc.gov/MARC21/slim'>
+	HEADER
+
+	my %orgs;
+	my %shelves;
+
+	my $flesh = {};
+	if ($holdings) {
+
+		print STDERR "Retrieving Org Units ... ";
+		my $r = $ses->request( 'open-ils.cstore.direct.actor.org_unit.search', { id => { '!=' => undef } } );
+
+    		while (my $o = $r->recv) {
+        		die $r->failed->stringify if ($r->failed);
+        		$o = $o->content;
+        		last unless ($o);
+	    		$orgs{$o->id} = $o;
+    		}
+    		$r->finish;
+		print STDERR "OK\n";
+
+		print STDERR "Retrieving Shelving locations ... ";
+		$r = $ses->request( 'open-ils.cstore.direct.asset.copy_location.search', { id => { '!=' => undef } } );
+
+    		while (my $s = $r->recv) {
+        		die $r->failed->stringify if ($r->failed);
+        		$s = $s->content;
+        		last unless ($s);
+	    		$shelves{$s->id} = $s;
+    		}
+    		$r->finish;
+		print STDERR "OK\n";
+
+    		$flesh = { flesh => 2, flesh_fields => { bre => [ 'call_numbers' ], acn => [ 'copies' ] } };
+	}
+
+	for my $i ( @records ) {
+    		my $bib;
+    		try {
+        		local $SIG{ALRM} = sub { die "TIMEOUT\n" };
+        		alarm(1);
+	    		$bib = $ses->request( 'open-ils.cstore.direct.biblio.record_entry.retrieve', $i, $flesh )->gather(1);
+        		alarm(0);
+    		} otherwise {
+        		warn "\n!!!!!! Timed out trying to read record $i\n";
+    		};
+    		alarm(0);
+
+		next unless $bib;
+
+    		if (uc($format) eq 'BRE') {
+        		print OpenSRF::Utils::JSON->perl2JSON($bib);
+        		next;
+    		}
+
+		try {
+
+			my $r = MARC::Record->new_from_xml( $bib->marc, $encoding, $format );
+			$r->delete_field( $_ ) for ($r->field(901));
+
+			$r->append_fields(
+				MARC::Field->new(
+					901, '', '', 
+					a => $bib->tcn_value,
+					b => $bib->tcn_source,
+					c => $bib->id
+				)
+			);
+
+
+        		my $cn_list = $bib->call_numbers;
+        		if ($cn_list && @$cn_list) {
+
+            			my $cp_list = [ map { @{ $_->copies } } @$cn_list ];
+            			if ($cp_list && @$cp_list) {
+
+	            			my %cn_map;
+	            			push @{$cn_map{$_->call_number}}, $_ for (@$cp_list);
+		                        
+	            			for my $cn ( @$cn_list ) {
+	                			my $cn_map_list = $cn_map{$cn->id};
+	
+	                			for my $cp ( @$cn_map_list ) {
+		                        
+							$r->append_fields(
+								MARC::Field->new(
+									852, '4', '', 
+									a => $location,
+									b => $orgs{$cn->owning_lib}->shortname,
+									b => $orgs{$cp->circ_lib}->shortname,
+									c => $shelves{$cp->location}->name,
+									j => $cn->label,
+									($cp->circ_modifier ? ( g => $cp->circ_modifier ) : ()),
+									p => $cp->barcode,
+									($cp->price ? ( y => $dollarsign.$cp->price ) : ()),
+									($cp->copy_number ? ( t => $cp->copy_number ) : ()),
+									($cp->ref eq 't' ? ( x => 'reference' ) : ()),
+									($cp->holdable eq 'f' ? ( x => 'unholdable' ) : ()),
+									($cp->circulate eq 'f' ? ( x => 'noncirculating' ) : ()),
+									($cp->opac_visible eq 'f' ? ( x => 'hidden' ) : ()),
+								)
+							);
+
+						}
+					}
+				}
+        		}
+
+			if (uc($format) eq 'XML') {
+				print $r->as_xml_record;
+			} elsif (uc($format) eq 'UNIMARC') {
+				print $r->as_unimarc
+			} elsif (uc($format) eq 'USMARC') {
+				print $r->as_usmarc
+			}
+
+		} otherwise {
+			my $e = shift;
+			warn "\n$e\n";
+		};
+
+	}
+
+	print "</collection>\n" if ($format eq 'XML');
+
+}
+
+1;



More information about the open-ils-commits mailing list