Bug 26894: Handle subfield 0 and delete empty fields

This patch corrects handling of subfield 0 when copying/moving. Before these
patches copying from subfield 0 would copy the entire field.

We also correct an error that if moving a single subfield, we can leave behind empty
fields with no subfields. They should be deleted.

To test:
1 - Define a new MARC Modification template with actions:
        Delete field 100$0
        Add new field 100$0 with value Test
        Update existing or add new field 100$0 with value TestUpdated
        Move field 100$0 to 600$0
        Copy field 600$0 to 100$0
        Copy and replace field 245$0 to 700$0
2 - Define a new record like:
    LDR 00334nam a22001217a 4500
    003 ff
    005 20201102111604.0
    008 201102b        xxu||||| |||| 00| 0 eng d
    040 _ _ ‡cvsd
    100 1 _ ‡012345‡aKnuth, Donal Ervin‡d1938
    245 _ _ ‡012345‡aThe aty of computer programming‡cDonald E. Knuth
    650 _ 0 ‡042‡aComputer programming‡9462
3 - Modify this record using the template above
4 - Note that entier 245 is copied to 700, same for 600 field
5 - Apply patch
6 - Now only subfields 0 are copied

Signed-off-by: Fridolin Somers <fridolin.somers@biblibre.com>
Signed-off-by: Martin Renvoize <martin.renvoize@ptfs-europe.com>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Nick Clemens 2020-11-02 12:05:47 +00:00 committed by Jonathan Druart
parent 4253eb91a6
commit 77f3d48dee
2 changed files with 13 additions and 13 deletions

View File

@ -141,8 +141,8 @@ sub copy_and_replace_field {
if ( ! ( $record && $fromFieldName && $toFieldName ) ) { return; }
if ( not $fromSubfieldName or $fromSubfieldName eq ''
or not $toSubfieldName or $toSubfieldName eq ''
if ( !defined $fromSubfieldName or $fromSubfieldName eq ''
or !defined $toSubfieldName or $toSubfieldName eq ''
) {
_copy_move_field(
{ record => $record,
@ -480,9 +480,9 @@ sub move_field {
my $regex = $params->{regex};
my $field_numbers = $params->{field_numbers} // [];
if ( not $fromSubfieldName
if ( !defined $fromSubfieldName
or $fromSubfieldName eq ''
or not $toSubfieldName
or !defined $toSubfieldName
or $toSubfieldName eq '' ) {
_copy_move_field(
{ record => $record,
@ -564,6 +564,7 @@ sub _delete_subfield {
foreach my $field ( @fields ) {
$field->delete_subfield( code => $subfieldName );
$record->delete_field( $field ) unless $field->subfields();
}
}

View File

@ -700,6 +700,11 @@ sub expected_record_0 {
my $record = MARC::Record->new;
$record->leader('03174nam a2200445 a 4500');
my @fields = (
MARC::Field->new(
100, '1', ' ',
a => 'Knuth, Donald Ervin',
d => '1938',
),
MARC::Field->new(
245, '1', '4',
0 => '12345',
@ -713,9 +718,7 @@ sub expected_record_0 {
9 => '462',
),
MARC::Field->new(
600, '1', ' ',
a => 'Knuth, Donald Ervin',
d => '1938',
600, ' ', ' ',
0 => 'TestUpdated',
),
MARC::Field->new(
@ -723,9 +726,7 @@ sub expected_record_0 {
0 => 'TestUpdated',
),
MARC::Field->new(
100, '1', ' ',
a => 'Knuth, Donald Ervin',
d => '1938',
100, ' ', ' ',
0 => 'TestUpdated',
),
MARC::Field->new(
@ -733,10 +734,8 @@ sub expected_record_0 {
0 => 'TestUpdated',
),
MARC::Field->new(
700, '1', '4',
700, ' ', ' ',
0 => '12345',
a => 'The art of computer programming',
c => 'Donald E. Knuth.',
),
);
$record->append_fields(@fields);