[open-ils-commits] [GIT] Evergreen ILS branch master updated. 0d8f90b156fd5988a1f434911a971287472211d3

Evergreen Git git at git.evergreen-ils.org
Wed Mar 13 16:40:17 EDT 2013


This is an automated email from the git hooks/post-receive script. It was
generated because a ref change was pushed to the repository containing
the project "Evergreen ILS".

The branch, master has been updated
       via  0d8f90b156fd5988a1f434911a971287472211d3 (commit)
       via  3d078db8b15becc75dcd07c6720756b720afa107 (commit)
       via  3335c54783c03cb6e6e31d26e79f22cd4adb0e0c (commit)
       via  d53538e7a19e4c3ae9265ac6a9ee32a1f8d89ec7 (commit)
       via  0589eb32f6a6f0b933c5df45c55ce47113b336fd (commit)
       via  79c30654fe76409c63db43d3a72ac0216e5e0f58 (commit)
       via  f3b354dfcb048c8d68543699fc8ac6a25e1c8e04 (commit)
       via  d4e881c77ab98065eaf40b523d0539edba28235f (commit)
      from  3ad39d5e661cf84001a2013a3a2f395e878fab71 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 0d8f90b156fd5988a1f434911a971287472211d3
Author: Mike Rylander <mrylander at gmail.com>
Date:   Wed Mar 13 16:39:15 2013 -0400

    Stamping upgrade scripts for MARC import tag stripping
    
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/sql/Pg/002.schema.config.sql b/Open-ILS/src/sql/Pg/002.schema.config.sql
index 649d665..3d83609 100644
--- a/Open-ILS/src/sql/Pg/002.schema.config.sql
+++ b/Open-ILS/src/sql/Pg/002.schema.config.sql
@@ -91,7 +91,7 @@ CREATE TRIGGER no_overlapping_deps
     BEFORE INSERT OR UPDATE ON config.db_patch_dependencies
     FOR EACH ROW EXECUTE PROCEDURE evergreen.array_overlap_check ('deprecates');
 
-INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0778', :eg_version); -- berick/senator
+INSERT INTO config.upgrade_log (version, applied_to) VALUES ('0779', :eg_version); -- berick/miker
 
 CREATE TABLE config.bib_source (
 	id		SERIAL	PRIMARY KEY,
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.strip-marc-tags.sql b/Open-ILS/src/sql/Pg/upgrade/0779.schema.strip-marc-tags.sql
similarity index 95%
rename from Open-ILS/src/sql/Pg/upgrade/XXXX.schema.strip-marc-tags.sql
rename to Open-ILS/src/sql/Pg/upgrade/0779.schema.strip-marc-tags.sql
index 3bf2835..3650d3d 100644
--- a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.strip-marc-tags.sql
+++ b/Open-ILS/src/sql/Pg/upgrade/0779.schema.strip-marc-tags.sql
@@ -1,5 +1,7 @@
 BEGIN;
 
+SELECT evergreen.upgrade_deps_block_check('0779', :eg_version);
+
 CREATE TABLE vandelay.import_bib_trash_group(
     id SERIAL PRIMARY KEY,
     owner INT NOT NULL REFERENCES actor.org_unit(id),

commit 3d078db8b15becc75dcd07c6720756b720afa107
Author: Bill Erickson <berick at esilibrary.com>
Date:   Mon Mar 4 13:26:28 2013 -0500

    Import bib trash fields : release notes
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/docs/RELEASE_NOTES_NEXT/marc-import-tag-stripping.txt b/docs/RELEASE_NOTES_NEXT/marc-import-tag-stripping.txt
new file mode 100644
index 0000000..7470dc0
--- /dev/null
+++ b/docs/RELEASE_NOTES_NEXT/marc-import-tag-stripping.txt
@@ -0,0 +1,28 @@
+MARC Import Tag Stripping
+=========================
+
+Administrators can configure MARC tags which are removed from MARC records 
+imported via Z39.50 and the Vandelay MARC Import/Export UI (ACQ and non-ACQ).  
+Tags are organized into groups.  Groups can be marked as optional or required.
+For each tag, every instance of the tag (including all subfields) are removed 
+from the record.
+
+MARC fields which are contained within required ('always_apply') tag groups
+are always removed from inbound records.  No action is needed.  Tag groups 
+which are optional will appear in MARC import interfaces (see below) allowing 
+staff to select which groups of tags to strip from incoming records at import 
+time.
+
+Interfaces Affected
+-------------------
+
+ * Admin UI
+  ** Admin => Server Administration => MARC Import Remove Fields
+ * Z39.50 Import
+  ** Cataloging => Import Record from Z39.50
+  ** Optional groups appear with the other import options
+ * Vandelay
+  ** Cataloging => MARC Import/ExportVandelay
+  ** Acquisistions => Load Order Records
+  ** Optional groups appear with the other import options
+

commit 3335c54783c03cb6e6e31d26e79f22cd4adb0e0c
Author: Bill Erickson <berick at esilibrary.com>
Date:   Mon Mar 4 10:48:12 2013 -0500

    Import bib trash fields : XUL Z39.50 UI
    
    In the Z39.50 staff search interface, staff may now select from optional
    MARC trash field groups (within the org unit range) to be applied to
    incoming Z39.50 records.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd
index a02e3ea..47cf83d 100644
--- a/Open-ILS/web/opac/locale/en-US/lang.dtd
+++ b/Open-ILS/web/opac/locale/en-US/lang.dtd
@@ -3037,6 +3037,7 @@
 <!ENTITY staff.cat.z3950.marc_import_overlay.accesskey "O">
 <!ENTITY staff.cat.z3950.result_message.marc_import.label "Import">
 <!ENTITY staff.cat.z3950.result_message.marc_import.accesskey "I">
+<!ENTITY staff.cat.z3950.strip_fields.label "Remove Fields on Import: ">
 <!ENTITY staff.pat.barcode_entry.retrieve_patron.label "Retrieve Patron">
 <!ENTITY staff.pat.barcode_entry.barcode.label "Barcode:">
 <!ENTITY staff.pat.barcode_entry.barcode.accesskey "B">
diff --git a/Open-ILS/xul/staff_client/server/cat/z3950.js b/Open-ILS/xul/staff_client/server/cat/z3950.js
index cf78b11..07763b2 100644
--- a/Open-ILS/xul/staff_client/server/cat/z3950.js
+++ b/Open-ILS/xul/staff_client/server/cat/z3950.js
@@ -33,6 +33,8 @@ cat.z3950.prototype = {
 
             obj.load_creds();
 
+            buildStripTags();
+
             JSAN.use('circ.util');
             var columns = circ.util.columns(
                 {
@@ -781,7 +783,19 @@ cat.z3950.prototype = {
 
         function save_marc (new_marcxml) {
             try {
-                var r = obj.network.simple_request('MARC_XML_RECORD_IMPORT', [ ses(), new_marcxml, biblio_source ]);
+
+                // extract the import strip groups
+                var strip_grps = dojo.query('[strip-fields-cbox]').filter(
+                    function(grp) { return grp.checked }).map(
+                    function(grp) { return grp.getAttribute('value') });
+
+                var r = obj.network.simple_request(
+                    'MARC_XML_RECORD_IMPORT', [ 
+                        ses(), new_marcxml, biblio_source, 
+                        null, null, strip_grps 
+                    ]
+                );
+
                 if (typeof r.ilsevent != 'undefined') {
                     switch(Number(r.ilsevent)) {
                         case 1704 /* TCN_EXISTS */ :
@@ -809,7 +823,10 @@ cat.z3950.prototype = {
                             obj.error.sdump('D_ERROR','option ' + p + 'chosen');
                             switch(p) {
                                 case 0:
-                                    var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ ses(), r.payload.dup_record, new_marcxml, biblio_source ]);
+                                    var r3 = obj.network.simple_request('MARC_XML_RECORD_UPDATE', [ 
+                                        ses(), r.payload.dup_record, 
+                                        new_marcxml, biblio_source, null, strip_grps 
+                                    ]);
                                     if (typeof r3.ilsevent != 'undefined') {
                                         throw(r3);
                                     } else {
@@ -830,7 +847,7 @@ cat.z3950.prototype = {
                                     var r2 = obj.network.request(
                                         api.MARC_XML_RECORD_IMPORT.app,
                                         api.MARC_XML_RECORD_IMPORT.method + '.override',
-                                        [ ses(), new_marcxml, biblio_source ]
+                                        [ ses(), new_marcxml, biblio_source, null, null, strip_grps ]
                                     );
                                     if (typeof r2.ilsevent != 'undefined') {
                                         throw(r2);
@@ -950,7 +967,14 @@ cat.z3950.prototype = {
         function overlay_marc (new_marcxml) {
             try {
                 if (! obj.confirm_overlay( [ obj.data.marked_record ] ) ) { return; }
-                var r = obj.network.simple_request('MARC_XML_RECORD_REPLACE', [ ses(), obj.data.marked_record, new_marcxml, biblio_source ]);
+
+                var strip_grps = dojo.query('[strip-fields-cbox]').filter(
+                    function(grp) { return grp.checked }).map(
+                    function(grp) { return grp.getAttribute('value') });
+
+                var r = obj.network.simple_request('MARC_XML_RECORD_REPLACE', 
+                    [ ses(), obj.data.marked_record, new_marcxml, biblio_source, null, strip_grps ]);
+
                 if (typeof r.ilsevent != 'undefined') {
                     switch(Number(r.ilsevent)) {
                         case 1704 /* TCN_EXISTS */ :
@@ -979,7 +1003,8 @@ cat.z3950.prototype = {
                                     var r2 = obj.network.request(
                                         api.MARC_XML_RECORD_REPLACE.app,
                                         api.MARC_XML_RECORD_REPLACE.method + '.override',
-                                        [ ses(), obj.data.marked_record, new_marcxml, biblio_source ]
+                                        [ ses(), obj.data.marked_record, new_marcxml, 
+                                            biblio_source, null, strip_grps ]
                                     );
                                     if (typeof r2.ilsevent != 'undefined') {
                                         throw(r2);
@@ -1155,4 +1180,49 @@ cat.z3950.prototype = {
     },
 }
 
+function buildStripTags() {
+
+    // give me every non-always-apply trash field 
+    // group owned at my workstation or ancestor,
+    var query = {   
+        always_apply : 'f',                                                
+        owner : {'in' : {
+            select : {aou : [{
+                column : 'id',
+                transform : 'actor.org_unit_ancestors', 
+                result_field : 'id'
+            }]},
+            from : 'aou',
+            where : {id : ses('ws_ou')}}
+        }
+    };
+
+    fieldmapper.standardRequest(
+        ['open-ils.pcrud', 'open-ils.pcrud.search.vibtg.atomic'],
+        {   async : true,
+            params : [ses(), query, {order_by : {vibtg : ['label']}}],
+            oncomplete : function(r) {
+                var resp = r.recv();
+                if (resp) buildStripTags2(resp.content());
+            }
+        }
+    );
+}
+
+function buildStripTags2(grps) {
+    if (!grps || grps.length == 0) return;
+
+    $('strip-fields-hbox').className = '';
+
+    dojo.forEach(grps, function(grp) {
+        var cbox = dojo.create('checkbox', {
+            label : grp.label(), 
+            value : grp.id(),
+            'strip-fields-cbox' : 1
+        });
+        dojo.place(cbox, $('strip-fields-hbox'));
+    });
+}
+
+
 dump('exiting cat.z3950.js\n');
diff --git a/Open-ILS/xul/staff_client/server/cat/z3950.xul b/Open-ILS/xul/staff_client/server/cat/z3950.xul
index 7c02ef4..5f8b217 100644
--- a/Open-ILS/xul/staff_client/server/cat/z3950.xul
+++ b/Open-ILS/xul/staff_client/server/cat/z3950.xul
@@ -166,6 +166,10 @@
                 <hbox>
                     <hbox id="result_message" />
                     <spacer flex="1"/>
+                    <hbox id="strip-fields-hbox" class='hideme' 
+                            style='border:1px solid #CCC; margin-right:10px;'>
+                        <label value="&staff.cat.z3950.strip_fields.label;"/>
+                    </hbox>
                     <label id="overlay_tcn_indicator"/>
                 </hbox>
                 <description>

commit d53538e7a19e4c3ae9265ac6a9ee32a1f8d89ec7
Author: Bill Erickson <berick at esilibrary.com>
Date:   Fri Mar 1 14:55:15 2013 -0500

    Import bib trash field Vandelay UI
    
    During bib record import, if any optional MARC trash field groups exist
    (in the org unit range), a new multi-select option is displayed allowing
    the user to specify which trash field groups should be applied to the
    current record import/merge/overlay.
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/templates/vandelay/inc/queue.tt2 b/Open-ILS/src/templates/vandelay/inc/queue.tt2
index f33d682..0d8be97 100644
--- a/Open-ILS/src/templates/vandelay/inc/queue.tt2
+++ b/Open-ILS/src/templates/vandelay/inc/queue.tt2
@@ -1,3 +1,6 @@
+<style type="text/css">
+    @import "[% ctx.media_prefix %]/js/dojo/dojox/form/resources/CheckedMultiSelect.css";
+</style>
 <div dojoType="dijit.layout.ContentPane" layoutAlign='client' style='margin-top:10px;'>
     <fieldset id='vl-queue-filter-fieldset'>
         <legend>[% l('Queue ') %]<span style='font-style:italic;' id='vl-queue-summary-name'></span></legend>
@@ -237,6 +240,16 @@
                         <div jsId='vlUploadFtMergeProfile2' dojoType='dijit.form.FilteringSelect' required='false' labelAttr='name' searchAttr='name'></div>
                     </td>
                 </tr>
+                <tr id='vl-trash-groups-row2'>
+                    <td>[% l('Remove MARC Field Groups') %]</td>
+                    <td colspan='4'>
+                        <select style='overflow-y:auto;' multiple='true' 
+                            jsId="vlUploadTrashGroups2" 
+                            dojoType="dojox.form.CheckedMultiSelect">
+                        </select>
+                    </td>
+                </tr>
+
                 <tr>
                     <td>
                         <button dojoType='dijit.form.Button' jsId='queueItemsImportCancelButton'>[% l('Cancel') %]</button>
diff --git a/Open-ILS/src/templates/vandelay/inc/upload.tt2 b/Open-ILS/src/templates/vandelay/inc/upload.tt2
index caae6dc..0203306 100644
--- a/Open-ILS/src/templates/vandelay/inc/upload.tt2
+++ b/Open-ILS/src/templates/vandelay/inc/upload.tt2
@@ -89,6 +89,15 @@
                 <div jsId='vlUploadFtMergeProfile' dojoType='dijit.form.FilteringSelect' required='false' labelAttr='name' searchAttr='name'></div>
             </td>
         </tr>
+        <tr id='vl-trash-groups-row'>
+            <td>[% l('Remove MARC Field Groups') %]</td>
+            <td colspan='4'>
+                <select style='overflow-y:auto; height:6em; width:12em' multiple='true' 
+                    jsId="vlUploadTrashGroups" 
+                    dojoType="dojox.form.CheckedMultiSelect">
+                </select>
+            </td>
+        </tr>
 
         <tr><td colspan='2' style='border-bottom:2px solid #888;'></td></tr>
         <tr><td colspan='2' style='padding-bottom: 10px;'></td></tr>
diff --git a/Open-ILS/web/js/ui/default/vandelay/vandelay.js b/Open-ILS/web/js/ui/default/vandelay/vandelay.js
index 26ca3cc..bc82bca 100644
--- a/Open-ILS/web/js/ui/default/vandelay/vandelay.js
+++ b/Open-ILS/web/js/ui/default/vandelay/vandelay.js
@@ -44,6 +44,7 @@ dojo.require('openils.widget.OrgUnitFilteringSelect');
 dojo.require('openils.widget.AutoGrid');
 dojo.require('openils.widget.AutoFieldWidget');
 dojo.require('openils.widget.ProgressDialog');
+dojo.require('dojox.form.CheckedMultiSelect');
 
 
 var globalDivs = [
@@ -87,11 +88,12 @@ var cgi = new openils.CGI();
 var vlQueueGridColumePicker = {};
 var vlBibSources = [];
 var importItemDefs = [];
-var matchSets = {};
+var matchSets = {biblio : [], authority : []};
 var mergeProfiles = [];
 var copyStatusCache = {};
 var copyLocationCache = {};
 var localeStrings;
+var trashGroups = [];
 
 // org settings
 var orgSettings = {};
@@ -106,7 +108,7 @@ function vlInit() {
     localeStrings = dojo.i18n.getLocalization("openils.vandelay", "vandelay");
 
     authtoken = openils.User.authtoken;
-    var initNeeded = 8; // how many async responses do we need before we're init'd 
+    var initNeeded = 9; // how many async responses do we need before we're init'd 
     var initCount = 0; // how many async reponses we've received
 
     openils.Util.registerEnterHandler(
@@ -210,7 +212,39 @@ function vlInit() {
         {   async: true,
             oncomplete: function(r) {
                 var stats = openils.Util.readResponse(r);
-                dojo.forEach(stats, function(stat){copyStatusCache[stat.id()] = stat});
+                dojo.forEach(stats, 
+                    function(stat){copyStatusCache[stat.id()] = stat});
+                checkInitDone();
+            }
+        }
+    );
+
+    new openils.PermaCrud().search('vibtg',
+        {   always_apply : 'f',
+            owner: owner.map(function(org) { return org.id(); })
+        }, 
+        {   order_by : {vibtg : ['label']},
+            async: true,
+            oncomplete: function(r) {
+                trashGroups = openils.Util.readResponse(r);
+
+                if (trashGroups.length == 0) {
+                    openils.Util.hide('vl-trash-groups-row');
+                    openils.Util.hide('vl-trash-groups-row2');
+                    checkInitDone();
+                    return;
+                }
+
+                dojo.forEach(trashGroups, function(grp) {
+                    var sn = fieldmapper.aou.findOrgUnit(grp.owner()).shortname();
+                    var opt = {
+                        label : grp.label() + '&nbsp;(' + sn + ')',
+                        value : grp.id()
+                    };
+                    vlUploadTrashGroups.addOption(opt);
+                    vlUploadTrashGroups2.addOption(opt);
+                });
+
                 checkInitDone();
             }
         }
@@ -1189,6 +1223,12 @@ function vlHandleQueueItemsAction(action) {
             vlUploadQueueAutoOverlayBestMatch.attr('value',  vlUploadQueueAutoOverlayBestMatch2.attr('value'));
             vlUploadQueueAutoOverlayBestMatchRatio.attr('value',  vlUploadQueueAutoOverlayBestMatchRatio2.attr('value'));
 
+            // attr('value') and various other incantations won't let me set 
+            // the value on the checkedmultiselect, so we temporarily swap 
+            // the dijits instead.
+            var tmpTrashGroup = vlUploadTrashGroups;
+            vlUploadTrashGroups = vlUploadTrashGroups2;
+
             if(action == 'import') {
                 vlImportSelectedRecords();
             } else if(action == 'import_all') {
@@ -1206,21 +1246,27 @@ function vlHandleQueueItemsAction(action) {
             vlUploadMergeProfile2.attr('value', '');
             vlUploadFtMergeProfile.attr('value', '');
             vlUploadFtMergeProfile2.attr('value', '');
+            vlUploadTrashGroups.attr('value', '');
+            vlUploadTrashGroups2.attr('value', '');
             vlUploadQueueAutoOverlayBestMatch.attr('value', false);
             vlUploadQueueAutoOverlayBestMatch2.attr('value', false);
             vlUploadQueueAutoOverlayBestMatchRatio.attr('value', '0.0');
             vlUploadQueueAutoOverlayBestMatchRatio2.attr('value', '0.0');
+
+            // and... swap them back
+            vlUploadTrashGroups2 = vlUploadTrashGroups;
+            vlUploadTrashGroups = tmpTrashGroup;
         }
     );
 
-    queueItemsImportDialog.show();
-}
-
-function vlHandleCreateBucket() {
+    if (currentType.match(/auth/) || trashGroups.length == 0) {
+        openils.Util.hide('vl-trash-groups-row2');
+    } else {
+        openils.Util.show('vl-trash-groups-row2', 'table-row');
+    }
 
-    create-bucket-dialog-name
+    queueItemsImportDialog.show();
 }
-    
 
 /* import user-selected records */
 function vlImportSelectedRecords() {
@@ -1296,6 +1342,10 @@ function vlImportRecordQueue(type, queueId, recList, onload) {
         options.fall_through_merge_profile = ftprofile;
     }
 
+    var strip_grps = vlUploadTrashGroups.attr('value');
+    if (strip_grps != null && strip_grps.length) {
+        options.strip_field_groups = strip_grps;
+    }
 
     /* determine which method we're calling */
 
@@ -1465,6 +1515,12 @@ function vlShowUploadForm() {
         new dojo.data.ItemFileReadStore({data:viiad.toStoreData(importItemDefs)});
     vlUpdateMatchSetSelector(vlUploadRecordType.getValue());
 
+    if (vlUploadRecordType.attr('value').match(/auth/) || trashGroups.length == 0) {
+        openils.Util.hide('vl-trash-groups-row');
+    } else {
+        openils.Util.show('vl-trash-groups-row', 'table-row');
+    }
+
     // use ratio from the merge profile if it's set
     dojo.connect(
         vlUploadMergeProfile, 
@@ -1486,6 +1542,25 @@ function vlShowUploadForm() {
                vlUploadQueueAutoOverlayBestMatchRatio2.attr('value', profile.lwm_ratio()+''); 
         }
     );
+}
+
+function vlDeleteSelectedQueues() {
+    var checkboxes = document.getElementById('vlQueueSelectList').getElementsByTagName('input');
+    var type = vlQueueSelectType.attr('value').replace(/-.*/, '');
+    for(var i = 0; i < checkboxes.length; i++) {
+        if(checkboxes[i].getAttribute('name') == 'delete' && checkboxes[i].checked) {
+            vlDeleteQueue(type, checkboxes[i].getAttribute('value'), function () {});
+        }
+    }
+    window.location.reload();
+}
+
+function vlShowQueueSelect() {
+    displayGlobalDiv('vl-queue-select-div');
+    var type = vlQueueSelectType.attr('value');
+    var data = vlGetQueueData(type, false);
+    type = type.replace(/-.*/, ''); // To remove any sub-typeish info.
+    var tbody = document.getElementById('vlQueueSelectList');
 
 }
 

commit 0589eb32f6a6f0b933c5df45c55ce47113b336fd
Author: Bill Erickson <berick at esilibrary.com>
Date:   Fri Mar 1 11:01:08 2013 -0500

    Import bib trash field group admin UI
    
    Staff client admin UI for managing MARC import trash fields.
    
    Admin => Server Admin => MARC Import Remove Fields
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/templates/conify/global/vandelay/import_bib_trash_group.tt2 b/Open-ILS/src/templates/conify/global/vandelay/import_bib_trash_group.tt2
new file mode 100644
index 0000000..e77a826
--- /dev/null
+++ b/Open-ILS/src/templates/conify/global/vandelay/import_bib_trash_group.tt2
@@ -0,0 +1,104 @@
+[% WRAPPER base.tt2 %]
+[% ctx.page_title = l('Import Bib Trash Groups') %]
+<script type="text/javascript" 
+    src='[% ctx.media_prefix %]/js/ui/default/conify/global/vandelay/import_bib_trash_group.js'>
+</script>
+
+<div dojoType="dijit.layout.ContentPane" layoutAlign="client">
+
+[%  grp_id = ctx.page_args.0 %]
+
+<script>var grp_id = '[% grp_id %]'</script>
+
+[% IF grp_id %]
+
+    <div dojoType="dijit.layout.ContentPane" 
+            layoutAlign="top" class='oils-header-panel'>
+        <div><span id='trash-group-name'></span></div>
+        <div>
+            <button dojoType='dijit.form.Button' 
+                onClick='tfGrid.showCreateDialog()'>[% l('New Field') %]
+            </button>
+            <button dojoType='dijit.form.Button' 
+                onClick='tfGrid.deleteSelected()'>[% l('Delete Selected') %]
+            </button>
+        </div>
+    </div>
+    <div>
+        <button 
+            onClick="location.href = location.href.replace(/\/[^\/]+$/, '')">
+            [% l('Return to Groups') %]
+        </button>
+    </div>
+    <br/>
+
+    <!-- field grid -->
+
+    <table
+        id="tfGrid"
+        jsid="tfGrid"
+        dojoType="openils.widget.FlattenerGrid"
+        columnPersistKey='"conify.vandelay.import_bib_trash_fields"'
+        autoHeight="true"
+        editOnEnter="true"
+        editStyle="pane"
+        showLoadFilter="true"
+        fmClass="'vibtf'"
+        defaultSort="['label']"
+        query="{grp: grp_id}">
+        <thead>
+            <tr>
+                <th field="id" fpath="id" ffilter="true"/>
+                <th field="field" fpath="field" ffilter="true"/>
+            </tr>
+        </thead>
+    </table>
+
+[% ELSE %]
+
+    <div dojoType="dijit.layout.ContentPane" 
+            layoutAlign="top" class='oils-header-panel'>
+
+        <div>[% l('Import Bib Trash Fields') %]</div>
+        <div>
+            <button dojoType='dijit.form.Button' 
+                    onClick='tgGrid.showCreateDialog()'>
+                [% l('New Field Group') %]
+            </button>
+            <button dojoType='dijit.form.Button' 
+                    onClick='tgGrid.deleteSelected()'>
+                [% l('Delete Selected') %]
+            </button>
+        </div>
+    </div>
+
+    <!-- group grid -->
+
+    <table
+        id="tgGrid"
+        jsid="tgGrid"
+        dojoType="openils.widget.FlattenerGrid"
+        columnPersistKey='"conify.vandelay.import_bib_trash_group"'
+        autoHeight="true"
+        editOnEnter="true"
+        editStyle="pane"
+        showLoadFilter="true"
+        fmClass="'vibtg'"
+        defaultSort="['label']"
+        query="{id:{'!=':null}}">
+        <thead>
+            <tr>
+                <th field="id" fpath="id" ffilter="true" formatter="format_grp"/>
+                <th field="owner" fpath="owner.shortname" ffilter="true"/>
+                <th field="label" fpath="label" ffilter="true"/>
+                <th field="always_apply" fpath="always_apply" ffilter="true"/>
+            </tr>
+        </thead>
+    </table>
+
+[% END %]
+
+</div>
+
+[% END %]
+
diff --git a/Open-ILS/web/js/ui/default/conify/global/vandelay/import_bib_trash_group.js b/Open-ILS/web/js/ui/default/conify/global/vandelay/import_bib_trash_group.js
new file mode 100644
index 0000000..1cd2bec
--- /dev/null
+++ b/Open-ILS/web/js/ui/default/conify/global/vandelay/import_bib_trash_group.js
@@ -0,0 +1,32 @@
+dojo.require('openils.Util');
+dojo.require('openils.PermaCrud');
+dojo.require('openils.widget.FlattenerGrid');
+dojo.require('openils.widget.OrgUnitFilteringSelect');
+
+
+function init() {
+    if (!grp_id) return;
+
+    new openils.PermaCrud().retrieve(
+        'vibtg', grp_id, {
+            oncomplete : function(r) {
+                init2(openils.Util.readResponse(r));
+            }
+        }
+    );
+}
+
+function init2(grp) {
+    dojo.byId('trash-group-name').innerHTML = grp.label();
+    tfGrid.overrideEditWidgets.grp = new dijit.form.TextBox({
+        value : grp.id(),
+        disabled : true
+    });
+}
+
+function format_grp(val) {
+    return '<a href="' + location.href + 
+        '/' + escape(val) + '">' + val + '</a>';
+}
+
+openils.Util.addOnLoad(init);
diff --git a/Open-ILS/web/opac/locale/en-US/lang.dtd b/Open-ILS/web/opac/locale/en-US/lang.dtd
index 0f6b2fe..a02e3ea 100644
--- a/Open-ILS/web/opac/locale/en-US/lang.dtd
+++ b/Open-ILS/web/opac/locale/en-US/lang.dtd
@@ -775,6 +775,7 @@
 <!ENTITY staff.main.menu.admin.server_admin.conify.config_hard_due_date "Hard Due Date Changes">
 <!ENTITY staff.main.menu.admin.server_admin.conify.config_rule_circ_duration "Circulation Duration Rules">
 <!ENTITY staff.main.menu.admin.server_admin.conify.config_best_hold_order "Best-Hold Selection Sort Order">
+<!ENTITY staff.main.menu.admin.server_admin.conify.vandelay_import_bib_trash_group "MARC Import Remove Fields">
 <!ENTITY staff.main.menu.admin.server_admin.conify.config_rule_recurring_fine "Circulation Recurring Fine Rules">
 <!ENTITY staff.main.menu.admin.server_admin.conify.config_rule_max_fine "Circulation Max Fine Rules">
 <!ENTITY staff.main.menu.admin.server_admin.conify.config_rule_age_hold_protect "Age Hold Protect Rules">
diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu.js b/Open-ILS/xul/staff_client/chrome/content/main/menu.js
index 316c033..aab9000 100644
--- a/Open-ILS/xul/staff_client/chrome/content/main/menu.js
+++ b/Open-ILS/xul/staff_client/chrome/content/main/menu.js
@@ -796,6 +796,10 @@ main.menu.prototype = {
                 ['oncommand'],
                 function(event) { open_eg_web_page('conify/global/config/best_hold_order', null, event); }
             ],
+			'cmd_server_admin_vandelay_import_bib_trash_group' : [
+                ['oncommand'],
+                function(event) { open_eg_web_page('conify/global/vandelay/import_bib_trash_group', null, event); }
+            ],
             'cmd_server_admin_config_usr_activity_type' : [
                 ['oncommand'],
                 function(event) { open_eg_web_page('conify/global/config/usr_activity_type', null, event); }
diff --git a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
index 0081bec..2d274a6 100644
--- a/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
+++ b/Open-ILS/xul/staff_client/chrome/content/main/menu_frame_menus.xul
@@ -327,6 +327,9 @@
              />
     <command id="cmd_server_admin_conify_remote_account"
              perm="ADMIN_CONFIG_REMOTE_ACCOUNT VIEW_CONFIG_REMOTE_ACCOUNT"
+            />
+    <command id="cmd_server_admin_vandelay_import_bib_trash_group"
+             perm="CREATE_IMPORT_TRASH_FIELD UPDATE_IMPORT_TRASH_FIELD DELETE_IMPORT_TRASH_FIELD"
              />
 
     <command id="cmd_hotkeys_toggle" />
@@ -639,6 +642,7 @@
                 <menuitem label="&staff.main.menu.admin.server_admin.conify.config_asset_sip_fields;" command="cmd_server_admin_config_asset_sip_fields"/>
                 <menuitem label="&staff.main.menu.admin.server_admin.conify.config_usr_activity_type;" command="cmd_server_admin_config_usr_activity_type"/>
                 <menuitem label="&staff.main.menu.admin.server_admin.conify.config_best_hold_order;" command="cmd_server_admin_config_best_hold_order"/>
+                <menuitem label="&staff.main.menu.admin.server_admin.conify.vandelay_import_bib_trash_group;" command="cmd_server_admin_vandelay_import_bib_trash_group"/>
                 <menuitem label="&staff.main.menu.admin.server_admin.conify.actor.org_unit_custom_tree;" command="cmd_server_admin_actor_org_unit_custom_tree"/>
                 <menuitem label="&staff.main.menu.admin.server_admin.conify.config.remote_account;" command="cmd_server_admin_conify_remote_account"/>
                 <menu id="main.menu.admin.server.acq" label="&staff.main.menu.admin.server_admin.acq.label;" accesskey="&staff.main.menu.admin.server_admin.acq.accesskey;">

commit 79c30654fe76409c63db43d3a72ac0216e5e0f58
Author: Bill Erickson <berick at esilibrary.com>
Date:   Thu Feb 28 15:43:08 2013 -0500

    Strip configured fields during import/overlay II
    
    Support on-demand and always-apply strip groups.  Move stripping out to
    shared util function.
    
    Specifically, this adds support for optional strip-groups to these APIs:
    
    open-ils.cat.biblio.record.xml.create
    open-ils.cat.biblio.record.marc.replace
    open-ils.cat.biblio.record.xml.import
    open-ils.vandelay.bib_record.list.import
    open-ils.vandelay.bib_queue.import
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
index b8124f2..87b53ec 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/AppUtils.pm
@@ -2081,5 +2081,43 @@ sub datecmp {
 }
 
 
+# marcdoc is an XML::LibXML document
+# updates the doc and returns the entityized MARC string
+sub strip_marc_fields {
+    my ($class, $e, $marcdoc, $grps) = @_;
+    
+    my $orgs = $class->get_org_ancestors($e->requestor->ws_ou);
+
+    my $query = {
+        select  => {vibtf => ['field']},
+        from    => {vibtf => 'vibtg'},
+        where   => {'+vibtg' => {owner => $orgs}},
+        distinct => 1
+    };
+
+    # give me always-apply groups plus any selected groups
+    if ($grps and @$grps) {
+        $query->{where}->{'+vibtg'}->{'-or'} = [
+            {id => $grps},
+            {always_apply => 't'}
+        ];
+
+    } else {
+        $query->{where}->{'+vibtg'}->{always_apply} = 't';
+    }
+
+    my $fields = $e->json_query($query);
+
+    for my $field (@$fields) {
+        my $tag = $field->{field};
+        for my $node ($marcdoc->findnodes('//*[@tag="'.$tag.'"]')) {
+            $node->parentNode->removeChild($node);
+        }
+    }
+
+	return $class->entityize($marcdoc->documentElement->toString);
+}
+
+
 1;
 
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
index 8bc2cc9..fbf140a 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
@@ -106,7 +106,7 @@ __PACKAGE__->register_method(
 );
 
 sub create_record_xml {
-    my( $self, $client, $login, $xml, $source, $oargs ) = @_;
+    my( $self, $client, $login, $xml, $source, $oargs, $strip_grps ) = @_;
 
     my $override = 1 if $self->api_name =~ /override/;
     $oargs = { all => 1 } unless defined $oargs;
@@ -114,8 +114,6 @@ 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");
@@ -123,7 +121,7 @@ sub create_record_xml {
     $meth = $self->method_lookup(
         "open-ils.cat.biblio.record.xml.import.override") if $override;
 
-    my ($s) = $meth->run($login, $xml, $source, $oargs);
+    my ($s) = $meth->run($login, $xml, $source, $oargs, $strip_grps);
     return $s;
 }
 
@@ -158,7 +156,7 @@ __PACKAGE__->register_method(
 );
 
 sub biblio_record_replace_marc  {
-    my( $self, $conn, $auth, $recid, $newxml, $source, $oargs ) = @_;
+    my( $self, $conn, $auth, $recid, $newxml, $source, $oargs, $strip_grps ) = @_;
     my $e = new_editor(authtoken=>$auth, xact=>1);
     return $e->die_event unless $e->checkauth;
     return $e->die_event unless $e->allowed('UPDATE_MARC', $e->requestor->ws_ou);
@@ -170,10 +168,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);
+        $e, $recid, $newxml, $source, $fix_tcn, $oargs, $strip_grps);
 
     $e->commit unless $U->event_code($res);
 
@@ -413,7 +409,7 @@ __PACKAGE__->register_method(
 
 
 sub biblio_record_xml_import {
-    my( $self, $client, $authtoken, $xml, $source, $auto_tcn, $oargs) = @_;
+    my( $self, $client, $authtoken, $xml, $source, $auto_tcn, $oargs, $strip_grps) = @_;
     my $e = new_editor(xact=>1, authtoken=>$authtoken);
     return $e->die_event unless $e->checkauth;
     return $e->die_event unless $e->allowed('IMPORT_MARC', $e->requestor->ws_ou);
@@ -423,9 +419,8 @@ 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);
+        $e, $xml, $source, $auto_tcn, $oargs, $strip_grps);
 
     return $record if $U->event_code($record);
 
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
index babe2e0..7f7ade7 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
@@ -36,7 +36,7 @@ sub fetch_bib_sources {
 
 
 sub biblio_record_replace_marc  {
-	my($class, $e, $recid, $newxml, $source, $fixtcn, $override) = @_;
+	my($class, $e, $recid, $newxml, $source, $fixtcn, $override, $strip_grps) = @_;
 
     $override = { all => 1 } if($override && !ref $override);
     $override = { all => 0 } if(!ref $override);
@@ -66,30 +66,19 @@ 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);
-            }
-        }
-    }
-
+    my $marc = $U->strip_marc_fields($e, $marcdoc, $strip_grps);
 
 	$rec->source(bib_source_from_name($source)) if $source;
 	$rec->editor($e->requestor->id);
 	$rec->edit_date('now');
-	$rec->marc( $U->entityize( $marcdoc->documentElement->toString ) );
+	$rec->marc($marc);
 	$e->update_biblio_record_entry($rec) or return $e->die_event;
 
 	return $rec;
 }
 
 sub biblio_record_xml_import {
-	my($class, $e, $xml, $source, $auto_tcn, $override) = @_;
+	my($class, $e, $xml, $source, $auto_tcn, $override, $strip_grps) = @_;
 
     $override = { all => 1 } if($override && !ref $override);
     $override = { all => 0 } if(!ref $override);
@@ -107,24 +96,14 @@ 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 ||= '';
 	$logger->info("user ".$e->requestor->id.
 		" creating new biblio entry with tcn=$tcn and tcn_source $tcn_source");
 
+    my $marc = $U->strip_marc_fields($e, $marcdoc, $strip_grps);
+
 	my $record = Fieldmapper::biblio::record_entry->new;
 
 	$record->source(bib_source_from_name($source)) if $source;
@@ -134,7 +113,7 @@ sub biblio_record_xml_import {
 	$record->editor($e->requestor->id);
 	$record->create_date('now');
 	$record->edit_date('now');
-	$record->marc($U->entityize($marcdoc->documentElement->toString));
+	$record->marc($marc);
 
     $record = $e->create_biblio_record_entry($record) or return $e->die_event;
 
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
index 776fa77..6796447 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
@@ -886,6 +886,7 @@ sub import_record_list_impl {
     my $ft_merge_profile = $$args{fall_through_merge_profile};
     my $bib_source = $$args{bib_source};
     my $import_no_match = $$args{import_no_match};
+    my $strip_grps = $$args{strip_field_groups}; # bib-only
 
     my $overlay_func = 'vandelay.overlay_bib_record';
     my $auto_overlay_func = 'vandelay.auto_overlay_bib_record';
@@ -916,10 +917,6 @@ 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) {
@@ -956,26 +953,25 @@ 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;
 
         my $record;
         my $imported = 0;
 
+        if ($type eq 'bib') {
+            # strip configured / selected MARC tags from inbound records
+
+            my $marcdoc = XML::LibXML->new->parse_string($rec->marc);
+            $rec->marc($U->strip_marc_fields($e, $marcdoc, $strip_grps));
+
+            unless ($e->$update_func($rec)) {
+                $$report_args{evt} = $e->die_event;
+                finish_rec_import_attempt($report_args);
+                next;
+            }
+        }
+
         if(defined $overlay_target) {
             # Caller chose an explicit overlay target
 

commit f3b354dfcb048c8d68543699fc8ac6a25e1c8e04
Author: Mike Rylander <mrylander at gmail.com>
Date:   Mon Feb 18 11:33:59 2013 -0500

    Strip configured fields during import/overlay
    
    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 at gmail.com>
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
index 1c397e1..8bc2cc9 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat.pm
@@ -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);
 
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
index 65c3e0f..babe2e0 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Cat/BibCommon.pm
@@ -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 ||= '';
diff --git a/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm b/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
index 5964361..776fa77 100644
--- a/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
+++ b/Open-ILS/src/perlmods/lib/OpenILS/Application/Vandelay.pm
@@ -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;
 

commit d4e881c77ab98065eaf40b523d0539edba28235f
Author: Bill Erickson <berick at esilibrary.com>
Date:   Wed Feb 27 15:32:56 2013 -0500

    MARC import tag stripping : SQL / IDL
    
    * Adds a new table vandelay.import_bib_trash_group for grouping "trash"
      fields.  Groups may be optional or "always_apply".  Always-apply groups
      contain MARC fields which are to be unconditionally removed during
      import.
    
    * Updates vandelay.import_bib_trash_fields for putting them into groups.
    
    * IDL changes to accommodate the above
    
    Signed-off-by: Bill Erickson <berick at esilibrary.com>
    Signed-off-by: Mike Rylander <mrylander at gmail.com>

diff --git a/Open-ILS/examples/fm_IDL.xml b/Open-ILS/examples/fm_IDL.xml
index 1380f85..4d8a299 100644
--- a/Open-ILS/examples/fm_IDL.xml
+++ b/Open-ILS/examples/fm_IDL.xml
@@ -216,10 +216,43 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 	<class id="vibtf" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="vandelay::import_bib_trash_fields" oils_persist:tablename="vandelay.import_bib_trash_fields" reporter:label="Import/Overlay Fields for Removal">
 		<fields oils_persist:primary="id" oils_persist:sequence="vandelay.import_bib_trash_fields_id_seq">
 			<field reporter:label="Field ID" name="id" reporter:datatype="id"/>
-			<field reporter:label="Owner" name="owner" reporter:datatype="link"/>
+			<field reporter:label="Group" name="grp" reporter:datatype="link"/>
 			<field reporter:label="Field" name="field" reporter:datatype="text"/>
 		</fields>
 		<links>
+			<link field="grp" reltype="has_a" key="id" map="" class="vibtg"/>
+		</links>
+		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
+			<actions>
+				<create permission="CREATE_IMPORT_TRASH_FIELD">
+                    <context link="grp" field="owner"/>
+                </create>
+				<retrieve permission="CREATE_IMPORT_TRASH_FIELD UPDATE_IMPORT_TRASH_FIELD DELETE_IMPORT_TRASH_FIELD">
+                    <context link="grp" field="owner"/>
+                </retrieve>
+				<update permission="UPDATE_IMPORT_TRASH_FIELD">
+                    <context link="grp" field="owner"/>
+                </update>
+				<delete permission="DELETE_IMPORT_TRASH_FIELD">
+                    <context link="grp" field="owner"/>
+                </delete>
+			</actions>
+		</permacrud>
+	</class>
+
+	<class  id="vibtg" 
+            controller="open-ils.cstore open-ils.pcrud" 
+            oils_obj:fieldmapper="vandelay::import_bib_trash_group" 
+            oils_persist:tablename="vandelay.import_bib_trash_group" 
+            reporter:label="Import/Overlay Field Groups for Removal">
+		<fields oils_persist:primary="id" 
+                oils_persist:sequence="vandelay.import_bib_trash_group_id_seq">
+			<field reporter:label="ID" name="id" reporter:datatype="id" reporter:selector="name"/>
+			<field reporter:label="Owner" name="owner" reporter:datatype="link"/>
+			<field reporter:label="Label" name="label" reporter:datatype="text"/>
+			<field reporter:label="Always Apply" name="always_apply" reporter:datatype="bool"/>
+		</fields>
+		<links>
 			<link field="owner" reltype="has_a" key="id" map="" class="aou"/>
 		</links>
 		<permacrud xmlns="http://open-ils.org/spec/opensrf/IDL/permacrud/v1">
@@ -232,6 +265,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA
 		</permacrud>
 	</class>
 
+
 	<class id="vii" controller="open-ils.cstore open-ils.pcrud" oils_obj:fieldmapper="vandelay::import_item" oils_persist:tablename="vandelay.import_item" reporter:label="Import Item">
 		<fields oils_persist:primary="id" oils_persist:sequence="vandelay.import_item_id_seq">
 			<field reporter:label="Import Item ID" name="id" reporter:datatype="id"/>
diff --git a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql
index def8dfd..4122444 100644
--- a/Open-ILS/src/sql/Pg/012.schema.vandelay.sql
+++ b/Open-ILS/src/sql/Pg/012.schema.vandelay.sql
@@ -177,12 +177,20 @@ CREATE TABLE vandelay.import_item (
     opac_visible    BOOL,
     internal_id     BIGINT -- queue_type == 'acq' ? acq.lineitem_detail.id : asset.copy.id
 );
+
+CREATE TABLE vandelay.import_bib_trash_group(
+    id           SERIAL  PRIMARY KEY,
+    owner        INTEGER NOT NULL REFERENCES actor.org_unit(id),
+    label        TEXT    NOT NULL, --i18n
+    always_apply BOOLEAN NOT NULL DEFAULT FALSE,
+	CONSTRAINT vand_import_bib_trash_grp_owner_label UNIQUE (owner, label)
+);
  
 CREATE TABLE vandelay.import_bib_trash_fields (
-    id              BIGSERIAL   PRIMARY KEY,
-    owner           INT         NOT NULL REFERENCES actor.org_unit (id) ON UPDATE CASCADE ON DELETE CASCADE DEFERRABLE INITIALLY DEFERRED,
-    field           TEXT        NOT NULL,
-	CONSTRAINT vand_import_bib_trash_fields_idx UNIQUE (owner,field)
+    id         BIGSERIAL PRIMARY KEY,
+    grp        INTEGER   NOT NULL REFERENCES vandelay.import_bib_trash_group,
+    field      TEXT      NOT NULL,
+    CONSTRAINT vand_import_bib_trash_fields_once_per UNIQUE (grp, field)
 );
 
 CREATE TABLE vandelay.merge_profile (
diff --git a/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.strip-marc-tags.sql b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.strip-marc-tags.sql
new file mode 100644
index 0000000..3bf2835
--- /dev/null
+++ b/Open-ILS/src/sql/Pg/upgrade/XXXX.schema.strip-marc-tags.sql
@@ -0,0 +1,41 @@
+BEGIN;
+
+CREATE TABLE vandelay.import_bib_trash_group(
+    id SERIAL PRIMARY KEY,
+    owner INT NOT NULL REFERENCES actor.org_unit(id),
+    label TEXT NOT NULL, --i18n
+    always_apply BOOLEAN NOT NULL DEFAULT FALSE,
+	CONSTRAINT vand_import_bib_trash_grp_owner_label UNIQUE (owner, label)
+);
+
+-- otherwise, the ALTER TABLE statement below
+-- will fail with pending trigger events.
+SET CONSTRAINTS ALL IMMEDIATE;
+
+ALTER TABLE vandelay.import_bib_trash_fields
+    -- allow null-able for now..
+    ADD COLUMN grp INTEGER REFERENCES vandelay.import_bib_trash_group;
+
+-- add any existing trash_fields to "Legacy" groups (one per unique field
+-- owner) as part of the upgrade, since grp is now required.
+-- note that vandelay.import_bib_trash_fields was never used before,
+-- so in most cases this should be a no-op.
+
+INSERT INTO vandelay.import_bib_trash_group (owner, label)
+    SELECT DISTINCT(owner), 'Legacy' FROM vandelay.import_bib_trash_fields;
+
+UPDATE vandelay.import_bib_trash_fields field SET grp = tgroup.id
+    FROM vandelay.import_bib_trash_group tgroup
+    WHERE tgroup.owner = field.owner;
+    
+ALTER TABLE vandelay.import_bib_trash_fields
+    -- now that have values, we can make this non-null
+    ALTER COLUMN grp SET NOT NULL,
+    -- drop outdated constraint
+    DROP CONSTRAINT vand_import_bib_trash_fields_idx,
+    -- owner is implied by the grp
+    DROP COLUMN owner, 
+    -- make grp+field unique
+    ADD CONSTRAINT vand_import_bib_trash_fields_once_per UNIQUE (grp, field);
+
+COMMIT;

-----------------------------------------------------------------------

Summary of changes:
 Open-ILS/examples/fm_IDL.xml                       |   36 +++++++-
 .../perlmods/lib/OpenILS/Application/AppUtils.pm   |   38 +++++++
 .../src/perlmods/lib/OpenILS/Application/Cat.pm    |   12 +-
 .../lib/OpenILS/Application/Cat/BibCommon.pm       |   11 ++-
 .../perlmods/lib/OpenILS/Application/Vandelay.pm   |   15 +++
 Open-ILS/src/sql/Pg/002.schema.config.sql          |    2 +-
 Open-ILS/src/sql/Pg/012.schema.vandelay.sql        |   16 +++-
 .../sql/Pg/upgrade/0779.schema.strip-marc-tags.sql |   43 ++++++++
 .../global/vandelay/import_bib_trash_group.tt2     |  104 ++++++++++++++++++++
 Open-ILS/src/templates/vandelay/inc/queue.tt2      |   13 +++
 Open-ILS/src/templates/vandelay/inc/upload.tt2     |    9 ++
 .../global/vandelay/import_bib_trash_group.js      |   32 ++++++
 Open-ILS/web/js/ui/default/vandelay/vandelay.js    |   93 ++++++++++++++++--
 Open-ILS/web/opac/locale/en-US/lang.dtd            |    2 +
 .../xul/staff_client/chrome/content/main/menu.js   |    4 +
 .../chrome/content/main/menu_frame_menus.xul       |    4 +
 Open-ILS/xul/staff_client/server/cat/z3950.js      |   80 ++++++++++++++-
 Open-ILS/xul/staff_client/server/cat/z3950.xul     |    4 +
 .../marc-import-tag-stripping.txt                  |   28 +++++
 19 files changed, 516 insertions(+), 30 deletions(-)
 create mode 100644 Open-ILS/src/sql/Pg/upgrade/0779.schema.strip-marc-tags.sql
 create mode 100644 Open-ILS/src/templates/conify/global/vandelay/import_bib_trash_group.tt2
 create mode 100644 Open-ILS/web/js/ui/default/conify/global/vandelay/import_bib_trash_group.js
 create mode 100644 docs/RELEASE_NOTES_NEXT/marc-import-tag-stripping.txt


hooks/post-receive
-- 
Evergreen ILS


More information about the open-ils-commits mailing list