Bug 18811: Add a script for checking authority data in hidden fields

If you edit an authority record while having data in hidden fields or
subfields, that data will be lost now.
This script can help you to unhide some fields and prevent data loss.

Test plan:
[1] Add a PERSO_NAME record. Fill e.g. 100b.
[2] Hide 100b in the PERSO_NAME framework.
[3] Run auth_show_hidden_data.pl and verify that it reports 100b in
    the PERSO_NAME framework.

Signed-off-by: Marcel de Rooy <m.de.rooy@rijksmuseum.nl>

Signed-off-by: Josef Moravec <josef.moravec@gmail.com>

Signed-off-by: Nick Clemens <nick@bywatersolutions.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Marcel de Rooy 2017-06-22 15:39:41 +02:00 committed by Jonathan Druart
parent ca8f8b4cd9
commit 15dee47518

View file

@ -0,0 +1,124 @@
#!/usr/bin/perl
# Copyright 2017 Rijksmuseum
#
# 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 3 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, see <http://www.gnu.org/licenses>.
# This script walks through your authority marc records and tells you
# which hidden fields in the framework still contain data.
use Modern::Perl;
use Getopt::Long;
use Pod::Usage;
use Koha::Authorities;
use Koha::Authority::Subfields;
use Koha::MetadataRecord::Authority;
my ( $max, $help, $confirm );
GetOptions( 'confirm' => \$confirm, 'help' => \$help, 'max' => \$max );
if ( !$confirm || $help ) {
pod2usage( -verbose => 2 );
exit;
}
our $hidden_fields = Koha::Authority::Subfields->search(
{ hidden => { '!=' => 0 }},
);
our $results = {};
my $auths = Koha::Authorities->search( {}, { order_by => 'authid' } );
my $count = 0;
while( my $record = $auths->next ) {
last if $max && $count >= $max;
scan_record( $record );
$count++;
}
report_results();
sub scan_record {
my ( $record ) = @_;
my $id = $record->authid;
my $type = $record->authtypecode;
my $marc = Koha::MetadataRecord::Authority->get_from_authid($id)->record;
foreach my $fld ( $marc->fields ) { # does not include leader
my @subfields = $fld->is_control_field
? '@'
: map { $_->[0] } $fld->subfields;
foreach my $sub ( @subfields ) {
next if $results->{ $type } && $results->{ $type }->{ $fld->tag } && $results->{ $type }->{ $fld->tag }->{ $sub };
if( $hidden_fields->find($type, $fld->tag, $sub) ) {
$results->{ $type }->{ $fld->tag }->{ $sub } = 1;
}
}
}
# To be overcomplete, check the leader too :)
if( $marc->leader ) {
if( $hidden_fields->find($type, '000', '@') ) {
$results->{ $type }->{ '000' }->{ '@' } = 1;
}
}
}
sub report_results {
my $cnt = 0;
foreach my $fw ( sort keys %$results ) {
foreach my $tag ( sort keys %{$results->{$fw}} ) {
foreach my $sub ( sort keys %{$results->{$fw}->{$tag}} ) {
print "\nFramework ".($fw||'Default').", $tag, $sub contains data but is hidden";
$cnt++;
}
}
}
if( $cnt ) {
print "\n\nNOTE: You should consider removing the hidden attribute of these framework fields in order to not lose data in those fields when editing authority records.\n";
} else {
print "\nNo hidden (sub)fields containing data were found!\n";
}
}
=head1 NAME
auth_show_hidden_data.pl
=head1 SYNOPSIS
auth_show_hidden_data.pl -c -max 1000
=head1 DESCRIPTION
This script tells you if you have authority data in hidden (sub)fields. That
data will be lost when editing such authority records.
=over 8
=item B<-confirm>
Confirm flag. Required to start checking authority records.
=item B<-help>
Usage statement
=item B<-max>
This optional parameter tells the script to stop after the specified number of
records.
=back
=cut