Bugzilla – Attachment 10675 Details for
Bug 7986
Export issues
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
[x]
|
Forgot Password
Login:
[x]
[patch]
Bug 7986: Export issues for patron
Bug-7986-Export-issues-for-patron.patch (text/plain), 35.32 KB, created by
Jared Camins-Esakov
on 2012-07-06 14:55:53 UTC
(
hide
)
Description:
Bug 7986: Export issues for patron
Filename:
MIME Type:
Creator:
Jared Camins-Esakov
Created:
2012-07-06 14:55:53 UTC
Size:
35.32 KB
patch
obsolete
>From f5d1adf5cfd43c9d25a70f2c04d8668342c0a291 Mon Sep 17 00:00:00 2001 >From: Jonathan Druart <jonathan.druart@biblibre.com> >Date: Wed, 4 Jul 2012 17:02:12 +0200 >Subject: [PATCH] Bug 7986: Export issues for patron >Content-Type: text/plain; charset="UTF-8" > >In the circulation page, you can now export (as csv or iso2709) a list >of items which are currently checked out by a borrower. > >3 export types: >- iso2709 with items: Export the items list in iso2709 format with item > informations. >- iso2709 without items: Export the items list in iso2709 format without > item informations. >- CSV: Export the items list based on a csv profil. > >2 new system preferences: >- DontExportFields: a list of fields not to be export >- CsvProfileForExport: The Csv profile name used for the csv export > >Test plan: >- Fill the CsvProfileForExport syspref >- go on the borrower circulation page containing checkouts >- Select one or more items and export them to the 3 different formats. >- check if the result file is what you expected > >Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com> >--- > C4/Biblio.pm | 6 +- > C4/Csv.pm | 13 + > C4/Record.pm | 59 +++- > circ/circulation.pl | 2 + > installer/data/mysql/updatedatabase.pl | 19 ++ > .../prog/en/includes/checkouts-table-footer.inc | 2 +- > .../intranet-tmpl/prog/en/includes/prefs-menu.inc | 1 + > .../en/modules/admin/preferences/circulation.pref | 6 + > .../prog/en/modules/admin/preferences/tools.pref | 4 + > .../prog/en/modules/circ/circulation.tt | 89 ++++++- > .../intranet-tmpl/prog/en/modules/tools/export.tt | 2 +- > tools/export.pl | 307 +++++++++++--------- > 12 files changed, 344 insertions(+), 166 deletions(-) > create mode 100644 koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/tools.pref > >diff --git a/C4/Biblio.pm b/C4/Biblio.pm >index f8ba099..6199a93 100644 >--- a/C4/Biblio.pm >+++ b/C4/Biblio.pm >@@ -2790,16 +2790,17 @@ sub GetNoZebraIndexes { > > =head2 EmbedItemsInMarcBiblio > >- EmbedItemsInMarcBiblio($marc, $biblionumber); >+ EmbedItemsInMarcBiblio($marc, $biblionumber, $itemnumbers); > > Given a MARC::Record object containing a bib record, > modify it to include the items attached to it as 9XX > per the bib's MARC framework. >+if $itemnumbers is defined, only specified itemnumbers are embedded > > =cut > > sub EmbedItemsInMarcBiblio { >- my ($marc, $biblionumber) = @_; >+ my ($marc, $biblionumber, $itemnumbers) = @_; > croak "No MARC record" unless $marc; > > my $frameworkcode = GetFrameworkCode($biblionumber); >@@ -2812,6 +2813,7 @@ sub EmbedItemsInMarcBiblio { > my @item_fields; > my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber", $frameworkcode ); > while (my ($itemnumber) = $sth->fetchrow_array) { >+ next if $itemnumbers and not grep { $_ == $itemnumber } @$itemnumbers; > require C4::Items; > my $item_marc = C4::Items::GetMarcItem($biblionumber, $itemnumber); > push @item_fields, $item_marc->field($itemtag); >diff --git a/C4/Csv.pm b/C4/Csv.pm >index 95cf634..74270ff 100644 >--- a/C4/Csv.pm >+++ b/C4/Csv.pm >@@ -35,6 +35,7 @@ $VERSION = 3.07.00.049; > @EXPORT = qw( > &GetCsvProfiles > &GetCsvProfile >+ &GetCsvProfileId > &GetCsvProfilesLoop > &GetMarcFieldsForCsv > ); >@@ -64,6 +65,18 @@ sub GetCsvProfile { > return ($sth->fetchrow_hashref); > } > >+# Returns id of csv profile about a given csv profile name >+sub GetCsvProfileId { >+ my ($name) = @_; >+ my $dbh = C4::Context->dbh; >+ my $query = "SELECT export_format_id FROM export_format WHERE profile=?"; >+ >+ $sth = $dbh->prepare($query); >+ $sth->execute($name); >+ >+ return ( $sth->fetchrow ); >+} >+ > # Returns fields to extract for the given csv profile > sub GetMarcFieldsForCsv { > >diff --git a/C4/Record.pm b/C4/Record.pm >index ed91196..f49648f 100644 >--- a/C4/Record.pm >+++ b/C4/Record.pm >@@ -330,7 +330,7 @@ sub marc2endnote { > > =head2 marc2csv - Convert several records from UNIMARC to CSV > >- my ($csv) = marc2csv($biblios, $csvprofileid); >+ my ($csv) = marc2csv($biblios, $csvprofileid, $itemnumbers); > > Pre and postprocessing can be done through a YAML file > >@@ -340,10 +340,12 @@ C<$biblio> - a list of biblionumbers > > C<$csvprofileid> - the id of the CSV profile to use for the export (see export_format.export_format_id and the GetCsvProfiles function in C4::Csv) > >+C<$itemnumbers> - a list of itemnumbers to export >+ > =cut > > sub marc2csv { >- my ($biblios, $id) = @_; >+ my ($biblios, $id, $itemnumbers) = @_; > my $output; > my $csv = Text::CSV::Encoded->new(); > >@@ -358,9 +360,17 @@ sub marc2csv { > eval $preprocess if ($preprocess); > > my $firstpass = 1; >- foreach my $biblio (@$biblios) { >- $output .= marcrecord2csv($biblio, $id, $firstpass, $csv, $fieldprocessing) ; >- $firstpass = 0; >+ if ( $itemnumbers ) { >+ for my $itemnumber ( @$itemnumbers) { >+ my $biblionumber = GetBiblionumberFromItemnumber $itemnumber; >+ $output .= marcrecord2csv( $biblionumber, $id, $firstpass, $csv, $fieldprocessing, [$itemnumber] ); >+ $firstpass = 0; >+ } >+ } else { >+ foreach my $biblio (@$biblios) { >+ $output .= marcrecord2csv( $biblio, $id, $firstpass, $csv, $fieldprocessing ); >+ $firstpass = 0; >+ } > } > > # Postprocessing >@@ -383,16 +393,21 @@ C<$header> - true if the headers are to be printed (typically at first pass) > > C<$csv> - an already initialised Text::CSV object > >+C<$fieldprocessing> >+ >+C<$itemnumbers> a list of itemnumbers to export >+ > =cut > > > sub marcrecord2csv { >- my ($biblio, $id, $header, $csv, $fieldprocessing) = @_; >+ my ($biblio, $id, $header, $csv, $fieldprocessing, $itemnumbers) = @_; > my $output; > > # Getting the record >- my $record = GetMarcBiblio($biblio, 1); >+ my $record = GetMarcBiblio($biblio); > next unless $record; >+ C4::Biblio::EmbedItemsInMarcBiblio( $record, $biblio, $itemnumbers ); > # Getting the framework > my $frameworkcode = GetFrameworkCode($biblio); > >@@ -499,18 +514,28 @@ sub marcrecord2csv { > my @fields = ($record->field($marcfield)); > my $authvalues = GetKohaAuthorisedValuesFromField($marcfield, undef, $frameworkcode, undef); > >- my @valuesarray; >- foreach (@fields) { >- my $value; >- >- # Getting authorised value >- $value = defined $authvalues->{$_->as_string} ? $authvalues->{$_->as_string} : $_->as_string; >+ my @valuesarray; >+ foreach (@fields) { >+ my $value; >+ >+ # If it is a control field >+ if ($_->is_control_field) { >+ $value = defined $authvalues->{$_->as_string} ? $authvalues->{$_->as_string} : $_->as_string; >+ } else { >+ # If it is a field, we gather all subfields, joined by the subfield separator >+ my @subvaluesarray; >+ my @subfields = $_->subfields; >+ foreach my $subfield (@subfields) { >+ push (@subvaluesarray, defined $authvalues->{$subfield->[1]} ? $authvalues->{$subfield->[1]} : $subfield->[1]); >+ } >+ $value = join ($subfieldseparator, @subvaluesarray); >+ } > >- # Field processing >- eval $fieldprocessing if ($fieldprocessing); >+ # Field processing >+ eval $fieldprocessing if ($fieldprocessing); > >- push @valuesarray, $value; >- } >+ push @valuesarray, $value; >+ } > push (@fieldstab, join($fieldseparator, @valuesarray)); > } > }; >diff --git a/circ/circulation.pl b/circ/circulation.pl >index 551ceba..caea2f4 100755 >--- a/circ/circulation.pl >+++ b/circ/circulation.pl >@@ -734,6 +734,8 @@ $template->param( > AllowRenewalLimitOverride => C4::Context->preference("AllowRenewalLimitOverride"), > dateformat => C4::Context->preference("dateformat"), > DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), >+ dont_export_fields => C4::Context->preference("DontExportFields"), >+ csv_profile_for_export => C4::Context->preference("CsvProfileForExport"), > canned_bor_notes_loop => $canned_notes, > ); > >diff --git a/installer/data/mysql/updatedatabase.pl b/installer/data/mysql/updatedatabase.pl >index 97a722e..591d829 100755 >--- a/installer/data/mysql/updatedatabase.pl >+++ b/installer/data/mysql/updatedatabase.pl >@@ -5459,6 +5459,25 @@ if (C4::Context->preference("Version") < TransformToNum($DBversion)) { > SetVersion($DBversion); > } > >+ >+$DBversion = "3.09.00.XXX"; >+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { >+ $dbh->do(qq{ >+ INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('DontExportFields','','List of fields for non export in circulation.pl (separated by a space)','',''); >+ }); >+ print "Upgrade to $DBversion done (Add system preference DontExportFields)\n"; >+ SetVersion($DBversion); >+} >+ >+$DBversion = "3.09.00.XXX"; >+if ( C4::Context->preference("Version") < TransformToNum($DBversion) ) { >+ $dbh->do(qq{ >+ INSERT IGNORE INTO systempreferences (variable,value,explanation,options,type) VALUES('CsvProfileForExport','','Set a profile name for CSV export','',''); >+ }); >+ print "Upgrade to $DBversion done (Adds New System preference CsvProfileForExport)\n"; >+ SetVersion($DBversion) >+} >+ > =head1 FUNCTIONS > > =head2 TableExists($table) >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc >index 0d994c9..f2edfd6 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/checkouts-table-footer.inc >@@ -3,7 +3,7 @@ > <td colspan="6" style="text-align: right; font-weight:bold;">Totals:</td> > <td>[% totaldue %]</td> > <td>[% totalprice %]</td> >- <td colspan="2"> >+ <td colspan="3"> > <p>Renewal due date: <input type="text" size="8" id="newduedate" name="newduedate" value="[% newduedate %]" /> > </p> > <p><label>Forgive fines on return: <input type="checkbox" name="exemptfine" value="1" /></label></p> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/includes/prefs-menu.inc b/koha-tmpl/intranet-tmpl/prog/en/includes/prefs-menu.inc >index 3ecaefc..af23ab7 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/includes/prefs-menu.inc >+++ b/koha-tmpl/intranet-tmpl/prog/en/includes/prefs-menu.inc >@@ -15,6 +15,7 @@ > [% IF ( searching ) %]<li class="active">[% ELSE %]<li>[% END %]<a title="Searching" href="/cgi-bin/koha/admin/preferences.pl?tab=searching">Searching</a></li> > [% IF ( serials ) %]<li class="active">[% ELSE %]<li>[% END %]<a title="Serials" href="/cgi-bin/koha/admin/preferences.pl?tab=serials">Serials</a></li> > [% IF ( staff_client ) %]<li class="active">[% ELSE %]<li>[% END %]<a title="Staff client" href="/cgi-bin/koha/admin/preferences.pl?tab=staff_client">Staff client</a></li> >+[% IF ( tools ) %]<li class="active">[% ELSE %]<li>[% END %]<a title="Tools" href="/cgi-bin/koha/admin/preferences.pl?tab=tools">Tools</a></li> > [% IF ( web_services ) %]<li class="active">[% ELSE %]<li>[% END %]<a title="Web services" href="/cgi-bin/koha/admin/preferences.pl?tab=web_services">Web services</a></li> > </ul> > </div> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >index e07fc0d..b8245e9 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/circulation.pref >@@ -109,6 +109,12 @@ Circulation: > yes: Do > no: "Do not" > - update a bibliographic record's total issues count whenever an item is issued (WARNING! This increases server load significantly; if performance is a concern, use the update_totalissues.pl cron job to update the total issues count). >+ - >+ - pref: DontExportFields >+ - choices: >+ yes: Export >+ no: "Don't export" >+ - fields for csv or iso2709 export > Checkout Policy: > - > - pref: AllowNotForLoanOverride >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/tools.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/tools.pref >new file mode 100644 >index 0000000..f5ea186 >--- /dev/null >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/tools.pref >@@ -0,0 +1,4 @@ >+Tools: >+ - >+ - pref: CsvProfileForExport >+ - CSV profile for export >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >index 2743c5f..9ebabad 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/circ/circulation.tt >@@ -76,6 +76,16 @@ var allcheckboxes = $(".checkboxed"); > $(allcheckboxes).unCheckCheckboxes(":input[name*=barcodes]"); return false; > }); > >+ $("#CheckAllexports").click(function(){ >+ $(".checkboxed").checkCheckboxes(":input[name*=biblionumbers]"); >+ $(".checkboxed").unCheckCheckboxes(":input[name*=items]"); >+ return false; >+ }); >+ $("#CheckNoexports").click(function(){ >+ $(".checkboxed").unCheckCheckboxes(":input[name*=biblionumbers]"); >+ return false; >+ }); >+ > $("#relrenew_all").click(function(){ > $(allcheckboxes).checkCheckboxes(":input[name*=items]"); > $(allcheckboxes).unCheckCheckboxes(":input[name*=barcodes]"); >@@ -138,9 +148,12 @@ var allcheckboxes = $(".checkboxed"); > $("#add_message_form").show(); > }); > >- $("input.radio").click(function(){ >+ $("input.radio").click(function(){ > radioCheckBox($(this)); >- }); >+ }); >+ $("#exportmenuc").empty(); >+ initExportButton(); >+ > $("#newduedate").datepicker({ minDate: 1 }); // require that renewal date is after today > $("#duedatespec").datepicker({ > onSelect: function(dateText, inst) { $("#barcode").focus(); } >@@ -148,6 +161,56 @@ var allcheckboxes = $(".checkboxed"); > > }); > >+function initExportButton() { >+ var exportmenu = [ >+ { text: _("ISO2709 with items"), onclick: {fn: function(){export_submit("iso2709_995")}} }, >+ { text: _("ISO2709 without items"), onclick: {fn: function(){export_submit("iso2709")}} }, >+ { text: _("CSV"), onclick: {fn: function(){export_submit("csv")}} }, >+ ]; >+ new YAHOO.widget.Button({ >+ type: "menu", >+ label: _("Export"), >+ name: "exportmenubutton", >+ menu: exportmenu, >+ container: "exportmenuc" >+ }); >+} >+ >+function export_submit(format) { >+ if ($("input:checkbox[name='biblionumbers'][checked]").length < 1){ >+ alert(_("You must select a checkout to export")); >+ return; >+ } >+ >+ $("input:checkbox[name='biblionumbers']").each( function(){ >+ var input_item = $(this).siblings("input:checkbox"); >+ if ( $(this).is(":checked") ) { >+ $(input_item).attr("checked", "checked"); >+ } else { >+ $(input_item).attr("checked", ""); >+ } >+ } ); >+ >+ if (format == 'iso2709_995') { >+ format = 'iso2709'; >+ $("#dont_export_item").val(0); >+ } else if (format == 'iso2709') { >+ $("#dont_export_item").val(1); >+ } else { >+ [% UNLESS ( csv_profile_for_export ) %] >+ alert(_("You must defined a csv profile for export (in tools>CSV export profiles) and filled the CsvProfileForExport system preference")); >+ return false; >+ [% END %] >+ } >+ document.issues.action="/cgi-bin/koha/tools/export.pl"; >+ document.getElementById("export_format").value = format; >+ document.issues.submit(); >+ >+ /* Reset form action to its initial value */ >+ document.issues.action="/cgi-bin/koha/reserve/renewscript.pl"; >+ >+}; >+ > function validate1(date) { > var today = new Date(); > if ( date < today ) { >@@ -667,7 +730,7 @@ No patron matched <span class="ex">[% message %]</span> > <!-- SUMMARY : TODAY & PREVIOUS ISSUES --> > <div id="checkouts"> > [% IF ( issuecount ) %] >- <form action="/cgi-bin/koha/reserve/renewscript.pl" method="post" class="checkboxed"> >+ <form name="issues" action="/cgi-bin/koha/reserve/renewscript.pl" method="post" class="checkboxed"> > <input type="hidden" value="circ" name="destination" /> > <input type="hidden" name="cardnumber" value="[% cardnumber %]" /> > <input type="hidden" name="borrowernumber" value="[% borrowernumber %]" /> >@@ -684,6 +747,7 @@ No patron matched <span class="ex">[% message %]</span> > <th scope="col">Price</th> > <th scope="col">Renew <p class="column-tool"><a href="#" id="CheckAllitems">select all</a> | <a href="#" id="CheckNoitems">none</a></p></th> > <th scope="col">Check in <p class="column-tool"><a href="#" id="CheckAllreturns">select all</a> | <a href="#" id="CheckNoreturns">none</a></p></th> >+ <th scope="col">Export <p class="column-tool"><a href="#" id="CheckAllexports">select all</a> | <a href="#" id="CheckNoexports">none</a></p></th> > </tr> > [% IF ( todayissues ) %]</thead> > [% INCLUDE 'checkouts-table-footer.inc' %] >@@ -757,8 +821,8 @@ No patron matched <span class="ex">[% message %]</span> > [% END %] <!-- /loop todayissues --> > <!-- /if todayissues -->[% END %] > [% IF ( previssues ) %] >-[% IF ( todayissues ) %]<tr><th colspan="10"><a name="previous" id="previous"></a>Previous checkouts</th></tr>[% ELSE %] >-<tr><th class="{sorter: false}" colspan="10"><a name="previous" id="previous"></a>Previous checkouts</th></tr></thead> >+[% IF ( todayissues ) %]<tr><th colspan="11"><a name="previous" id="previous"></a>Previous checkouts</th></tr>[% ELSE %] >+<tr><th class="{sorter: false}" colspan="11"><a name="previous" id="previous"></a>Previous checkouts</th></tr></thead> > [% INCLUDE 'checkouts-table-footer.inc' %] > <tbody> > [% END %] >@@ -827,6 +891,10 @@ No patron matched <span class="ex">[% message %]</span> > <input type="checkbox" name="all_barcodes[]" value="[% previssue.barcode %]" checked="checked" style="display: none;" /> > </td> > [% END %] >+ <td style="text-align:center;"> >+ <input type="checkbox" id="export_[% previssue.biblionumber %]" name="biblionumbers" value="[% previssue.biblionumber %]" /> >+ <input type="checkbox" name="itemnumbers" value="[% previssue.itemnumber %]" style="visibility:hidden;" /> >+ </td> > [% END %] > </tr> > <!-- /loop previssues -->[% END %] >@@ -843,7 +911,14 @@ No patron matched <span class="ex">[% message %]</span> > [% END %] > <input type="submit" name="renew_checked" value="Renew or Return checked items" /> > <input type="submit" id="renew_all" name="renew_all" value="Renew all" /> >- </fieldset> >+ <br/><br/> >+ Don't export fields : <input type="text" id="dont_export_fields" name="dont_export_fields" value="[% dont_export_fields %]" title="Use for iso2709 exports" /> >+ <span id="exportmenuc">Export</span> >+ <input type="hidden" name="op" value="export" /> >+ <input type="hidden" id="export_format" name="format" value="iso2709" /> >+ <input type="hidden" id="dont_export_item" name="dont_export_item" value="0" /> >+ <input type="hidden" id="record_type" name="record_type" value="bibs" /> >+ </fieldset> > [% END %] > </form> > [% ELSE %] >@@ -890,7 +965,7 @@ No patron matched <span class="ex">[% message %]</span> > [% END %] <!-- /loop relissues --> > <!-- /if relissues -->[% END %] > [% IF ( relprevissues ) %] >-<tr><th class="{sorter: false}" colspan="10"><a name="relprevious" id="relprevious"></a>Previous checkouts</th></tr> >+<tr><th class="{sorter: false}" colspan="11"><a name="relprevious" id="relprevious"></a>Previous checkouts</th></tr> > [% FOREACH relprevissue IN relprevissues %] > [% IF ( loop.odd ) %] > <tr> >diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/export.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/export.tt >index 635e0f8..5542aff 100644 >--- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/export.tt >+++ b/koha-tmpl/intranet-tmpl/prog/en/modules/tools/export.tt >@@ -102,7 +102,7 @@ $(document).ready(function() { > </li> > <li> > <label for="dont_export_fields">Don't export fields</label> >- <input id="dont_export_fields" type="text" name="dont_export_fields" /> >+ <input id="dont_export_fields" type="text" name="dont_export_fields" value="[% dont_export_fields %]" /> > separate by a blank. (e.g., 100a 200 606) > </li></ol> > </fieldset> >diff --git a/tools/export.pl b/tools/export.pl >index 8c08602..33eeaa2 100755 >--- a/tools/export.pl >+++ b/tools/export.pl >@@ -19,6 +19,7 @@ > > use strict; > use warnings; >+use List::MoreUtils qw(uniq); > use C4::Auth; > use C4::Output; > use C4::Biblio; # GetMarcBiblio GetXmlBiblio >@@ -26,12 +27,15 @@ use C4::AuthoritiesMarc; # GetAuthority > use CGI; > use C4::Koha; # GetItemTypes > use C4::Branch; # GetBranches >+use C4::Record; >+use C4::Csv; > > my $query = new CGI; > my $op=$query->param("op") || ''; >-my $filename=$query->param("filename"); >+my $filename=$query->param("filename") || 'koha.mrc'; > my $dbh=C4::Context->dbh; > my $marcflavour = C4::Context->preference("marcflavour"); >+my $format = $query->param("format") || 'iso2709'; > > my ($template, $loggedinuser, $cookie) > = get_template_and_user >@@ -58,170 +62,196 @@ my ($template, $loggedinuser, $cookie) > } > > if ($op eq "export") { >- binmode STDOUT, ':encoding(UTF-8)'; >- print $query->header( -type => 'application/octet-stream', >- -charset => 'utf-8', >- -attachment=>$filename); >- >- my $record_type = $query->param("record_type"); >- my $output_format = $query->param("output_format"); >- my $dont_export_fields = $query->param("dont_export_fields"); >- my @sql_params; >- my $sql_query; >+ if ( $format eq "iso2709" ) { >+ binmode STDOUT, ':encoding(UTF-8)'; >+ print $query->header( >+ -type => 'application/octet-stream', >+ -charset => 'utf-8', >+ -attachment=>$filename >+ ); > >- my $StartingBiblionumber = $query->param("StartingBiblionumber"); >- my $EndingBiblionumber = $query->param("EndingBiblionumber"); >- my $itemtype = $query->param("itemtype"); >- my $start_callnumber = $query->param("start_callnumber"); >- my $end_callnumber = $query->param("end_callnumber"); >- my $start_accession = >- ( $query->param("start_accession") ) >- ? C4::Dates->new( $query->param("start_accession") ) >- : ''; >- my $end_accession = >- ( $query->param("end_accession") ) >- ? C4::Dates->new( $query->param("end_accession") ) >- : ''; >- my $dont_export_items = $query->param("dont_export_item"); >- my $strip_nonlocal_items = $query->param("strip_nonlocal_items"); >+ my $record_type = $query->param("record_type"); >+ my $output_format = $query->param("output_format") || 'marc'; >+ my $dont_export_fields = $query->param("dont_export_fields"); >+ my @biblionumbers = $query->param("biblionumbers"); >+ my @itemnumbers = $query->param("itemnumbers"); >+ my @sql_params; >+ my $sql_query; >+ my @recordids; > >- my $starting_authid = $query->param('starting_authid'); >- my $ending_authid = $query->param('ending_authid'); >- my $authtype = $query->param('authtype'); >+ my $StartingBiblionumber = $query->param("StartingBiblionumber"); >+ my $EndingBiblionumber = $query->param("EndingBiblionumber"); >+ my $itemtype = $query->param("itemtype"); >+ my $start_callnumber = $query->param("start_callnumber"); >+ my $end_callnumber = $query->param("end_callnumber"); >+ my $start_accession = >+ ( $query->param("start_accession") ) >+ ? C4::Dates->new( $query->param("start_accession") ) >+ : ''; >+ my $end_accession = >+ ( $query->param("end_accession") ) >+ ? C4::Dates->new( $query->param("end_accession") ) >+ : ''; >+ my $dont_export_items = $query->param("dont_export_item"); >+ my $strip_nonlocal_items = $query->param("strip_nonlocal_items"); > >- if ( $record_type eq 'bibs' ) { >- my $items_filter = >- $branch || $start_callnumber || $end_callnumber || >- $start_accession || $end_accession || >- ($itemtype && C4::Context->preference('item-level_itypes')); >- $sql_query = $items_filter ? >- "SELECT DISTINCT biblioitems.biblionumber >- FROM biblioitems JOIN items >- USING (biblionumber) WHERE 1" >- : >- "SELECT biblioitems.biblionumber FROM biblioitems WHERE biblionumber >0 "; >+ my $starting_authid = $query->param('starting_authid'); >+ my $ending_authid = $query->param('ending_authid'); >+ my $authtype = $query->param('authtype'); > >- if ( $StartingBiblionumber ) { >- $sql_query .= " AND biblioitems.biblionumber >= ? "; >- push @sql_params, $StartingBiblionumber; >- } >+ if ( $record_type eq 'bibs' and not @biblionumbers ) { >+ my $items_filter = >+ $branch >+ || $start_callnumber >+ || $end_callnumber >+ || $start_accession >+ || $end_accession >+ || ($itemtype && C4::Context->preference('item-level_itypes')); >+ $sql_query = $items_filter ? >+ "SELECT DISTINCT biblioitems.biblionumber >+ FROM biblioitems JOIN items >+ USING (biblionumber) WHERE 1" >+ : >+ "SELECT biblioitems.biblionumber FROM biblioitems WHERE biblionumber >0 "; > >- if ( $EndingBiblionumber ) { >- $sql_query .= " AND biblioitems.biblionumber <= ? "; >- push @sql_params, $EndingBiblionumber; >- } >+ if ( $StartingBiblionumber ) { >+ $sql_query .= " AND biblioitems.biblionumber >= ? "; >+ push @sql_params, $StartingBiblionumber; >+ } > >- if ($branch) { >- $sql_query .= " AND homebranch = ? "; >- push @sql_params, $branch; >- } >+ if ( $EndingBiblionumber ) { >+ $sql_query .= " AND biblioitems.biblionumber <= ? "; >+ push @sql_params, $EndingBiblionumber; >+ } > >- if ($start_callnumber) { >- $sql_query .= " AND itemcallnumber <= ? "; >- push @sql_params, $start_callnumber; >- } >+ if ($branch) { >+ $sql_query .= " AND homebranch = ? "; >+ push @sql_params, $branch; >+ } > >- if ($end_callnumber) { >- $sql_query .= " AND itemcallnumber >= ? "; >- push @sql_params, $end_callnumber; >- } >- if ($start_accession) { >- $sql_query .= " AND dateaccessioned >= ? "; >- push @sql_params, $start_accession->output('iso'); >- } >+ if ($start_callnumber) { >+ $sql_query .= " AND itemcallnumber <= ? "; >+ push @sql_params, $start_callnumber; >+ } > >- if ($end_accession) { >- $sql_query .= " AND dateaccessioned <= ? "; >- push @sql_params, $end_accession->output('iso'); >- } >+ if ($end_callnumber) { >+ $sql_query .= " AND itemcallnumber >= ? "; >+ push @sql_params, $end_callnumber; >+ } >+ if ($start_accession) { >+ $sql_query .= " AND dateaccessioned >= ? "; >+ push @sql_params, $start_accession->output('iso'); >+ } > >- if ( $itemtype ) { >- $sql_query .= (C4::Context->preference('item-level_itypes')) ? " AND items.itype = ? " : " AND biblioitems.itemtype = ?"; >- push @sql_params, $itemtype; >- } >- } >- elsif ( $record_type eq 'auths' ) { >- $sql_query = >- "SELECT DISTINCT auth_header.authid FROM auth_header WHERE 1"; >+ if ($end_accession) { >+ $sql_query .= " AND dateaccessioned <= ? "; >+ push @sql_params, $end_accession->output('iso'); >+ } > >- if ($starting_authid) { >- $sql_query .= " AND auth_header.authid >= ? "; >- push @sql_params, $starting_authid; >+ if ( $itemtype ) { >+ $sql_query .= (C4::Context->preference('item-level_itypes')) ? " AND items.itype = ? " : " AND biblioitems.itemtype = ?"; >+ push @sql_params, $itemtype; >+ } > } >+ elsif ( $record_type eq 'auths' ) { >+ $sql_query = >+ "SELECT DISTINCT auth_header.authid FROM auth_header WHERE 1"; > >- if ($ending_authid) { >- $sql_query .= " AND auth_header.authid <= ? "; >- push @sql_params, $ending_authid; >- } >+ if ($starting_authid) { >+ $sql_query .= " AND auth_header.authid >= ? "; >+ push @sql_params, $starting_authid; >+ } > >- if ($authtype) { >- $sql_query .= " AND auth_header.authtypecode = ? "; >- push @sql_params, $authtype; >- } >- } >+ if ($ending_authid) { >+ $sql_query .= " AND auth_header.authid <= ? "; >+ push @sql_params, $ending_authid; >+ } > >- my $sth = $dbh->prepare($sql_query); >- $sth->execute(@sql_params); >+ if ($authtype) { >+ $sql_query .= " AND auth_header.authtypecode = ? "; >+ push @sql_params, $authtype; >+ } >+ } elsif ( @biblionumbers ) { >+ push @recordids, (@biblionumbers); >+ } > >- while ( my ($recordid) = $sth->fetchrow ) { >- my $record; >- if ( $record_type eq 'bibs' ) { >- $record = eval { GetMarcBiblio($recordid); }; >+ unless ( @biblionumbers ) { >+ my $sth = $dbh->prepare($sql_query); >+ $sth->execute(@sql_params); >+ push @recordids, map { map { $$_[0] } $_ } @{$sth->fetchall_arrayref}; >+ } > >- # FIXME: decide how to handle records GetMarcBiblio can't parse or retrieve >- if ($@) { >- next; >- } >- next if not defined $record; >- C4::Biblio::EmbedItemsInMarcBiblio( $record, $recordid ) >- unless $dont_export_items; >- if ( $strip_nonlocal_items || $limit_ind_branch ) { >- my ( $homebranchfield, $homebranchsubfield ) = >- GetMarcFromKohaField( 'items.homebranch', '' ); >- for my $itemfield ( $record->field($homebranchfield) ) { >+ for my $recordid ( uniq @recordids ) { >+ my $record; >+ if ( $record_type eq 'bibs' ) { >+ $record = eval { GetMarcBiblio($recordid); }; >+ # FIXME: decide how to handle records GetMarcBiblio can't parse or retrieve >+ next if $@; >+ next if not defined $record; >+ C4::Biblio::EmbedItemsInMarcBiblio( $record, $recordid, \@itemnumbers ) >+ unless $dont_export_items; >+ if ( $strip_nonlocal_items || $limit_ind_branch || $dont_export_items ) { >+ my ( $homebranchfield, $homebranchsubfield ) = >+ GetMarcFromKohaField( 'items.homebranch', '' ); >+ for my $itemfield ( $record->field($homebranchfield) ) { > >-# if stripping nonlocal items, use loggedinuser's branch if they didn't select one >- $branch = C4::Context->userenv->{'branch'} unless $branch; >- $record->delete_field($itemfield) >- if ( >- $itemfield->subfield($homebranchsubfield) ne $branch ); >+ # if stripping nonlocal items, use loggedinuser's branch if they didn't select one >+ $branch = C4::Context->userenv->{'branch'} unless $branch; >+ $record->delete_field($itemfield) >+ if ( $dont_export_items || $itemfield->subfield($homebranchsubfield) ne $branch ); >+ } > } > } >- } >- elsif ( $record_type eq 'auths' ) { >- $record = C4::AuthoritiesMarc::GetAuthority($recordid); >- next if not defined $record; >- } >+ elsif ( $record_type eq 'auths' ) { >+ $record = C4::AuthoritiesMarc::GetAuthority($recordid); >+ next if not defined $record; >+ } > >- if ( $dont_export_fields ) { >- my @fields = split " ", $dont_export_fields; >- foreach ( @fields ) { >- /^(\d*)(\w)?$/; >- my $field = $1; >- my $subfield = $2; >- # skip if this record doesn't have this field >- next if not defined $record->field($field); >- if( $subfield ) { >- $record->field($field)->delete_subfields($subfield); >+ if ( $dont_export_fields ) { >+ my @fields = split " ", $dont_export_fields; >+ foreach ( @fields ) { >+ /^(\d*)(\w)?$/; >+ my $field = $1; >+ my $subfield = $2; >+ # skip if this record doesn't have this field >+ next if not defined $record->field($field); >+ if( $subfield ) { >+ $record->field($field)->delete_subfields($subfield); >+ } >+ else { >+ $record->delete_field($record->field($field)); >+ } > } >- else { >- $record->delete_field($record->field($field)); >+ } >+ if ( $output_format eq "xml" ) { >+ if ($marcflavour eq 'UNIMARC' && $record_type eq 'auths') { >+ print $record->as_xml_record('UNIMARCAUTH'); >+ } else { >+ print $record->as_xml_record($marcflavour); > } > } >- } >- if ( $output_format eq "xml" ) { >- if ($marcflavour eq 'UNIMARC' && $record_type eq 'auths') { >- print $record->as_xml_record('UNIMARCAUTH'); >- } else { >- print $record->as_xml_record($marcflavour); >+ else { >+ print $record->as_usmarc(); > } > } >- else { >- print $record->as_usmarc(); >- } >+ exit; >+ } >+ elsif ( $format eq "csv" ) { >+ my @biblionumbers = uniq $query->param("biblionumbers"); >+ my @itemnumbers = $query->param("itemnumbers"); >+ my $output = marc2csv( >+ \@biblionumbers, >+ GetCsvProfileId(C4::Context->preference('CsvProfileForExport')), >+ \@itemnumbers, >+ ); >+ print $query->header( >+ -type => 'application/octet-stream', >+ -'Content-Transfer-Encoding' => 'binary', >+ -attachment => "export.csv" >+ ); >+ print $output; >+ exit; > } >- exit; >- > } # if export > > else { >@@ -264,6 +294,7 @@ else { > itemtypeloop => \@itemtypesloop, > DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(), > authtypeloop => \@authtypesloop, >+ dont_export_fields => C4::Context->preference("DontExportFields"), > ); > > output_html_with_http_headers $query, $cookie, $template->output; >-- >1.7.2.5
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 7986
:
9269
|
9972
|
10635
|
10675
|
11002
|
11388
|
11407
|
11408
|
11409
|
11972
|
11998
|
11999
|
12000
|
12168
|
12212
|
12296
|
12457
|
12819
|
12821
|
12822
|
12824
|
12840
|
12841
|
12850
|
12882