[open-ils-commits] r13036 - in trunk/Open-ILS/src/perlmods/OpenILS: Application WWW (miker)
svn at svn.open-ils.org
svn at svn.open-ils.org
Sat May 2 15:27:05 EDT 2009
Author: miker
Date: 2009-05-02 15:27:02 -0400 (Sat, 02 May 2009)
New Revision: 13036
Modified:
trunk/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm
trunk/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm
Log:
adding acn and acp support to unAPI interface
Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm 2009-05-02 16:28:51 UTC (rev 13035)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/SuperCat.pm 2009-05-02 19:27:02 UTC (rev 13036)
@@ -1,3 +1,15 @@
+# We'll be working with XML, so...
+use XML::LibXML;
+use XML::LibXSLT;
+use Unicode::Normalize;
+
+# ... and this has some handy common methods
+use OpenILS::Application::AppUtils;
+
+my $parser = new XML::LibXML;
+my $U = 'OpenILS::Application::AppUtils';
+
+
package OpenILS::Application::SuperCat;
use strict;
@@ -23,16 +35,6 @@
# ... and this is our OpenILS object (en|de)coder and psuedo-ORM package.
use OpenILS::Utils::Fieldmapper;
-# ... and this has some handy common methods
-use OpenILS::Application::AppUtils;
-
-# We'll be working with XML, so...
-use XML::LibXML;
-use XML::LibXSLT;
-use Unicode::Normalize;
-
-use OpenSRF::Utils::JSON;
-
our (
$_parser,
$_xslt,
@@ -41,8 +43,6 @@
%holdings_data_cache,
);
-my $U = 'OpenILS::Application::AppUtils';
-
sub child_init {
# we need an XML parser
$_parser = new XML::LibXML;
@@ -640,7 +640,106 @@
}
);
+sub holding_data_formats {
+ return [{
+ marcxml => {
+ namespace_uri => 'http://www.loc.gov/MARC21/slim',
+ docs => 'http://www.loc.gov/marcxml/',
+ schema_location => 'http://www.loc.gov/standards/marcxml/schema/MARC21slim.xsd',
+ }
+ }];
+}
+__PACKAGE__->register_method( method => 'holding_data_formats', api_name => 'open-ils.supercat.acn.formats', api_level => 1 );
+__PACKAGE__->register_method( method => 'holding_data_formats', api_name => 'open-ils.supercat.acp.formats', api_level => 1 );
+
+
__PACKAGE__->register_method(
+ method => 'retrieve_copy',
+ api_name => 'open-ils.supercat.acp.marcxml.retrieve',
+ api_level => 1,
+ argc => 1,
+ signature =>
+ { desc => <<" DESC",
+Returns a fleshed call number object
+ DESC
+ params =>
+ [
+ { name => 'cn_id',
+ desc => 'An OpenILS asset::copy id',
+ type => 'number' },
+ ],
+ 'return' =>
+ { desc => 'fleshed copy',
+ type => 'object' }
+ }
+);
+sub retrieve_copy {
+ my $self = shift;
+ my $client = shift;
+ my $cpid = shift;
+ my $args = shift;
+
+ return OpenILS::Application::SuperCat::unAPI
+ ->new(OpenSRF::AppSession
+ ->create( 'open-ils.cstore' )
+ ->request(
+ "open-ils.cstore.direct.asset.copy.retrieve",
+ $cpid,
+ { flesh => 2,
+ flesh_fields => {
+ acn => [qw/owning_lib record/],
+ acp => [qw/call_number location status circ_lib stat_cat_entries notes/],
+ }
+ })
+ ->gather(1))
+ ->as_xml($args);
+}
+
+__PACKAGE__->register_method(
+ method => 'retrieve_callnumber',
+ api_name => 'open-ils.supercat.acn.marcxml.retrieve',
+ api_level => 1,
+ argc => 1,
+ stream => 1,
+ signature =>
+ { desc => <<" DESC",
+Returns a fleshed call number object
+ DESC
+ params =>
+ [
+ { name => 'cn_id',
+ desc => 'An OpenILS asset::call_number id',
+ type => 'number' },
+ ],
+ 'return' =>
+ { desc => 'call number with copies',
+ type => 'object' }
+ }
+);
+sub retrieve_callnumber {
+ my $self = shift;
+ my $client = shift;
+ my $cnid = shift;
+ my $args = shift;
+
+ return OpenILS::Application::SuperCat::unAPI
+ ->new(OpenSRF::AppSession
+ ->create( 'open-ils.cstore' )
+ ->request(
+ "open-ils.cstore.direct.asset.call_number.retrieve",
+ $cnid,
+ { flesh => 2,
+ flesh_fields => {
+ acn => [qw/owning_lib record copies/],
+ acp => [qw/location status circ_lib stat_cat_entries notes/],
+ }
+ })
+ ->gather(1))
+ ->as_xml($args);
+
+}
+
+__PACKAGE__->register_method(
method => 'basic_record_holdings',
api_name => 'open-ils.supercat.record.basic_holdings.retrieve',
api_level => 1,
@@ -722,10 +821,10 @@
next unless ( $cp->deleted eq 'f' || $cp->deleted == 0 );
- my $cp_stat = escape($cp->status->name);
- my $cp_loc = escape($cp->location->name);
- my $cp_lib = escape($cp->circ_lib->shortname);
- my $cp_bc = escape($cp->barcode);
+ my $cp_stat = $self->escape($cp->status->name);
+ my $cp_loc = $self->escape($cp->location->name);
+ my $cp_lib = $self->escape($cp->circ_lib->shortname);
+ my $cp_bc = $self->escape($cp->barcode);
push @{$holdings{$cn->label}{'copies'}}, { barcode => $cp_bc, status => $cp_stat, location => $cp_loc, circlib => $cp_lib};
@@ -814,55 +913,11 @@
}
next unless $found;
- (my $cn_class = $cn->class_name) =~ s/::/-/gso;
- $cn_class =~ s/Fieldmapper-//gso;
- my $cn_tag = sprintf("tag:open-ils.org,$year-\%0.2d-\%0.2d:$cn_class/".$cn->id, $month, $day);
-
- my $cn_lib = $cn->owning_lib->shortname;
-
- my $cn_label = $cn->label;
-
- my $xml = "<volume id='$cn_tag' lib='$cn_lib' label='$cn_label'><copies>";
-
- for my $cp (@{$cn->copies}) {
-
- next unless grep { $cp->circ_lib->id == $_ } @ou_ids;
- next unless ( $cp->deleted eq 'f' || $cp->deleted == 0 );
-
- (my $cp_class = $cp->class_name) =~ s/::/-/gso;
- $cp_class =~ s/Fieldmapper-//gso;
- my $cp_tag = sprintf("tag:open-ils.org,$year-\%0.2d-\%0.2d:$cp_class/".$cp->id, $month, $day);
-
- my $cp_stat = escape($cp->status->name);
- my $cp_loc = escape($cp->location->name);
- my $cp_lib = escape($cp->circ_lib->shortname);
- my $cp_bc = escape($cp->barcode);
-
- $xml .= "<copy id='$cp_tag' barcode='$cp_bc'><status>$cp_stat</status>".
- "<location>$cp_loc</location><circlib>$cp_lib</circlib><copy_notes>";
-
- if ($cp->notes) {
- for my $note ( @{$cp->notes} ) {
- next unless ( $note->pub eq 't' );
- $xml .= sprintf('<copy_note date="%s" title="%s">%s</copy_note>',$note->create_date, escape($note->title), escape($note->value));
- }
- }
-
- $xml .= "</copy_notes><statcats>";
-
- if ($cp->stat_cat_entries) {
- for my $sce ( @{$cp->stat_cat_entries} ) {
- next unless ( $sce->stat_cat->opac_visible eq 't' );
- $xml .= sprintf('<statcat name="%s">%s</statcat>',escape($sce->stat_cat->name) ,escape($sce->value));
- }
- }
-
- $xml .= "</statcats></copy>";
- }
-
- $xml .= "</copies></volume>";
-
- $client->respond($xml)
+ $client->respond(
+ OpenILS::Application::SuperCat::unAPI::acn
+ ->new( $cn )
+ ->as_xml({ no_record => 1 })
+ );
}
return "</volumes>";
@@ -927,6 +982,7 @@
);
sub escape {
+ my $self = shift;
my $text = shift;
$text =~ s/&/&/gsom;
$text =~ s/</</gsom;
@@ -1521,6 +1577,132 @@
}
);
+package OpenILS::Application::SuperCat::unAPI;
+use base qw/OpenILS::Application::SuperCat/;
+
+sub as_xml {
+ die "dummy superclass, use a real class";
+}
+
+sub new {
+ my $class = shift;
+ my $obj = shift;
+ return unless ($obj);
+
+ $class = ref($class) || $class;
+
+ if ($class eq __PACKAGE__) {
+ return unless (ref($obj));
+ $class .= '::' . $obj->json_hint;
+ }
+
+ return bless { obj => $obj } => $class;
+}
+
+sub obj {
+ my $self = shift;
+ return $self->{obj};
+}
+
+package OpenILS::Application::SuperCat::unAPI::acn;
+use base qw/OpenILS::Application::SuperCat::unAPI/;
+
+sub as_xml {
+ my $self = shift;
+ my $args = shift;
+
+ my $xml = '<volume xmlns="http://open-ils.org/spec/holdings/v1" ';
+
+ $xml .= 'id="tag:open-ils.org:asset-call_number/' . $self->obj->id . '" ';
+ $xml .= 'lib="' . $self->obj->owning_lib->shortname . '" ';
+ $xml .= 'label="' . $self->obj->label . '">';
+
+ if (!$args->{no_copies} && ref($self->obj->copies) && @{ $self->obj->copies }) {
+ $xml .= '<copies>' . join(
+ '',
+ map {
+ OpenILS::Application::SuperCat::unAPI
+ ->new( $_ )
+ ->as_xml({ %$args, no_volume=>1 })
+ } @{ $self->obj->copies }
+ ) . '</copies>';
+
+ } else {
+ $xml .= '<copies/>';
+ }
+
+
+ $xml .= '<owning_lib xmlns="http://open-ils.org/spec/actors/v1" ';
+ $xml .= 'id="tag:open-ils.org:actor-org_unit/' . $self->obj->owning_lib->id . '" ';
+ $xml .= 'shortname="'.$self->escape( $self->obj->owning_lib->shortname ) .'" ';
+ $xml .= 'name="'.$self->escape( $self->obj->owning_lib->name ) .'"/>';
+
+ unless ($args->{no_record}) {
+ my $rec_tag = "tag:open-ils.org:biblio-record_entry/".$self->obj->record->id.'/'.$self->escape( $self->obj->owning_lib->shortname ) ;
+
+ my $r_doc = $parser->parse_string($self->obj->record->marc);
+ $r_doc->documentElement->setAttribute( id => $rec_tag );
+ $xml .= $U->entityize($r_doc->documentElement->toString);
+ }
+
+ $xml .= '</volume>';
+
+ return $xml;
+}
+
+package OpenILS::Application::SuperCat::unAPI::acp;
+use base qw/OpenILS::Application::SuperCat::unAPI/;
+
+sub as_xml {
+ my $self = shift;
+ my $args = shift;
+
+ my $xml = '<copy xmlns="http://open-ils.org/spec/holdings/v1" ';
+
+ $xml .= 'id="tag:open-ils.org:asset-copy/' . $self->obj->id . '" ';
+ $xml .= 'barcode="' . $self->escape( $self->obj->barcode ) . '">';
+
+ $xml .= '<status>' . $self->escape( $self->obj->status->name ) . '</status>';
+ $xml .= '<location>' . $self->escape( $self->obj->location->name ) . '</location>';
+
+ $xml .= '<circlib xmlns="http://open-ils.org/spec/actors/v1" ';
+ $xml .= 'id="tag:open-ils.org:actor-org_unit/' . $self->obj->circ_lib->id . '" ';
+ $xml .= 'shortname="'.$self->escape( $self->obj->circ_lib->shortname ) .'" ';
+ $xml .= 'name="'.$self->escape( $self->obj->circ_lib->name ) .'">' . $self->escape( $self->obj->circ_lib->name ) . '</circlib>';
+
+ $xml .= "<copy_notes>";
+ if (ref($self->obj->notes) && $self->obj->notes) {
+ for my $note ( @{$self->obj->notes} ) {
+ next unless ( $note->pub eq 't' );
+ $xml .= sprintf('<copy_note date="%s" title="%s">%s</copy_note>',$note->create_date, $self->escape($note->title), $self->escape($note->value));
+ }
+ }
+
+ $xml .= "</copy_notes><statcats>";
+
+ if (ref($self->obj->stat_cat_entries) && $self->obj->stat_cat_entries) {
+ for my $sce ( @{$self->obj->stat_cat_entries} ) {
+ next unless ( $sce->stat_cat->opac_visible eq 't' );
+ $xml .= sprintf('<statcat name="%s">%s</statcat>',$self->escape($sce->stat_cat->name) ,$self->escape($sce->value));
+ }
+ }
+ $xml .= "</statcats>";
+
+ unless ($args->{no_volume}) {
+ if (ref($self->obj->call_number)) {
+ $xml .= OpenILS::Application::SuperCat::unAPI
+ ->new( $self->obj->call_number )
+ ->as_xml({ %$args, no_copies=>1 });
+ } else {
+ $xml .= '<volume/>';
+ }
+ }
+
+ $xml .= '</copy>';
+
+ return $xml;
+}
+
+
1;
-
# vim: noet:ts=4:sw=4
Modified: trunk/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm 2009-05-02 16:28:51 UTC (rev 13035)
+++ trunk/Open-ILS/src/perlmods/OpenILS/WWW/SuperCat.pm 2009-05-02 19:27:02 UTC (rev 13036)
@@ -70,7 +70,7 @@
my $rec_tag = "tag:open-ils.org,$year:$rec_class/".$cn->record->id.'/'.$cn->owning_lib->shortname;
$content .= "<volume id='$cn_tag' lib='$cn_lib' label='$cn_label'>";
- $content .= "<owning_lib xmlns:act='http://open-ils.org/spec/actors/v1' id='$ou_tag' name='$ou_name'/>";
+ $content .= "<owning_lib xmlns='http://open-ils.org/spec/actors/v1' id='$ou_tag' name='$ou_name'/>";
my $r_doc = $parser->parse_string($cn->record->marc);
$r_doc->documentElement->setAttribute( id => $rec_tag );
@@ -350,6 +350,8 @@
$type = 'metarecord' if ($1 =~ /^metabib/o);
$type = 'isbn' if ($1 =~ /^isbn/o);
$type = 'call_number' if ($1 =~ /^call_number/o);
+ $type = 'acp' if ($1 =~ /^asset-copy/o);
+ $type = 'acn' if ($1 =~ /^asset-call_number/o);
$command = 'retrieve';
$command = 'browse' if ($type eq 'call_number');
}
@@ -422,7 +424,7 @@
print "Location: $root/../../en-US/skin/default/xml/rdetail.xml?r=$id&l=$lib_id&d=$lib_depth\n\n"
if ($type eq 'record');
return 302;
- } elsif (OpenILS::WWW::SuperCat::Feed->exists($base_format)) {
+ } elsif (OpenILS::WWW::SuperCat::Feed->exists($base_format) && ($type ne 'acn' && $type ne 'acp')) {
my $feed = create_record_feed(
$type,
$format => [ $id ],
More information about the open-ils-commits
mailing list