Bug 35588: Scope authorised value desc lookup according to field/subfield

This patch ensures that the authorised value descriptions looked up
are for the correct field/subfield designated in the CSV profile.

Test plan:
0. Do not apply the patch yet!
1. Go to http://localhost:8081/cgi-bin/koha/tools/csv-profiles.pl
2. Add a CSV profile with the default values and using the following
for the "Profile MARC fields":
000|001|003|005|006|007|008|010|015|016|020|022|040|050|082|100|110|
111|130|240|243|245|246|247|250|260|300|336|337|338|440|490|500|501|
505|520|530|600|610|611|630|648|650|651|690|700|710|711|856|887|942|995

3. Create a new List
4. Add all the database's bibs to that list using SQL like the following (where the shelfnumber equals the number for your list):
insert into virtualshelfcontents (shelfnumber,biblionumber,borrowernumber) select 1,biblionumber,51 from biblio;

5. Go to that list in the staff interface
6. Download that list using your CSV profile

7. Apply the patch
8. koha-plack --reload kohadev

9. Download that list using your CSV profile
10. Note that the output is a little slower, but still quick enough.
11. Note that the output is a bit different. For records like "Gairm",
the output will end in "1" instead of "Yes". This is correct, because
this subfield isn't an authorised value!!!

Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Julian Maurice <julian.maurice@biblibre.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
David Cook 2023-12-18 00:35:53 +00:00 committed by Katrin Fischer
parent ca754a2c5e
commit f53ebe874e
No known key found for this signature in database
GPG Key ID: 0EF6E2C03357A834
2 changed files with 35 additions and 3 deletions

View File

@ -592,20 +592,26 @@ sub marcrecord2csv {
# Or a field
} else {
my $authvalues = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{ frameworkcode => $frameworkcode, tagfield => $tag->{fieldtag}, } );
foreach my $field ( @fields ) {
my $value;
# If it is a control field
if ($field->is_control_field) {
my $authvalues = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{ frameworkcode => $frameworkcode, tagfield => $tag->{fieldtag}, } );
$value = defined $authvalues->{$field->as_string} ? $authvalues->{$field->as_string} : $field->as_string;
} else {
# If it is a field, we gather all subfields, joined by the subfield separator
my @subvaluesarray;
my @subfields = $field->subfields;
foreach my $subfield (@subfields) {
my $authvalues = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{
frameworkcode => $frameworkcode, tagfield => $tag->{fieldtag},
tagsubfield => $subfield->[0],
}
);
push (@subvaluesarray, defined $authvalues->{$subfield->[1]} ? $authvalues->{$subfield->[1]} : $subfield->[1]);
}
$value = join ($subfieldseparator, @subvaluesarray);

View File

@ -156,17 +156,23 @@ subtest 'search_by_*_field + find_by_koha_field + get_description + authorised_v
$mss->delete if $mss;
$mss = Koha::MarcSubfieldStructures->search( { tagfield => 952, tagsubfield => '5', frameworkcode => '' } );
$mss->delete if $mss;
$mss = Koha::MarcSubfieldStructures->search( { tagfield => '003', frameworkcode => '' } );
$mss->delete if $mss;
Koha::AuthorisedValueCategory->new( { category_name => 'TEST' } )->store;
Koha::AuthorisedValueCategory->new( { category_name => 'CONTROL_TEST' } )->store;
Koha::AuthorisedValueCategory->new( { category_name => 'ANOTHER_4_TESTS' } )->store;
Koha::MarcSubfieldStructure->new( { tagfield => 952, tagsubfield => 'c', frameworkcode => '', authorised_value => 'TEST', kohafield => 'items.location' } )->store;
Koha::MarcSubfieldStructure->new( { tagfield => 952, tagsubfield => 'c', frameworkcode => 'ACQ', authorised_value => 'TEST', kohafield => 'items.location' } )->store;
Koha::MarcSubfieldStructure->new( { tagfield => 952, tagsubfield => 'd', frameworkcode => '', authorised_value => 'ANOTHER_4_TESTS', kohafield => 'items.another_field' } )->store;
Koha::MarcSubfieldStructure->new( { tagfield => 952, tagsubfield => '5', frameworkcode => '', authorised_value => 'restricted_for_testing', kohafield => 'items.restricted' } )->store;
Koha::MarcSubfieldStructure->new( { tagfield => '003', frameworkcode => '', authorised_value => 'CONTROL_TEST', } )->store;
Koha::AuthorisedValue->new( { category => 'TEST', authorised_value => 'location_1', lib => 'location_1' } )->store;
Koha::AuthorisedValue->new( { category => 'TEST', authorised_value => 'location_2', lib => 'location_2' } )->store;
Koha::AuthorisedValue->new( { category => 'TEST', authorised_value => 'location_3', lib => 'location_3' } )->store;
Koha::AuthorisedValue->new( { category => 'ANOTHER_4_TESTS', authorised_value => 'an_av' } )->store;
Koha::AuthorisedValue->new( { category => 'ANOTHER_4_TESTS', authorised_value => 'another_av' } )->store;
Koha::AuthorisedValue->new( { category => 'CONTROL_TEST', authorised_value => 'lib1', lib => 'lib1' } )->store;
Koha::AuthorisedValue->new( { category => 'CONTROL_TEST', authorised_value => 'lib2', lib => 'lib2' } )->store;
subtest 'search_by_marc_field' => sub {
plan tests => 4;
my $avs;
@ -254,7 +260,23 @@ subtest 'search_by_*_field + find_by_koha_field + get_description + authorised_v
};
subtest 'get_descriptions_by_marc_field' => sub {
plan tests => 1;
plan tests => 4;
my $control_descriptions = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{ frameworkcode => '', tagfield => '003', } );
is_deeply(
$control_descriptions,
{
'lib1' => 'lib1',
'lib2' => 'lib2',
},
);
my $control_descriptions_cached = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{ frameworkcode => '', tagfield => '003', } );
is("$control_descriptions","$control_descriptions_cached","Same memory address used proves cached control desc data");
my $descriptions = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{ frameworkcode => '', tagfield => '952', tagsubfield => 'c' } );
is_deeply(
@ -265,6 +287,10 @@ subtest 'search_by_*_field + find_by_koha_field + get_description + authorised_v
'location_3' => 'location_3',
},
);
my $descriptions_cached = Koha::AuthorisedValues->get_descriptions_by_marc_field(
{ frameworkcode => '', tagfield => '952', tagsubfield => 'c' } );
is("$descriptions","$descriptions_cached","Same memory address used proves cached desc data");
};
subtest 'authorised_values' => sub {