From 1abac089fd9cd68b6f41495d6d771954612ce327 Mon Sep 17 00:00:00 2001 From: Nick Clemens Date: Tue, 18 May 2021 15:06:43 +0000 Subject: [PATCH] Bug 28373: [21.05.x] Add PassItemMarcToXSLT system preference Default stylesheets do not reference item fields for XSLT display, however, we spend time translating the values in the item fields. This patch adds a system preference, PassItemMarcToXSLT. and unless enabled we remove item fields before processing To test: 1 - Perform some search on the staff client and opac 2 - Use the console (F12) to view the time spent on the network tab 3 - Note performance 4 - Apply patch, updatedatabase, restart_all 5 - Repeat searches 6 - Note that display has not changed 7 - Note performance, results should display slightly faster Signed-off-by: Emmi Takkinen Signed-off-by: Katrin Fischer Bug 28373: Unit test Signed-off-by: Emmi Takkinen Signed-off-by: Katrin Fischer Bug 28373: (QA follow-up) Fix typo in system preference description Signed-off-by: Emmi Takkinen Signed-off-by: Katrin Fischer Bug 28373: (follow-up) QA fixes Use fully qualified subroutine name Don't return explicit undef Signed-off-by: Katrin Fischer Bug 28373: (QA follow-up) Add . to end of system preference description Signed-off-by: Katrin Fischer Bug 28373: Add note to XSLT prefs about the new pref Bug 28373: Add warning if custom stylesheets are defined This patch adds a check of the current XSLT prefs and warns to check the new pref if any are not set to default --- C4/Search.pm | 1 + ...373_add_PassItemMarcToXSLT_preference.perl | 15 ++++++++ installer/data/mysql/mandatory/sysprefs.sql | 1 + .../en/modules/admin/preferences/opac.pref | 6 +-- .../modules/admin/preferences/searching.pref | 7 ++++ .../admin/preferences/staff_interface.pref | 6 +-- t/Search.t | 38 ++++++++++++++++++- 7 files changed, 67 insertions(+), 7 deletions(-) create mode 100644 installer/data/mysql/atomicupdate/bug28373_add_PassItemMarcToXSLT_preference.perl diff --git a/C4/Search.pm b/C4/Search.pm index 7161a06f5e..8c546ecfab 100644 --- a/C4/Search.pm +++ b/C4/Search.pm @@ -1773,6 +1773,7 @@ sub searchResults { # Pull out the items fields my @fields = $marcrecord->field($itemtag); + $marcrecord->delete_fields( @fields ) unless C4::Context->preference('PassItemMarcToXSLT'); my $marcflavor = C4::Context->preference("marcflavour"); # adding linked items that belong to host records diff --git a/installer/data/mysql/atomicupdate/bug28373_add_PassItemMarcToXSLT_preference.perl b/installer/data/mysql/atomicupdate/bug28373_add_PassItemMarcToXSLT_preference.perl new file mode 100644 index 0000000000..ef7ec1e5e8 --- /dev/null +++ b/installer/data/mysql/atomicupdate/bug28373_add_PassItemMarcToXSLT_preference.perl @@ -0,0 +1,15 @@ +$DBversion = 'XXX'; +if( CheckVersion( $DBversion ) ) { + $dbh->do( q{ + INSERT IGNORE INTO systempreferences ( `variable`, `value`, `options`, `explanation`, `type` ) VALUES + ('PassItemMarcToXSLT','0',NULL,'If enabled, item fields in the MARC record will be made avaiable to XSLT sheets. Otherwise they will be removed.','YesNo'); + }); + foreach my $pref ('XSLTDetailsDisplay','XSLTListsDisplay','XSLTResultsDisplay','OPACXSLTDetailsDisplay','OPACXSLTListsDisplay','OPACXSLTResultsDisplay'){ + if( C4::Context->preference($pref) ne 'default' ){ + print "NOTE: You have defined a custom stylesheet. If your custom stylesheets are utilizing item fields you must enable the system preference 'PassItemMarcToXSLT'\n"; + last; + } + } + + NewVersion( $DBversion, 28373, "Add PassItemMarcToXSLT system preference"); +} diff --git a/installer/data/mysql/mandatory/sysprefs.sql b/installer/data/mysql/mandatory/sysprefs.sql index 3430bc26e7..6d0e8ec6c3 100644 --- a/installer/data/mysql/mandatory/sysprefs.sql +++ b/installer/data/mysql/mandatory/sysprefs.sql @@ -507,6 +507,7 @@ INSERT INTO systempreferences ( `variable`, `value`, `options`, `explanation`, ` ('OverdueNoticeCalendar',0,NULL,'Take the calendar into consideration when generating overdue notices','YesNo'), ('OverduesBlockCirc','noblock','noblock|confirmation|block','When checking out an item should overdues block checkout, generate a confirmation dialogue, or allow checkout','Choice'), ('OverduesBlockRenewing','allow','allow|blockitem|block','If any of patron checked out documents is late, should renewal be allowed, blocked only on overdue items or blocked on whatever checked out document','Choice'), +('PassItemMarcToXSLT','0',NULL,'If enabled, item fields in the MARC record will be made avaiable to XSLT sheets. Otherwise they will be removed.','YesNo'), ('PatronAnonymizeDelay','',NULL,'Delay for anonymizing patrons', 'Integer'), ('PatronAutoComplete','1','Try|Don\'t try','to guess the patron being entered while typing a patron search for circulation or patron search. Only returns the first 10 results at a time.','YesNo'), ('PatronDuplicateMatchingAddFields','surname|firstname|dateofbirth', NULL,'A list of fields separated by "|" to deduplicate patrons when created','Free'), diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref index 535f65bd87..9e89d333f3 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/opac.pref @@ -101,17 +101,17 @@ OPAC: - 'Display lists in the OPAC using XSLT stylesheet at: ' - pref: OPACXSLTListsDisplay class: file - - '
Options:
  • leave empty for "no xslt"
  • enter "default" for the default one
  • put a path to define a xslt file
  • put an URL for an external specific stylesheet.
{langcode} will be replaced with current interface language.' + - '
Options:
  • leave empty for "no xslt"
  • Enter "default" for the default stylesheet
  • Put a path to define an xslt file
  • Put a URL for an external specific stylesheet.
  • NOTE: The system preference PassItemMarcToXSLT must be enabled if your custom stylesheet utilizes data in the item fields
If you have multiple stylesheets for different langues the placeholder {langcode} will be replaced with current interface language.' - - 'Display OPAC results using XSLT stylesheet at: ' - pref: OPACXSLTResultsDisplay class: file - - '
Options:
  • leave empty for "no xslt"
  • enter "default" for the default one
  • put a path to define a xslt file
  • put an URL for an external specific stylesheet.
{langcode} will be replaced with current interface language.' + - '
Options:
  • leave empty for "no xslt"
  • Enter "default" for the default stylesheet
  • Put a path to define an xslt file
  • Put a URL for an external specific stylesheet.
  • NOTE: The system preference PassItemMarcToXSLT must be enabled if your custom stylesheet utilizes data in the item fields
If you have multiple stylesheets for different langues the placeholder {langcode} will be replaced with current interface language.' - - 'Display OPAC details using XSLT stylesheet at: ' - pref: OPACXSLTDetailsDisplay class: file - - '
Options:
  • leave empty for "no xslt"
  • enter "default" for the default one
  • put a path to define a xslt file
  • put an URL for an external specific stylesheet.
{langcode} will be replaced with current interface language.' + - '
Options:
  • leave empty for "no xslt"
  • Enter "default" for the default stylesheet
  • Put a path to define an xslt file
  • Put a URL for an external specific stylesheet.
  • NOTE: The system preference PassItemMarcToXSLT must be enabled if your custom stylesheet utilizes data in the item fields
If you have multiple stylesheets for different langues the placeholder {langcode} will be replaced with current interface language.' - - "Show itemtype icons in the OPAC: " - pref: OpacNoItemTypeImages diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref index 25b3878307..ebc82bdf8f 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/searching.pref @@ -273,6 +273,13 @@ Searching: 1: "Display" 0: "Don't display" - ' Koha record level itemtype info on detail and result pages in the OPAC and staff interface. This info also displays if the item-level_itypes system preference is set to bibliographic record.' + - + - pref: PassItemMarcToXSLT + type: boolean + choices: + 1: Do + 0: "Don't" + - "make item MARC tags available to XSLT stylesheets. Default is \"Don't\", items are displayed using other methods." Did you mean/spell checking: - - "Swedish service for spellchecking.
" diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_interface.pref b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_interface.pref index a2b25e5168..4c552c4f48 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_interface.pref +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/preferences/staff_interface.pref @@ -71,17 +71,17 @@ Staff interface: - 'Display lists in the staff interface using XSLT stylesheet at: ' - pref: XSLTListsDisplay class: file - - '
Options:
  • Leave empty for "no xslt"
  • enter "default" for the default one
  • put a path to define a xslt file
  • put an URL for an external specific stylesheet.
{langcode} will be replaced with current interface language' + - '
Options:
  • Leave empty for "no xslt"
  • Enter "default" for the default stylesheet
  • Put a path to define an xslt file
  • Put a URL for an external specific stylesheet.
  • NOTE: The system preference PassItemMarcToXSLT must be enabled if your custom stylesheet utilizes data in the item fields
If you have multiple stylesheets for different langues the placeholder {langcode} will be replaced with current interface language.' - - 'Display results in the staff interface using XSLT stylesheet at: ' - pref: XSLTResultsDisplay class: file - - '
Options:
  • Enter "default" for the default one
  • Put a path to define a xslt file
  • Put an URL for an external specific stylesheet.
{langcode} will be replaced with current interface language' + - '
Options:
  • Enter "default" for the default stylesheet
  • Put a path to define an xslt file
  • Put a URL for an external specific stylesheet.
  • NOTE: The system preference PassItemMarcToXSLT must be enabled if your custom stylesheet utilizes data in the item fields
If you have multiple stylesheets for different langues the placeholder {langcode} will be replaced with current interface language.' - - 'Display details in the staff interface using XSLT stylesheet at: ' - pref: XSLTDetailsDisplay class: file - - '
Options:
  • Enter "default" for the default one
  • Put a path to define a xslt file
  • Put an URL for an external specific stylesheet.
{langcode} will be replaced with current interface language' + - '
Options:
  • Enter "default" for the default stylesheet
  • Put a path to define an xslt file
  • Put a URL for an external specific stylesheet.
  • NOTE: The system preference PassItemMarcToXSLT must be enabled if your custom stylesheet utilizes data in the item fields
If you have multiple stylesheets for different langues the placeholder {langcode} will be replaced with current interface language.' - - pref: DisplayIconsXSLT choices: diff --git a/t/Search.t b/t/Search.t index 0959c85de0..11d6eb54b7 100755 --- a/t/Search.t +++ b/t/Search.t @@ -17,14 +17,18 @@ use Modern::Perl; +use C4::Biblio; use Test::More; +use Test::MockModule; +use Test::Warn; use t::lib::Mocks; +use t::lib::TestBuilder; use Module::Load::Conditional qw/check_install/; BEGIN { if ( check_install( module => 'Test::DBIx::Class' ) ) { - plan tests => 3; + plan tests => 4; } else { plan skip_all => "Need Test::DBIx::Class" } @@ -169,4 +173,36 @@ subtest "_build_initial_query tests" => sub { }; +subtest "searchResults PassItemMarcToXSLT test" => sub { + plan tests => 2; + + t::lib::Mocks::mock_preference('OPACXSLTResultsDisplay','default'); + t::lib::Mocks::mock_preference('marcflavour','MARC21'); + my $mock_xslt = Test::MockModule->new("C4::Search"); + $mock_xslt->mock( XSLTParse4Display => sub { + my $params = shift; + my $record = $params->{record}; + warn $record->field('952') ? "Item here" : "No item"; + return; + }); + + my $builder = t::lib::TestBuilder->new; + + my $item = $builder->build_sample_item(); + my $record = $item->biblio->metadata->record; + C4::Biblio::EmbedItemsInMarcBiblio({ marc_record => $record, biblionumber => $item->biblionumber }); + + t::lib::Mocks::mock_preference('PassItemMarcToXSLT','1'); + + warnings_like { C4::Search::searchResults({ interface => "opac" },"test",1,1,0,0,[ $record->as_xml_record ] ,undef) } + [qr/Item here/], + "Item field returned from default XSLT if pref set"; + + t::lib::Mocks::mock_preference('PassItemMarcToXSLT','0'); + + warnings_like { C4::Search::searchResults({ interface => "opac" },"test",1,1,0,0,[ $record->as_xml_record ] ,undef) } + [qr/No item/], + "Item field returned from default XSLT if pref set"; + +} -- 2.20.1