Bugzilla – Attachment 3193 Details for
Bug 5725
Batch modifications for Biblios
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Unified patch
0004-Bug-5725-Batch-Modifications-for-Biblios.patch (text/plain), 30.38 KB, created by
Chris Cormack
on 2011-02-21 19:46:23 UTC
(
hide
)
Description:
Unified patch
Filename:
MIME Type:
Creator:
Chris Cormack
Created:
2011-02-21 19:46:23 UTC
Size:
30.38 KB
patch
obsolete
>From 74fb0c43327e561e99366b213b9f491c03beef70 Mon Sep 17 00:00:00 2001 >From: Chris Cormack <chrisc@catalyst.net.nz> >Date: Tue, 22 Feb 2011 08:44:40 +1300 >Subject: [PATCH] Bug 5725 : Batch Modifications for Biblios > >Squashed commit of the following: > >commit 66282fed94564969f0368e27c7231116a2d1c0fe >Author: Chris Cormack <chrisc@catalyst.net.nz> >Date: Tue Feb 22 08:43:24 2011 +1300 > > Bug 5725 : Follow up fixing permissions thanks to Paul Poulain > >commit 4d0241aea5be13b00abbc6100dc98ec87f816081 >Author: Paul Poulain <paul.poulain@biblibre.com> >Date: Mon Jan 10 17:22:31 2011 +0100 > > Bug 5725 follow up > > Owen noticed the batchedit was not working. This was because we made a patch months ago to change the GetBiblio API > (the 1st returned arg is useless) > This patch is not in main trunk, resulting in the error owen has noticed. > > This patch goes back to official API (even if it is clumsy : the patch we did does not apply anymore) > >commit 19b3e0ecc57af1c2151340328bf06e26882b7863 >Author: Paul Poulain <paul.poulain@biblibre.com> >Date: Wed Dec 15 20:47:21 2010 +0100 > > Bug 5725 : MT #2991 (Feature) Batch biblio modifications > > This patch add a new feature of batch biblio modifications, > it permit to select biblios from basket, and modify fields of them setting > > Rebased to fix whitespace issues. >--- > C4/Biblio.pm | 171 ++++++++++++++- > koha-tmpl/intranet-tmpl/prog/en/js/basket.js | 6 + > .../prog/en/modules/basket/basket.tmpl | 5 + > .../prog/en/modules/tools/batchedit.tmpl | 231 ++++++++++++++++++++ > tools/batchedit.pl | 222 +++++++++++++++++++ > 5 files changed, 623 insertions(+), 12 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl > create mode 100755 tools/batchedit.pl > >diff --git a/C4/Biblio.pm b/C4/Biblio.pm >index 8ea5da5..bafc2db 100644 >--- a/C4/Biblio.pm >+++ b/C4/Biblio.pm >@@ -93,6 +93,8 @@ BEGIN { > &ModBiblio > &ModBiblioframework > &ModZebra >+ >+ &BatchModField > ); > > # To delete something >@@ -376,7 +378,7 @@ sub ModBiblioframework { > > =head2 DelBiblio > >- my $error = &DelBiblio($dbh,$biblionumber); >+ my $error = &DelBiblio($biblionumber); > > Exported function (core API) for deleting a biblio in koha. > Deletes biblio record from Zebra and Koha tables (biblio,biblioitems,items) >@@ -1046,9 +1048,14 @@ The MARC record contains both biblio & item data. > > sub GetMarcBiblio { > my $biblionumber = shift; >+ my $deletedtable = shift; > my $dbh = C4::Context->dbh; >- my $sth = $dbh->prepare("SELECT marcxml FROM biblioitems WHERE biblionumber=? "); >- $sth->execute($biblionumber); >+ my $strsth = qq{SELECT marcxml FROM biblioitems WHERE biblionumber=?}; >+ $strsth .= qq{UNION SELECT marcxml FROM deletedbiblioitems WHERE biblionumber=?} if $deletedtable; >+ my $sth = $dbh->prepare($strsth); >+ my @params=($biblionumber); >+ push @params, $biblionumber if ($deletedtable); >+ $sth->execute(@params); > my $row = $sth->fetchrow_hashref; > my $marcxml = StripNonXmlChars( $row->{'marcxml'} ); > MARC::File::XML->default_record_format( C4::Context->preference('marcflavour') ); >@@ -1113,6 +1120,8 @@ sub GetCOinSBiblio { > my $isbn = ''; > my $issn = ''; > my $publisher = ''; >+ my $place = ''; >+ my $tpages = ''; > > if ( C4::Context->preference("marcflavour") eq "UNIMARC" ) { > my $fmts6; >@@ -1159,24 +1168,70 @@ sub GetCOinSBiblio { > $genre = ( $mtx eq 'dc' ) ? "&rft.type=$genre" : "&rft.genre=$genre"; > > # Setting datas >- $aulast = $record->subfield( '700', 'a' ); >- $aufirst = $record->subfield( '700', 'b' ); >- $oauthors = "&rft.au=$aufirst $aulast"; >+ >+ # authors >+ $aulast = $record->subfield( '700', 'a' ) || ''; >+ $aufirst = $record->subfield( '700', 'b' ) || ''; >+ >+ foreach my $field (qw/700 701/) { >+ my $author = ''; >+ $author = $record->subfield($field, 'a') || ''; >+ $author .= ", " . $record->subfield($field, 'b') if ($author and $record->subfield($field, 'b')); >+ $author .= " - " . join(' - ', $record->subfield($field, '4')) if ($record->subfield($field, '4')); >+ $author .= " (" . $record->subfield($field, 'f') . ")" if ($record->subfield($field, 'f')); >+ >+ $oauthors .= "&rft.au=$author" if ($author); >+ } >+ >+ foreach my $field (qw/710 711/) { >+ my $author = ''; >+ $author = $record->subfield($field, 'a') || ''; >+ $author .= ", " . $record->subfield($field, 'b') if ($author and $record->subfield($field, 'b')); >+ $author .= " - " . join(' - ', $record->subfield($field, '4')) if ($record->subfield($field, '4')); >+ $author .= " (" . $record->subfield($field, 'c') . ")" if ($record->subfield($field, 'c')); >+ >+ $oauthors .= "&rft.au=$author" if ($author); >+ } >+ > > # others authors > if ( $record->field('200') ) { >+ for my $au ( $record->field('200')->subfield('f') ) { >+ $oauthors .= "&rft.au=$au"; >+ } > for my $au ( $record->field('200')->subfield('g') ) { > $oauthors .= "&rft.au=$au"; > } >+ > } >+ >+ # place >+ $place = join(" - ", $record->subfield('210', 'a')); >+ $place = "&rtf.place=$place" if ($place); >+ >+ # tpages >+ my $i = 0; >+ foreach my $field ($record->field('215')) { >+ $tpages .= " | " if ($i > 0); >+ $tpages .= join(" - ", $field->subfield('a')); >+ $tpages .= join(" ; ", $field->subfield('d')); >+ $tpages .= join(" + ", $field->subfield('e')); >+ $i++; >+ } >+ $tpages = "&rtf.tpages=$tpages" if ($tpages); >+ >+ # title >+ my $btitle = join(' ; ', $record->subfield('200', 'a')); >+ $btitle .= " : " . join(' : ', $record->subfield('200', 'e')) if ($record->subfield('200', 'e')); >+ > $title = > ( $mtx eq 'dc' ) > ? "&rft.title=" . $record->subfield( '200', 'a' ) >- : "&rft.title=" . $record->subfield( '200', 'a' ) . "&rft.btitle=" . $record->subfield( '200', 'a' ); >- $pubyear = $record->subfield( '210', 'd' ); >- $publisher = $record->subfield( '210', 'c' ); >- $isbn = $record->subfield( '010', 'a' ); >- $issn = $record->subfield( '011', 'a' ); >+ : "&rft.title=" . $record->subfield( '200', 'a' ) . "&rft.btitle=" . $btitle; >+ $pubyear = $record->subfield( '210', 'd' ) || ''; >+ $publisher = $record->subfield( '210', 'c' ) || ''; >+ $isbn = $record->subfield( '010', 'a' ) || ''; >+ $issn = $record->subfield( '011', 'a' ) || ''; > } else { > > # MARC21 need some improve >@@ -1205,7 +1260,7 @@ sub GetCOinSBiblio { > > } > my $coins_value = >-"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3A$mtx$genre$title&rft.isbn=$isbn&rft.issn=$issn&rft.aulast=$aulast&rft.aufirst=$aufirst$oauthors&rft.pub=$publisher&rft.date=$pubyear"; >+"ctx_ver=Z39.88-2004&rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3A$mtx$genre$title&rft.isbn=$isbn&rft.issn=$issn&rft.aulast=$aulast&rft.aufirst=$aufirst$oauthors&rft.pub=$publisher&rft.date=$pubyear$place$tpages"; > $coins_value =~ s/(\ |&[^a])/\+/g; > $coins_value =~ s/\"/\"\;/g; > >@@ -1750,6 +1805,7 @@ sub TransformHtmlToXml { > @$values[$i] =~ s/>/>/g; > @$values[$i] =~ s/"/"/g; > @$values[$i] =~ s/'/'/g; >+ @$values[$i] = NormalizeString(@$values[$i]); > > # if ( !utf8::is_utf8( @$values[$i] ) ) { > # utf8::decode( @$values[$i] ); >@@ -2313,7 +2369,9 @@ sub PrepareItemrecordDisplay { > push @authorised_values, $branchcode; > $authorised_lib{$branchcode} = $branchname; > } >+ $defaultvalue = C4::Context->userenv->{branch}; > } >+ $defaultvalue = C4::Context->userenv->{branch}; > > #----- itemtypes > } elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { >@@ -3461,6 +3519,95 @@ sub get_biblio_authorised_values { > return $authorised_values; > } > >+=head3 BatchModField >+ >+ Mod subfields in field record >+ >+ returns 1,$record if succeed >+ returns 0,$record if Action was not processed >+ returns -1 if no record >+ returns -2 if no action done on record >+ >+=cut >+ >+sub BatchModField { >+ my ( $record, $field, $subfield, $action, $condval, $nocond, $repval ) = @_; >+ >+ return -1 unless $record; >+ $condval=NormalizeString($condval); >+ my $condition=qr/$condval/; >+ >+ if($action eq "add"){ >+ for my $rfield ($record->field($field)){ >+ $rfield->add_subfields( $subfield => $repval ); >+ } >+ return 1; >+ }elsif($action eq "addfield"){ >+ my $new_field = MARC::Field->new($field,'','', >+ $subfield => $repval); >+ $record->insert_fields_ordered($new_field); >+ return 1; >+ } else { >+ my $done=0; >+ for my $rfield ($record->field($field)) { >+ if ($subfield && $subfield ne "@"){ >+ my @subfields = $rfield->subfields(); >+ my @subfields_to_add; >+ foreach my $subf (@subfields) { >+ if ($subf->[0] eq $subfield){ >+ $subf->[1]=NormalizeString($subf->[1]); >+ if ( $action eq "mod" ) { >+ if ( $nocond ne "true" && $subf->[1] =~ s/$condition/$repval/) { >+ $done=1; >+ } >+ if ($nocond eq "true"){ >+ $subf->[1] = $repval; >+ $done=1; >+ } >+ } elsif ( $action eq "del" ) { >+ if ( $subf->[1] =~ m/$condition/ || $nocond eq "true" ) { >+ $done=1; >+ next; >+ } >+ } >+ } >+ push @subfields_to_add,@$subf; >+ } >+ if ($done){ >+ if (@subfields_to_add){ >+ $rfield->replace_with(MARC::Field->new($rfield->tag,$rfield->indicator(1),$rfield->indicator(2),@subfields_to_add)); >+ } >+ else { >+ my $count= $record->delete_field($rfield); >+ } >+ } >+ } >+ else { >+ if ($action eq "del"){ >+ my $count=$record->delete_field($rfield); >+ $done=1; >+ } >+ else { >+ if ($field < 10){ >+ my $value=$record->field($field)->data(); >+ if ($value=~ s/$condition/$repval/){ >+ $record->field($field)->update($value); >+ $done=1; >+ >+ } >+ if ( $nocond eq 'true'){ >+ $record->field($field)->update($repval); >+ $done=1; >+ } >+ } >+ } >+ } >+ } >+ return ($done,$record); >+ } >+ return -2; >+} >+ > 1; > > __END__ >diff --git a/koha-tmpl/intranet-tmpl/prog/en/js/basket.js b/koha-tmpl/intranet-tmpl/prog/en/js/basket.js >index 9946cf7..03dc306 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/js/basket.js >+++ b/koha-tmpl/intranet-tmpl/prog/en/js/basket.js >@@ -433,4 +433,10 @@ $(document).ready(function(){ > if(basketcount){ updateBasket(basketcount); } > }); > >+function batchEdit(){ >+ var valCookie = readCookie(nameCookie); >+ var strCookie = nameParam + "=" + valCookie; > >+ var loc = CGIBIN + "tools/batchedit.pl?" + strCookie; >+ window.opener.location = loc; >+} >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl >index d3d83ac..6699bde 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/basket/basket.tmpl >@@ -86,6 +86,11 @@ function placeHold () { > <!-- TMPL_IF NAME="verbose" --><a href="basket.pl" class="brief" onclick="showLess(); return false;">Brief Display</a><!-- TMPL_ELSE --><a href="basket.pl" class="detail" onclick="showMore(); return false;">More Details</a><!-- /TMPL_IF --> > </span></span> > </li> >+ <li> >+ <span id="batchedit" class="yui-button yui-link-button"><span class="first-child"> >+ <a class="batchedit" href="basket.pl" onclick="batchEdit(); return false;">Batch Edit</a> >+ </span></span> >+ </li> > <li> > <span id="receive" class="yui-button yui-link-button"><span class="first-child"> > <a class="send" href="basket.pl" onclick="sendBasket(); return false;">Send</a> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl >new file mode 100644 >index 0000000..f7b7589 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchedit.tmpl >@@ -0,0 +1,231 @@ >+<!-- TMPL_INCLUDE NAME="doc-head-open.inc" --> >+<title>Koha › Tools › Batch Deletion of Items</title> >+<!-- TMPL_INCLUDE NAME="doc-head-close.inc" --> >+ >+<!-- TMPL_UNLESS NAME="modsuccess" --> >+ >+<script type="text/javascript" src="<!-- TMPL_VAR name="themelang" -->/lib/jquery/plugins/jquery.tablesorter.min.js"></script> >+<script type="text/JavaScript" language="JavaScript"> >+//<![CDATA[ >+ var CGIBIN = "/cgi-bin/koha/"; >+ >+ function fieldChanged(){ >+ var field = $('#fieldchoice').val(); >+ $.ajax({ >+ url: CGIBIN + 'tools/batchedit.pl?field=' + field, >+ dataType: 'json', >+ success: function(data){ >+ $("#subfieldchoice option").remove(); >+ >+ var subfield = $('#subfieldchoice'); >+ $("<option>").attr("value", "@") >+ .text( _('Whole field')) >+ .appendTo('#subfieldchoice'); >+ for( var i=0; i < data.length ; i++){ >+ $("<option>").attr("value", data[i].subfield) >+ .text(data[i].subfield) >+ .appendTo('#subfieldchoice'); >+ } >+ subfieldChanged(); >+ } >+ }); >+ } >+ >+ function subfieldChanged(){ >+ var field = $('#fieldchoice').val(); >+ var subfield = $('#subfieldchoice').val(); >+ $.ajax({ >+ url: CGIBIN + 'tools/batchedit.pl?field=' + field + '&subfield=' + subfield, >+ dataType: 'json', >+ success: function(data){ >+ >+ if( data.length > 0) { >+ $("#condvaltd").html('<select name="condvalchoice" id="condvalchoice" />'); >+ $("<option>").attr("value", "") >+ .text("") >+ .appendTo('#condvalchoice'); >+ $("#repvaltd" ).html('<select name="repvalchoice" id="repvalchoice" />' ); >+ $("<option>").attr("value", "") >+ .text("") >+ .appendTo('#repvalchoice'); >+ >+ for( var i=0; i < data.length ; i++){ >+ $("<option>").attr("value", data[i].code) >+ .text(data[i].value) >+ .appendTo('#repvalchoice'); >+ $("<option>").attr("value", data[i].code) >+ .text(data[i].value) >+ .appendTo('#condvalchoice'); >+ } >+ }else{ >+ $("#condvaltd").html('<input type="text" name="condvalchoice" id="condvalchoice" />'); >+ $("#repvaltd").html('<input type="text" name="repvalchoice" id="repvalchoice" />'); >+ } >+ $('<input type="checkbox" id="nocond" name="nocond" value="nocond" onClick="$(\'#condvalchoice\').attr(\'disabled\', ! $(\'#condvalchoice\').attr(\'disabled\') ) ">All</input>').appendTo("#condvaltd"); >+ } >+ }); >+ >+ } >+ >+ function addRule(){ >+ var actionlabel = { >+ mod: _('Modify'), >+ del: _('Delete'), >+ add: _('Create') >+ }; >+ var repvallabel = $('#repvalchoice :selected').text() || $("#repvalchoice").val(); >+ >+ var field = $('#fieldchoice').val(); >+ var subfield = $('#subfieldchoice').val(); >+ var action = $('#actionchoice').val(); >+ var nocond = $('#nocond').attr('checked')||(! $('#condvalchoice').val().length); >+ >+ if( ! nocond ) { >+ var condval = $('#condvalchoice').val(); >+ var condvallabel = $('#condvalchoice :selected').text() || $("#condvalchoice").val(); >+ }else{ >+ var condvallabel = _("No condition"); >+ } >+ var repval = $('#repvalchoice').val(); >+ >+ var tmpl = "<tr>" >+ + '<td><input type="hidden" name="field" value="' + field + '" />' + field + '</td>' >+ + '<td><input type="hidden" name="subfield" value="' + subfield + '" />' + subfield + '</td>' >+ + '<td><input type="hidden" name="action" value="' + action + '" />' + actionlabel[action] + '</td>' >+ + '<td><input type="hidden" name="condval" value="' + condval + '" />' >+ + condvallabel >+ + '<input type="hidden" name="nocondval" value="' + nocond + '" />' >+ + '</td>' >+ >+ + '<td><input type="hidden" name="repval" value="' + repval + '" />' + repvallabel + '</td>' >+ + '<td><input type="button" value="Delete" onclick="deleteRule(this)" /></td>' >+ + '</tr>'; >+ $('#rulestable').append(tmpl); >+ >+ } >+ >+ function deleteRule(button){ >+ $(button).parent().parent().remove(); >+ return false; >+ } >+ >+ >+//]]> >+</script> >+<!-- /TMPL_UNLESS --> >+</head> >+<body> >+<!-- TMPL_INCLUDE NAME="header.inc" --> >+<!-- TMPL_INCLUDE NAME="cat-search.inc"--> >+<div id="doc3" class="yui-t2"> >+ <div id="bd"> >+ <div id="yui-main"> >+ <div class="yui-b"> >+ >+<form method="post" enctype="multipart/form-data"> >+<!-- TMPL_IF NAME="inputform" --> >+<h2>Batch records modification</h2> >+ <fieldset class="rows"> >+ <legend>Use a file</legend> >+ <ol> >+ <li><label for="uploadfile">File: </label> <input type="file" id="uploadfile" name="uploadfile" /></li> >+ </ol> >+ </fieldset> >+ <fieldset class="rows"> >+ <legend>Or enter records one by one</legend> >+ <ol> >+ <li> >+ <label for="recordslist">Records numbers list (one number per line): </label> >+ <textarea rows="10" cols="30" id="recordslist" name="recordslist"></textarea> >+ </li> >+ </ol> >+ </fieldset> >+<!-- TMPL_ELSE --> >+<h2>List of records:</h2> >+<table id="bibliolist"> >+ <thead> >+ <tr> >+ <th>Biblionumber</th><th>Title</th><th>Author</th><!-- TMPL_IF Name="moddone"--> <th>Status</th><!-- /TMPL_IF --> >+ </tr> >+ </thead> >+ <!-- TMPL_LOOP NAME="biblioinfos" --> >+ <tr> >+ <td><!-- TMPL_VAR NAME="biblionumber" --></td> >+ <td><!-- TMPL_VAR NAME="title" --></td> >+ <td><!-- TMPL_VAR NAME="author" --></td> >+ <!-- TMPL_IF Name="moddone"--> >+ <!-- TMPL_IF NAME="OK" --> >+ <td> >+ <!--TMPL_ELSE--> >+ <td class="problem"> >+ <!--/TMPL_IF--> >+ <!-- TMPL_IF NAME="OK" -->OK<!--/TMPL_IF--> >+ <!-- TMPL_IF NAME="No_Actions" -->Nothing done<!--/TMPL_IF--> >+ <!-- TMPL_IF NAME="Actions_Failed" -->Some Actions failed. List Follow : <ul><!-- TMPL_LOOP NAME="failed_actions" --><li><!-- TMPL_VAR NAME="action" --></li><!--/TMPL_LOOP --></ul><!--/TMPL_IF--> >+ </td><!-- /TMPL_IF --> >+ </tr> >+ <!-- /TMPL_LOOP --> >+</table> >+<!-- /TMPL_IF --> >+ >+<!-- TMPL_IF NAME="moddone" --> >+ <div class="dialog alert">All operations processed</div> >+<!-- TMPL_ELSE --> >+ >+<fieldset> >+<h2>Modification rules:</h2> >+<input type="submit" value="Submit" /> >+<input type="hidden" name="op" value="do" /> >+<input type="hidden" name="bib_list" value="<!-- TMPL_VAR NAME="bib_list" -->" /> >+<table id="rulestable"> >+ <thead> >+ <tr> >+ <th>Field</th><th>Subfield</th><th>Action</th><th>Condition Value</th><th>Value</th><th> </th> >+ </tr> >+ </thead> >+ <tr> >+ <td> >+ <select name="fieldchoice" id="fieldchoice" onchange="fieldChanged();"> >+<!-- TMPL_LOOP NAME="marcfields" --> >+ <option value="<!-- TMPL_VAR NAME="tag" -->"><!-- TMPL_VAR NAME="tag" --></option> >+<!-- /TMPL_LOOP --> >+ </select> >+ </td> >+ <td> >+ <select name="subfieldchoice" id="subfieldchoice" onchange="subfieldChanged();"> >+ >+ </select> >+ </td> >+ <td> >+ <select name="actionchoice" id="actionchoice"> >+ <option value="mod">Modify subfield</option> >+ <option value="add">Create subfield</option> >+ <option value="addfield">Create field and subfield</option> >+ <option value="del">Delete subfield</option> >+ </select> >+ </td> >+ <td id="condvaltd"> >+ <input type="text" name="condvalchoice" id="condvalchoice" /> >+ <input type="checkbox" id="nocond" name="nocond" value="nocond" onClick="$('#condvalchoice').attr('disabled', ! $('#condvalchoice').attr('disabled') ) ">All</input> >+ </td> >+ <td id="repvaltd"> >+ <input type="text" name="repvalchoice" id="repvalchoice" /> >+ </td> >+ <td><input type="button" value="Add" onclick="addRule();" /></td> >+ </tr> >+ </thead> >+ >+<!-- TMPL_LOOP NAME="marcfields" --> >+ >+<!-- /TMPL_LOOP --> >+</table> >+<input type="submit" value="Submit" /> >+</fieldset> >+</form> >+<!-- /TMPL_IF --> >+ </div> >+ </div> >+ </div> >+</div> >+</body> >+</html> >diff --git a/tools/batchedit.pl b/tools/batchedit.pl >new file mode 100755 >index 0000000..ccc0323 >--- /dev/null >+++ b/tools/batchedit.pl >@@ -0,0 +1,222 @@ >+#!/usr/bin/perl >+ >+ >+# Copyright 2010 SARL BibLibre >+# >+# This file is part of Koha. >+# >+# Koha is free software; you can redistribute it and/or modify it under the >+# terms of the GNU General Public License as published by the Free Software >+# Foundation; either version 2 of the License, or (at your option) any later >+# version. >+# >+# Koha is distributed in the hope that it will be useful, but WITHOUT ANY >+# WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR >+# A PARTICULAR PURPOSE. See the GNU General Public License for more details. >+# >+# You should have received a copy of the GNU General Public License along with >+# Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place, >+# Suite 330, Boston, MA 02111-1307 USA >+ >+use CGI; >+use strict; >+use C4::Output; >+use C4::Auth; >+use C4::Branch; >+use C4::Koha; >+use C4::Biblio; >+use C4::Context; >+use C4::Debug; >+use JSON; >+ >+my $input = new CGI; >+my $dbh = C4::Context->dbh; >+ >+my $filefh = $input->param('uploadfile'); >+my $recordslist = $input->param('recordslist'); >+my $bib_list = $input->param('bib_list'); >+my @biblionumbers; >+ >+if ($filefh) { >+ while ( my $biblionumber = <$filefh> ) { >+ $biblionumber =~ s/[\r\n]*$//g; >+ push @biblionumbers, $biblionumber if $biblionumber; >+ } >+} elsif ($recordslist) { >+ push @biblionumbers, split( /\s\n/, $recordslist ); >+} elsif ($bib_list) { >+ push @biblionumbers, split('/', $bib_list); >+} >+ >+my $op = $input->param('op'); >+my ($template, $loggedinuser, $cookie); >+ >+my $frameworkcode=""; >+my $tagslib = &GetMarcStructure(1,$frameworkcode); >+my %report_actions; >+ >+if($input->param('field') and not defined $op){ >+ ($template, $loggedinuser, $cookie) >+ = get_template_and_user({template_name => "acqui/ajax.tmpl", >+ query => $input, >+ type => "intranet", >+ authnotrequired => 0, >+ flagsrequired => "batchedit", >+ }); >+ >+ >+ my $tag = $input->param('field'); >+ my $subfield = $input->param('subfield'); >+ >+ if($input->param('subfield')){ >+ my $branches = GetBranchesLoop(); >+ >+ my @authorised_values; >+ if ( $tagslib->{$tag}->{$subfield}->{authorised_value} ) { >+ if ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "branches" ) { >+ foreach my $thisbranch (@$branches) { >+ push @authorised_values, { >+ code => $thisbranch->{value}, >+ value => $thisbranch->{branchname}, >+ }; >+ # $value = $thisbranch->{value} if $thisbranch->{selected}; >+ } >+ }elsif ( $tagslib->{$tag}->{$subfield}->{authorised_value} eq "itemtypes" ) { >+ my $sth = $dbh->prepare("SELECT itemtype,description FROM itemtypes ORDER BY description"); >+ $sth->execute(); >+ while ( my ( $itemtype, $description ) = $sth->fetchrow_array ) { >+ push @authorised_values, { >+ code => $itemtype, >+ value => $description, >+ }; >+ } >+ >+ }else { >+ # Getting the fields where the item location is >+ my ($location_field, $location_subfield) = GetMarcFromKohaField('items.location', $frameworkcode); >+ >+ # Getting the name of the authorised values' category for item location >+ my $item_location_category = $tagslib->{$location_field}->{$location_subfield}->{'authorised_value'}; >+ # Are we dealing with item location ? >+ my $item_location = ($tagslib->{$tag}->{$subfield}->{authorised_value} eq $item_location_category) ? 1 : 0; >+ >+ # If so, we sort by authorised_value, else by libelle >+ my $orderby = $item_location ? 'authorised_value' : 'lib'; >+ >+ my $authorised_values_sth = $dbh->prepare("SELECT authorised_value,lib FROM authorised_values WHERE category=? ORDER BY $orderby"); >+ >+ $authorised_values_sth->execute( $tagslib->{$tag}->{$subfield}->{authorised_value}); >+ >+ >+ while ( my ( $value, $lib ) = $authorised_values_sth->fetchrow_array ) { >+ push @authorised_values, { >+ code => $value, >+ value => ($item_location) ? $value . " - " . $lib : $lib, >+ }; >+ >+ } >+ } >+ } >+ $template->param('return' => to_json(\@authorised_values)); >+ }else{ >+ my @modifiablesubf; >+ >+ foreach my $subfield (sort keys %{$tagslib->{$tag}}) { >+ next if subfield_is_koha_internal_p($subfield); >+ next if $subfield eq "@"; >+ next if ($tagslib->{$tag}->{$subfield}->{'tab'} eq "10"); >+ my %subfield_data; >+ $subfield_data{subfield} = $subfield; >+ push @modifiablesubf, \%subfield_data; >+ } >+ $template->param('return' => to_json(\@modifiablesubf)); >+ } >+ >+ >+ output_html_with_http_headers $input, $cookie, $template->output; >+ exit; >+}else{ >+ ($template, $loggedinuser, $cookie) >+ = get_template_and_user({template_name => "tools/batchedit.tmpl", >+ query => $input, >+ type => "intranet", >+ authnotrequired => 0, >+ flagsrequired => { tools => "batchedit" }, >+ }); >+ >+ $template->param( inputform => 1, ) unless @biblionumbers; >+ >+ if(!defined $op) { >+ my @modifiablefields; >+ >+ foreach my $tag (sort keys %{$tagslib}) { >+ my %subfield_data; >+ foreach my $subfield (sort keys %{$tagslib->{$tag}}) { >+ next if $subfield_data{tag}; >+ next if subfield_is_koha_internal_p($subfield); >+ next if ($tagslib->{$tag}->{$subfield}->{'tab'} eq "10"); >+ >+ $subfield_data{tag} = $tag; >+ >+ push @modifiablefields, \%subfield_data; >+ } >+ } >+ >+ $template->param( marcfields => \@modifiablefields, >+ bib_list => $input->param('bib_list'), >+ ); >+ >+ }else{ >+ my @fields = $input->param('field'); >+ my @subfields = $input->param('subfield'); >+ my @actions = $input->param('action'); >+ my @condvals = $input->param('condval'); >+ my @nocondvals = $input->param('nocondval'); >+ my @repvals = $input->param('repval'); >+ foreach my $biblionumber ( @biblionumbers ){ >+ my $record = GetMarcBiblio($biblionumber); >+ my ($count, $biblio) = GetBiblio($biblionumber); >+ my $report = 0; >+ my @failed_actions; >+ for(my $i = 0 ; $i < scalar(@fields) ; $i++ ){ >+ my $field = $fields[$i]; >+ my $subfield = $subfields[$i]; >+ my $action = $actions[$i]; >+ my $condval = $condvals[$i]; >+ my $nocond = $nocondvals[$i]; >+ my $repval = $repvals[$i]; >+ >+ my ($result,$record) = BatchModField($record, $field, $subfield, $action, $condval, $nocond, $repval); >+ push @failed_actions, {action=>"$field $subfield $action ".($nocond eq "true"?"all":$condval)." $repval"} if ($result<=0); >+ } >+ if (@failed_actions == scalar(@fields)){ >+ $report_actions{$biblionumber}->{status}="No_Actions"; >+ } >+ elsif (@failed_actions>0 and @failed_actions < scalar(@fields)){ >+ $report_actions{$biblionumber}->{status}="Actions_Failed"; >+ $report_actions{$biblionumber}->{failed_actions}=\@failed_actions; >+ } >+ elsif (@failed_actions == 0){ >+ $report_actions{$biblionumber}->{status}="OK"; >+ } >+ ModBiblio($record, $biblionumber, $biblio->{frameworkcode}) unless ($report); >+ } >+ $template->param('moddone' => 1); >+ } >+ >+} >+ >+my @biblioinfos; >+ >+for my $biblionumber (@biblionumbers){ >+ my ($count,$biblio) = GetBiblio($biblionumber); >+ if (defined $op){ >+ $biblio->{$report_actions{$biblionumber}->{status}}=1; >+ $biblio->{failed_actions}=$report_actions{$biblionumber}->{failed_actions}; >+ } >+ push @biblioinfos, $biblio; >+} >+ >+$template->param(biblioinfos => \@biblioinfos); >+output_html_with_http_headers $input, $cookie, $template->output; >+exit; >-- >1.7.1 >
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
|
Splinter Review
Attachments on
bug 5725
:
3105
|
3108
|
3191
|
3193
|
3234
|
3356
|
4734
|
4735
|
4736
|
4863
|
4864
|
4897
|
4898
|
4899
|
5404
|
5405
|
5684
|
5685
|
5697
|
5959
|
5960
|
5980
|
5981
|
5982
|
10610
|
10611
|
10612
|
11731
|
11732
|
11733