X-Git-Url: http://koha-dev.rot13.org:8081/gitweb/?a=blobdiff_plain;f=C4%2FBiblio.pm;h=7a49f47df7c53b2b71155ce2a049346e3eec7026;hb=e96f32b29c64c635cfdc4c23192b279fa6e5c9d3;hp=491201a5af391ea61c063b4d20b413377bbaad13;hpb=70d61d80fbf48df4d2a3843ea3349ea77de5fbf8;p=srvgit diff --git a/C4/Biblio.pm b/C4/Biblio.pm index 491201a5af..7a49f47df7 100644 --- a/C4/Biblio.pm +++ b/C4/Biblio.pm @@ -29,7 +29,6 @@ BEGIN { @EXPORT_OK = qw( AddBiblio GetBiblioData - GetMarcBiblio GetISBDView GetMarcControlnumber GetMarcISBN @@ -54,7 +53,6 @@ BEGIN { CountItemsIssued ModBiblio ModZebra - EmbedItemsInMarcBiblio UpdateTotalIssues RemoveAllNsb DelBiblio @@ -95,14 +93,15 @@ use C4::Charset qw( nsb_clean SetMarcUnicodeFlag SetUTF8Flag - StripNonXmlChars ); +use C4::Languages; use C4::Linker; use C4::OAI::Sets; -use C4::Items qw( GetHiddenItemnumbers GetMarcItem ); +use C4::Items qw( GetMarcItem ); use Koha::Logger; use Koha::Caches; +use Koha::ClassSources; use Koha::Authority::Types; use Koha::Acquisition::Currencies; use Koha::BackgroundJob::BatchUpdateBiblioHoldsQueue; @@ -284,12 +283,12 @@ sub AddBiblio { # update MARC subfield that stores biblioitems.cn_sort _koha_marc_update_biblioitem_cn_sort( $record, $olddata, $frameworkcode ); - if (C4::Context->preference('BiblioAddsAuthorities')) { + if (C4::Context->preference('AutoLinkBiblios')) { BiblioAutoLink( $record, $frameworkcode ); } - # now add the record - ModBiblioMarc( $record, $biblionumber, { skip_record_index => $skip_record_index } ) unless $defer_marc_save; + # now add the record, don't index while we are in the transaction though + ModBiblioMarc( $record, $biblionumber, { skip_record_index => 1 } ) unless $defer_marc_save; # update OAI-PMH sets if(C4::Context->preference("OAI-PMH:AutoUpdateSets")) { @@ -299,7 +298,13 @@ sub AddBiblio { _after_biblio_action_hooks({ action => 'create', biblio_id => $biblionumber }); logaction( "CATALOGUING", "ADD", $biblionumber, "biblio" ) if C4::Context->preference("CataloguingLog"); + }); + # We index now, after the transaction is committed + unless ( $skip_record_index ) { + my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX }); + $indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" ); + } } catch { warn $_; ( $biblionumber, $biblioitemnumber ) = ( undef, undef ); @@ -368,7 +373,7 @@ sub ModBiblio { logaction( "CATALOGUING", "MODIFY", $biblionumber, "biblio BEFORE=>" . $biblio->metadata->record->as_formatted ); } - if ( !$options->{disable_autolink} && C4::Context->preference('BiblioAddsAuthorities') ) { + if ( !$options->{disable_autolink} && C4::Context->preference('AutoLinkBiblios') ) { BiblioAutoLink( $record, $frameworkcode ); } @@ -1186,91 +1191,6 @@ sub GetMarcSubfieldStructureFromKohaField { return wantarray ? @{$mss->{$kohafield}} : $mss->{$kohafield}->[0]; } -=head2 GetMarcBiblio - - my $record = GetMarcBiblio({ - biblionumber => $biblionumber, - embed_items => $embeditems, - opac => $opac, - borcat => $patron_category }); - -Returns MARC::Record representing a biblio record, or C if the -biblionumber doesn't exist. - -Both embed_items and opac are optional. -If embed_items is passed and is 1, items are embedded. -If opac is passed and is 1, the record is filtered as needed. - -=over 4 - -=item C<$biblionumber> - -the biblionumber - -=item C<$embeditems> - -set to true to include item information. - -=item C<$opac> - -set to true to make the result suited for OPAC view. This causes things like -OpacHiddenItems to be applied. - -=item C<$borcat> - -If the OpacHiddenItemsExceptions system preference is set, this patron category -can be used to make visible OPAC items which would be normally hidden. -It only makes sense in combination both embed_items and opac values true. - -=back - -=cut - -sub GetMarcBiblio { - my ($params) = @_; - - if (not defined $params) { - carp 'GetMarcBiblio called without parameters'; - return; - } - - my $biblionumber = $params->{biblionumber}; - my $embeditems = $params->{embed_items} || 0; - my $opac = $params->{opac} || 0; - my $borcat = $params->{borcat} // q{}; - - if (not defined $biblionumber) { - carp 'GetMarcBiblio called with undefined biblionumber'; - return; - } - - my $marcxml = GetXmlBiblio( $biblionumber ); - $marcxml = StripNonXmlChars( $marcxml ); - MARC::File::XML->default_record_format( C4::Context->preference('marcflavour') ); - my $record = MARC::Record->new(); - - if ($marcxml) { - $record = eval { - MARC::Record::new_from_xml( $marcxml, "UTF-8", - C4::Context->preference('marcflavour') ); - }; - if ($@) { warn " problem with :$biblionumber : $@ \n$marcxml"; } - return unless $record; - - C4::Biblio::EmbedItemsInMarcBiblio({ - marc_record => $record, - biblionumber => $biblionumber, - opac => $opac, - borcat => $borcat }) - if ($embeditems); - - return $record; - } - else { - return; - } -} - =head2 GetXmlBiblio my $marcxml = GetXmlBiblio($biblionumber); @@ -1461,25 +1381,58 @@ descriptions rather than normal ones when they exist. sub GetAuthorisedValueDesc { my ( $tag, $subfield, $value, $framework, $tagslib, $category, $opac ) = @_; + return q{} unless defined($value); + + my $cache = Koha::Caches->get_instance(); + my $cache_key; if ( !$category ) { return $value unless defined $tagslib->{$tag}->{$subfield}->{'authorised_value'}; #---- branch if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "branches" ) { - my $branch = Koha::Libraries->find($value); - return $branch? $branch->branchname: q{}; + $cache_key = "libraries:name"; + my $libraries = $cache->get_from_cache( $cache_key, { unsafe => 1 } ); + if ( !$libraries ) { + $libraries = { + map { $_->branchcode => $_->branchname } + Koha::Libraries->search( {}, + { columns => [ 'branchcode', 'branchname' ] } ) + ->as_list + }; + $cache->set_in_cache($cache_key, $libraries); + } + return $libraries->{$value}; } #---- itemtypes if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "itemtypes" ) { - my $itemtype = Koha::ItemTypes->find( $value ); - return $itemtype ? $itemtype->translated_description : q||; + my $lang = C4::Languages::getlanguage; + $lang //= 'en'; + $cache_key = 'itemtype:description:' . $lang; + my $itypes = $cache->get_from_cache( $cache_key, { unsafe => 1 } ); + if ( !$itypes ) { + $itypes = + { map { $_->itemtype => $_->translated_description } + Koha::ItemTypes->search()->as_list }; + $cache->set_in_cache( $cache_key, $itypes ); + } + return $itypes->{$value}; } if ( $tagslib->{$tag}->{$subfield}->{'authorised_value'} eq "cn_source" ) { - my $source = GetClassSource($value); - return $source ? $source->{description} : q||; + $cache_key = "cn_sources:description"; + my $cn_sources = $cache->get_from_cache( $cache_key, { unsafe => 1 } ); + if ( !$cn_sources ) { + $cn_sources = { + map { $_->cn_source => $_->description } + Koha::ClassSources->search( {}, + { columns => [ 'cn_source', 'description' ] } ) + ->as_list + }; + $cache->set_in_cache($cache_key, $cn_sources); + } + return $cn_sources->{$value}; } #---- "true" authorized value @@ -1488,10 +1441,25 @@ sub GetAuthorisedValueDesc { my $dbh = C4::Context->dbh; if ( $category ne "" ) { - my $sth = $dbh->prepare( "SELECT lib, lib_opac FROM authorised_values WHERE category = ? AND authorised_value = ?" ); - $sth->execute( $category, $value ); - my $data = $sth->fetchrow_hashref; - return ( $opac && $data->{'lib_opac'} ) ? $data->{'lib_opac'} : $data->{'lib'}; + $cache_key = "AV_descriptions:" . $category; + my $av_descriptions = $cache->get_from_cache( $cache_key, { unsafe => 1 } ); + if ( !$av_descriptions ) { + $av_descriptions = { + map { + $_->authorised_value => + { lib => $_->lib, lib_opac => $_->lib_opac } + } Koha::AuthorisedValues->search( + { category => $category }, + { + columns => [ 'authorised_value', 'lib_opac', 'lib' ] + } + )->as_list + }; + $cache->set_in_cache($cache_key, $av_descriptions); + } + return ( $opac && $av_descriptions->{$value}->{'lib_opac'} ) + ? $av_descriptions->{$value}->{'lib_opac'} + : $av_descriptions->{$value}->{'lib'}; } else { return $value; # if nothing is found return the original value } @@ -2470,84 +2438,6 @@ sub ModZebra { } } -=head2 EmbedItemsInMarcBiblio - - EmbedItemsInMarcBiblio({ - marc_record => $marc, - biblionumber => $biblionumber, - item_numbers => $itemnumbers, - opac => $opac }); - -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. - -If $opac is true, then opac-relevant suppressions are included. - -If opac filtering will be done, borcat should be passed to properly -override if necessary. - -=cut - -sub EmbedItemsInMarcBiblio { - my ($params) = @_; - my ($marc, $biblionumber, $itemnumbers, $opac, $borcat); - $marc = $params->{marc_record}; - if ( !$marc ) { - carp 'EmbedItemsInMarcBiblio: No MARC record passed'; - return; - } - $biblionumber = $params->{biblionumber}; - $itemnumbers = $params->{item_numbers}; - $opac = $params->{opac}; - $borcat = $params->{borcat} // q{}; - - $itemnumbers = [] unless defined $itemnumbers; - - my $frameworkcode = GetFrameworkCode($biblionumber); - _strip_item_fields($marc, $frameworkcode); - - # ... and embed the current items - my $dbh = C4::Context->dbh; - my $sth = $dbh->prepare("SELECT itemnumber FROM items WHERE biblionumber = ?"); - $sth->execute($biblionumber); - my ( $itemtag, $itemsubfield ) = GetMarcFromKohaField( "items.itemnumber" ); - - my @item_fields; # Array holding the actual MARC data for items to be included. - my @items; # Array holding items which are both in the list (sitenumbers) - # and on this biblionumber - - # Flag indicating if there is potential hiding. - my $opachiddenitems = $opac - && ( C4::Context->preference('OpacHiddenItems') !~ /^\s*$/ ); - - while ( my ($itemnumber) = $sth->fetchrow_array ) { - next if @$itemnumbers and not grep { $_ == $itemnumber } @$itemnumbers; - my $item; - if ( $opachiddenitems ) { - $item = Koha::Items->find($itemnumber); - $item = $item ? $item->unblessed : undef; - } - push @items, { itemnumber => $itemnumber, item => $item }; - } - my @items2pass = map { $_->{item} } @items; - my @hiddenitems = - $opachiddenitems - ? C4::Items::GetHiddenItemnumbers({ - items => \@items2pass, - borcat => $borcat }) - : (); - # Convert to a hash for quick searching - my %hiddenitems = map { $_ => 1 } @hiddenitems; - foreach my $itemnumber ( map { $_->{itemnumber} } @items ) { - next if $hiddenitems{$itemnumber}; - my $item_marc = C4::Items::GetMarcItem( $biblionumber, $itemnumber ); - push @item_fields, $item_marc->field($itemtag); - } - $marc->append_fields(@item_fields); -} - =head1 INTERNAL FUNCTIONS =head2 _koha_marc_update_bib_ids @@ -2578,6 +2468,13 @@ sub _koha_marc_update_bib_ids { } else { C4::Biblio::UpsertMarcSubfield($record, $biblioitem_tag, $biblioitem_subfield, $biblioitemnumber); } + + # update the control number (001) in MARC + if(C4::Context->preference('autoControlNumber') eq 'biblionumber'){ + unless($record->field('001')){ + $record->insert_fields_ordered(MARC::Field->new('001', $biblionumber)); + } + } } =head2 _koha_marc_update_biblioitem_cn_sort @@ -3095,7 +2992,7 @@ sub UpdateTotalIssues { my $biblio = Koha::Biblios->find($biblionumber); unless ($biblio) { - carp "UpdateTotalIssues could not get datas of biblio"; + carp "UpdateTotalIssues could not get biblio"; return; }