[open-ils-commits] r12815 - trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq (erickson)

svn at svn.open-ils.org svn at svn.open-ils.org
Tue Apr 7 17:07:39 EDT 2009


Author: erickson
Date: 2009-04-07 17:07:34 -0400 (Tue, 07 Apr 2009)
New Revision: 12815

Modified:
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm
   trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Picklist.pm
Log:
moved marc upload into Order.pm

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm	2009-04-07 18:31:08 UTC (rev 12814)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Order.pm	2009-04-07 21:07:34 UTC (rev 12815)
@@ -14,6 +14,7 @@
         picklist => undef,
         complete => 0
     };
+    $self->{cache} = {};
     return $self;
 }
 
@@ -24,6 +25,9 @@
 }
 sub respond {
     my($self, %other_args) = @_;
+    if($self->throttle and not %other_args) {
+        return unless ($self->progress % $self->throttle) == 0;
+    }
     $self->conn->respond({ %{$self->{args}}, %other_args });
 }
 sub respond_complete {
@@ -82,7 +86,14 @@
     return $self;
 }
 
+sub cache {
+    my($self, $org, $key, $val) = @_;
+    $self->{cache}->{$org} = {} unless $self->{cache}->{org};
+    $self->{cache}->{$org}->{$key} = $val if defined $val;
+    return $self->{cache}->{$org}->{$key};
+}
 
+
 package OpenILS::Application::Acq::Order;
 use base qw/OpenILS::Application/;
 use strict; use warnings;
@@ -95,9 +106,13 @@
 use OpenILS::Utils::Fieldmapper;
 use OpenILS::Utils::CStoreEditor q/:funcs/;
 use OpenILS::Const qw/:const/;
+use OpenSRF::EX q/:try/;
 use OpenILS::Application::AppUtils;
 use OpenILS::Application::Cat::BibCommon;
 use OpenILS::Application::Cat::AssetCommon;
+use MARC::Record;
+use MARC::Batch;
+use MARC::File::XML;
 my $U = 'OpenILS::Application::AppUtils';
 
 
@@ -259,7 +274,7 @@
     $po->create_time('now');
     $po->ordering_agency($mgr->editor->requestor->ws_ou);
     $po->$_($args{$_}) for keys %args;
-    return $mgr->editor->create_acq_purchase_order($po);
+    return $mgr->purchase_order($mgr->editor->create_acq_purchase_order($po));
 }
 
 
@@ -291,17 +306,16 @@
     # for each lineitem_detail, create the volume if necessary, create 
     # a copy, and link them all together.
     # -----------------------------------------------------------------
-    my %cache;
     for my $lid_id (@{$li_details}) {
 
         my $lid = $mgr->editor->retrieve_acq_lineitem_detail($lid_id) or return 0;
         my $org = $lid->owning_lib;
         my $label = $lid->cn_label;
 
-        $cache{$org} = {} unless $cache{$org};
-        my $volume = $cache{$org}{$label};
+        my $volume = $mgr->cache($org, "cn.$label");
         unless($volume) {
-            $volume = $cache{$org}{$label} = create_volume($li, $lid) or return 0;
+            $volume = create_volume($li, $lid) or return 0;
+            $mgr->cache($org, "cn.$label", $volume);
         }
         create_copy($mgr, $volume, $lid) or return 0;
     }
@@ -478,7 +492,8 @@
 
 	my $e = new_editor(authtoken => $auth, xact => 1);
     return $e->die_event unless $e->checkauth;
-    my $mgr = OpenILS::Application::Acq::BatchManager->new(editor => $e, conn => $conn);
+    my $mgr = OpenILS::Application::Acq::BatchManager->new(
+        editor => $e, conn => $conn, throttle => 5);
 
     my $cache = OpenSRF::Utils::Cache->new;
     my $evt;
@@ -509,11 +524,10 @@
     }
 
     if($create_po) {
-        $purchase_order = Fieldmapper::acq::purchase_order->new;
-        $purchase_order->provider($provider->id);
-        $purchase_order->ordering_agency($ordering_agency);
-        $evt = OpenILS::Application::Acq::Financials::create_purchase_order_impl($e, $purchase_order);
-        return $evt if $evt;
+        my $po = create_purchase_order($mgr, 
+            ordering_agency => $ordering_agency,
+            provider => $provider->id
+        ) or return $mgr->editor->die_event;
     }
 
     $logger->info("acq processing MARC file=$filename");
@@ -527,6 +541,7 @@
 	while(1) {
 
 	    my $r;
+		$count++;
 		$logger->info("processing record $count");
 
         try { 
@@ -534,15 +549,19 @@
         } catch Error with { $r = -1; };
 
         last unless $r;
+
+		$logger->info("found record $count");
         
         if($r == -1) {
 			$logger->warn("Proccessing of record $count in set $key failed.  Skipping this record");
-			$count++;
             next;
 		}
+		$logger->info("HERE 1 $count");
 
 		try {
 
+		    $logger->info("HERE 2 $count");
+
 			(my $xml = $r->as_xml_record()) =~ s/\n//sog;
 			$xml =~ s/^<\?xml.+\?\s*>//go;
 			$xml =~ s/>\s+</></go;
@@ -550,38 +569,40 @@
 			$xml = $U->entityize($xml);
 			$xml =~ s/[\x00-\x1f]//go;
 
-            my $li = Fieldmapper::acq::lineitem->new;
-            $li->picklist($picklist->id) if $picklist;
-            $li->purchase_order($purchase_order->id) if $purchase_order;
-            $li->source_label($provider->code); # XXX ??
-            $li->provider($provider->id);
-            $li->selector($e->requestor->id);
-            $li->creator($e->requestor->id);
-            $li->editor($e->requestor->id);
-            $li->edit_time('now');
-            $li->create_time('now');
-            $li->marc($xml);
-            $li->state('on-order') if $purchase_order;
-            $e->create_acq_lineitem($li) or die $e->die_event;
+		    $logger->info("extracted xml for record $count : $xml");
 
-			$conn->respond({count => $count}) if (++$count % 5) == 0;
-            
-            $evt = create_lineitem_details($conn, \$count, $e, $ordering_agency, $li, $purchase_order);
-            die $evt if $evt; # caught below
+            my %args = (
+                source_label => $provider->code,
+                provider => $provider->id,
+                marc => $xml,
+            );
 
+            $args{picklist} = $picklist->id if $picklist;
+            if($purchase_order) {
+                $args{purchase_order} = $purchase_order->id;
+                $args{state} = 'on-order';
+            }
+
+            my $li = create_lineitem($mgr, %args);
+            $mgr->respond;
+		    $logger->info("created lineitem");
+
+            # XXX XXX
+            #$evt = create_lineitem_details($conn, \$count, $e, $ordering_agency, $li, $purchase_order);
+            #die $evt if $evt; # caught below
+
 		} catch Error with {
 			my $error = shift;
 			$logger->warn("Encountered a bad record at Vandelay ingest: ".$error);
-		}
+		};
+
+        return $e->event if $e->died;
 	}
 
 	$e->commit;
     unlink($filename);
     $cache->delete_cache('vandelay_import_spool_' . $key);
 
-    # clear the cached funds
-    delete $fund_code_map{$_} for keys %fund_code_map;
-
 	return {
         complete => 1, 
         purchase_order => $purchase_order, 
@@ -589,6 +610,7 @@
     };
 }
 
+=head WUT WUT?
 sub create_lineitem_details {
     my($conn, $countref, $e, $ordering_agency, $li, $purchase_order) = @_;
 
@@ -663,5 +685,6 @@
     return \%compiled;
 }
 
+=cut
 
 1;

Modified: trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Picklist.pm
===================================================================
--- trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Picklist.pm	2009-04-07 18:31:08 UTC (rev 12814)
+++ trunk/Open-ILS/src/perlmods/OpenILS/Application/Acq/Picklist.pm	2009-04-07 21:07:34 UTC (rev 12815)
@@ -17,6 +17,7 @@
 use MIME::Base64;
 use Digest::MD5 qw/md5_hex/;
 use OpenILS::Application::Acq::Financials;
+use DateTime;
 
 my $U = 'OpenILS::Application::AppUtils';
 
@@ -409,111 +410,8 @@
 request open-ils.cstore open-ils.cstore.json_query.atomic {"select":{"jub":[{"transform":"count", "attregate":1, "column":"id","alias":"count"}]}, "from":"jub","where":{"picklist":1}}
 =cut
 
-__PACKAGE__->register_method(
-	method => 'zsearch',
-	api_name => 'open-ils.acq.picklist.search.z3950',
-    stream => 1,
-	signature => {
-        desc => 'Performs a z3950 federated search and creates a picklist and associated lineitems',
-        params => [
-            {desc => 'Authentication token', type => 'string'},
-            {desc => 'Search definition', type => 'object'},
-            {desc => 'Picklist name, optional', type => 'string'},
-        ]
-    }
-);
 
-sub zsearch {
-    my($self, $conn, $auth, $search, $name, $options) = @_;
-    my $e = new_editor(authtoken=>$auth);
-    return $e->event unless $e->checkauth;
-    return $e->event unless $e->allowed('CREATE_PICKLIST');
 
-    $search->{limit} ||= 10;
-    $options ||= {};
-
-    my $ses = OpenSRF::AppSession->create('open-ils.search');
-    my $req = $ses->request('open-ils.search.z3950.search_class', $auth, $search);
-
-    my $first = 1;
-    my $picklist;
-    while(my $resp = $req->recv(timeout=>60)) {
-
-        if($first) {
-            $e = new_editor(requestor=>$e->requestor, xact=>1);
-            $picklist = zsearch_build_pl($self, $conn, $auth, $e, $name);
-            $first = 0;
-        }
-
-        my $result = $resp->content;
-        my $count = $result->{count};
-        my $total = (($count < $search->{limit}) ? $count : $search->{limit})+1;
-        my $ctr = 0;
-        $conn->respond({total=>$total, progress=>++$ctr});
-
-        for my $rec (@{$result->{records}}) {
-            my $li = Fieldmapper::acq::lineitem->new;
-            $li->picklist($picklist->id);
-            $li->source_label($result->{service});
-            $li->selector($e->requestor->id);
-            $li->creator($e->requestor->id);
-            $li->editor($e->requestor->id);
-            $li->edit_time('now');
-            $li->create_time('now');
-            $li->marc($rec->{marcxml});
-            $li->state('new');
-            $li->eg_bib_id($rec->{bibid}) if $rec->{bibid};
-            $e->create_acq_lineitem($li) or return $e->die_event;
-
-            my $response = {total => $total, progress => ++$ctr};
-
-            if($$options{respond_li}) {
-                $response->{lineitem} = $li;
-                $li->attributes($e->search_acq_lineitem_attr({lineitem => $li->id}))
-                    if $$options{flesh_attrs};
-                $li->clear_marc if $$options{clear_marc};
-            }
-
-            $conn->respond($response);
-        }
-    }
-
-    $e->commit;
-    return {complete=>1, picklist_id=>$picklist->id};
-}
-
-sub zsearch_build_pl {
-    my($self, $conn, $auth, $e, $name) = @_;
-
-    $name ||= '';
-    my $picklist = $e->search_acq_picklist({owner=>$e->requestor->id, name=>$name})->[0];
-    if($name eq '' and $picklist) {
-        my $evt = delete_picklist($self, $conn, $auth, $picklist->id);
-        return $evt unless $evt == 1;
-        $picklist = undef;
-    }
-
-    unless($picklist) {
-        $picklist = Fieldmapper::acq::picklist->new;
-        $picklist->owner($e->requestor->id);
-        $picklist->creator($e->requestor->id);
-        $picklist->editor($e->requestor->id);
-        $picklist->edit_time('now');
-        $picklist->name($name);
-        $picklist->org_unit($e->requestor->ws_ou);
-        $e->create_acq_picklist($picklist) or return $e->die_event;
-
-    } else {
-        $picklist->editor($e->requestor->id);
-        $picklist->edit_time('now');
-        $e->update_acq_picklist($picklist) or return $e->die_event;
-    }
-
-    return $picklist;
-}
-
-
-
 __PACKAGE__->register_method(
 	method => 'ranged_distrib_formulas',
 	api_name	=> 'open-ils.acq.distribution_formula.ranged.retrieve',
@@ -544,119 +442,3 @@
     return undef;
 }
 
-__PACKAGE__->register_method(
-    method => 'upload_records',
-    api_name => 'open-ils.acq.process_upload_records',
-    stream => 1,
-);
-
-sub upload_records {
-    my($self, $conn, $auth, $key) = @_;
-	my $e = new_editor(authtoken => $auth, xact => 1);
-    return $e->die_event unless $e->checkauth;
-    my $cache = OpenSRF::Utils::Cache->new;
-
-    my $data = $cache->get_cache("vandelay_import_spool_$key");
-	my $purpose = $data->{purpose};
-    my $filename = $data->{path};
-    my $provider = $data->{provider};
-    my $picklist = $data->{picklist};
-    my $create_po = $data->{create_po};
-    my $ordering_agency = $data->{ordering_agency};
-    my $purchase_order;
-
-    unless(-r $filename) {
-        $logger->error("unable to read MARC file $filename");
-        $e->rollback;
-        return OpenILS::Event->new('FILE_UPLOAD_ERROR', payload => {filename => $filename});
-    }
-
-    $provider = $e->retrieve_acq_provider($provider) or return $e->die_event;
-
-    if($picklist) {
-        $picklist = $e->retrieve_acq_picklist($picklist) or return $e->die_event;
-        if($picklist->owner != $e->requestor->id) {
-            return $e->die_event unless 
-                $e->allowed('CREATE_PICKLIST', $picklist->org_unit, $picklist);
-        }
-    }
-
-    if($create_po) {
-        $purchase_order = Fieldmapper::acq::purchase_order->new;
-        $purchase_order->provider($provider->id);
-        $purchase_order->ordering_agency($ordering_agency);
-        my $evt = OpenILS::Application::Acq::Financials::create_purchase_order_impl($e, $purchase_order);
-        return $evt if $evt;
-    }
-
-    $logger->info("acq processing MARC file=$filename");
-
-    my $marctype = 'USMARC'; # ?
-	my $batch = new MARC::Batch ($marctype, $filename);
-	$batch->strict_off;
-
-	my $count = 0;
-
-	while(1) {
-
-	    my $r;
-		$logger->info("processing record $count");
-
-        try { 
-            $r = $batch->next 
-        } catch Error with { $r = -1; };
-
-        last unless $r;
-        
-        if($r == -1) {
-			$logger->warn("Proccessing of record $count in set $key failed.  Skipping this record");
-			$count++;
-            next;
-		}
-
-		try {
-
-			(my $xml = $r->as_xml_record()) =~ s/\n//sog;
-			$xml =~ s/^<\?xml.+\?\s*>//go;
-			$xml =~ s/>\s+</></go;
-			$xml =~ s/\p{Cc}//go;
-			$xml = $U->entityize($xml);
-			$xml =~ s/[\x00-\x1f]//go;
-
-            my $li = Fieldmapper::acq::lineitem->new;
-            $li->picklist($picklist->id) if $picklist;
-            $li->purchase_order($purchase_order->id) if $purchase_order;
-            $li->source_label($provider->code); # XXX ??
-            $li->provider($provider->id);
-            $li->selector($e->requestor->id);
-            $li->creator($e->requestor->id);
-            $li->editor($e->requestor->id);
-            $li->edit_time('now');
-            $li->create_time('now');
-            $li->marc($xml);
-            $li->state('on-order') if $purchase_order;
-            $e->create_acq_lineitem($li) or die $e->die_event;
-
-			$conn->respond({count => $count}) if (++$count % 5) == 0;
-
-		} catch Error with {
-			my $error = shift;
-			$logger->warn("Encountered a bad record at Vandelay ingest: ".$error);
-		}
-	}
-
-	$e->commit;
-    unlink($filename);
-    $cache->delete_cache('vandelay_import_spool_' . $key);
-
-	return {
-        complete => 1, 
-        purchase_order => $purchase_order, 
-        picklist => $picklist
-    };
-}
-
-
-
-
-1;



More information about the open-ils-commits mailing list