Strip configured fields during import/overlay
authorMike Rylander <mrylander@gmail.com>
Mon, 18 Feb 2013 16:33:59 +0000 (11:33 -0500)
committerMike Rylander <mrylander@gmail.com>
Wed, 13 Mar 2013 20:34:39 +0000 (16:34 -0400)
Records coming in from the staff client may contain junk tags, and
we have a mechanism (not yet exposed) for defining such junk tags
in an inheritable way.  This applies said junk-tag removal based on
said configuration.  The configuration interface is yet to come.

Signed-off-by: Mike Rylander <mrylander@gmail.com>
Signed-off-by: Bill Erickson <berick@esilibrary.com>
Signed-off-by: Mike Rylander <mrylander@gmail.com>
Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm

index 1c397e1..8bc2cc9 100644 (file)
@@ -114,6 +114,8 @@ sub create_record_xml {
     my( $user_obj, $evt ) = $U->checksesperm($login, 'CREATE_MARC');
     return $evt if $evt;
 
+    $$oargs{import_location} = $e->requestor->ws_ou;
+
     $logger->activity("user ".$user_obj->id." creating new MARC record");
 
     my $meth = $self->method_lookup("open-ils.cat.biblio.record.xml.import");
@@ -168,6 +170,8 @@ sub biblio_record_replace_marc  {
         $oargs = {};
     }
 
+    $$oargs{import_location} = $e->requestor->ws_ou;
+
     my $res = OpenILS::Application::Cat::BibCommon->biblio_record_replace_marc(
         $e, $recid, $newxml, $source, $fix_tcn, $oargs);
 
@@ -419,6 +423,7 @@ sub biblio_record_xml_import {
     } else {
         $oargs = {};
     }
+    $$oargs{import_location} = $e->requestor->ws_ou;
     my $record = OpenILS::Application::Cat::BibCommon->biblio_record_xml_import(
         $e, $xml, $source, $auto_tcn, $oargs);
 
index 65c3e0f..babe2e0 100644 (file)
@@ -66,6 +66,18 @@ sub biblio_record_replace_marc  {
         $marcdoc = __make_marc_doc($newxml);
     }
 
+    my $import_loc = $$override{import_location};
+    my $ancestors = $U->get_org_ancestors($import_loc) if ($import_loc);
+    my $trash_tags = $e->search_vandelay_import_bib_trash_fields({owner => $ancestors}) if ($ancestors);
+
+    if ($trash_tags && @$trash_tags) {
+        for my $tag (@$trash_tags) {
+            for my $node ($marcdoc->findnodes('//*[@tag="'.$tag->field.'"]')) {
+                $node->parentNode->removeChild($node);
+            }
+        }
+    }
+
 
        $rec->source(bib_source_from_name($source)) if $source;
        $rec->editor($e->requestor->id);
@@ -95,6 +107,18 @@ sub biblio_record_xml_import {
                return $evt if $evt;
        }
 
+    my $import_loc = $$override{import_location};
+    my $ancestors = $U->get_org_ancestors($import_loc) if ($import_loc);
+    my $trash_tags = $e->search_vandelay_import_bib_trash_fields({owner => $ancestors}) if ($ancestors);
+
+    if ($trash_tags && @$trash_tags) {
+        for my $tag (@$trash_tags) {
+            for my $node ($marcdoc->findnodes('//*[@tag="'.$tag.'"]')) {
+                $node->parentNode->removeChild($node);
+            }
+        }
+    }
+
        # Silence warnings when _find_tcn_info() fails
        $tcn ||= '';
        $tcn_source ||= '';
index 5964361..776fa77 100644 (file)
@@ -16,6 +16,7 @@ use MARC::File::XML ( BinaryEncoding => 'UTF-8' );
 use Time::HiRes qw(time);
 use OpenSRF::Utils::Logger qw/$logger/;
 use MIME::Base64;
+use XML::LibXML;
 use OpenILS::Const qw/:const/;
 use OpenILS::Application::AppUtils;
 use OpenILS::Application::Cat::BibCommon;
@@ -915,6 +916,10 @@ sub import_record_list_impl {
         $rec_class = 'vqar';
     }
 
+    my $import_loc = $requestor->ws_ou;
+    my $ancestors = $U->get_org_ancestors($import_loc) if ($import_loc);
+    my $trash_tags = $editor->search_vandelay_import_bib_trash_fields({owner => $ancestors}) if ($ancestors);
+
     my $new_rec_perm_cache;
     my @success_rec_ids;
     for my $rec_id (@$rec_ids) {
@@ -951,6 +956,20 @@ sub import_record_list_impl {
             next;
         }
 
+        if ($trash_tags && @$trash_tags) {
+            my $marcxml = XML::LibXML->new->parse_string($rec->marc);
+            if ($marcxml) {
+                for my $tag (@$trash_tags) {
+                    for my $node ($marcxml->findnodes('//*[@tag="'.$tag->field.'"]')) {
+                        $node->parentNode->removeChild($node);
+                    }
+                }
+
+                $rec->marc( $U->entityize( $marcdoc->documentElement->toString ) );
+                $e->$update_func($rec);
+            }
+        }
+
         $$report_args{rec} = $rec;
         $queues{$rec->queue} = 1;