From af0ca8891f255ffcf5791503a56176f4d44e1785 Mon Sep 17 00:00:00 2001 From: Pedro Amorim Date: Thu, 15 Feb 2024 13:36:04 -0100 Subject: [PATCH] Bug 32693: About script: Process only the tab being queried Signed-off-by: David Nind Signed-off-by: Jonathan Druart Signed-off-by: Katrin Fischer --- about.pl | 1359 +++++++++++++++++++++++++++--------------------------- 1 file changed, 692 insertions(+), 667 deletions(-) diff --git a/about.pl b/about.pl index b3bf55221d..37e400fbb7 100755 --- a/about.pl +++ b/about.pl @@ -61,6 +61,8 @@ use Koha::Filter::MARC::ViewPolicy; use C4::Members::Statistics; my $query = CGI->new; +my $params = $query->Vars(); + my ( $template, $loggedinuser, $cookie ) = get_template_and_user( { template_name => "about.tt", @@ -70,6 +72,12 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user( } ); +my $tab = $params->{tab} || 'about'; + +$template->param( + tab => $tab, +); + my $docdir; if ( defined C4::Context->config('docdir') ) { $docdir = C4::Context->config('docdir'); @@ -81,804 +89,821 @@ if ( defined C4::Context->config('docdir') ) { } my %versions = C4::Context::get_versions(); -my $config_timezone = C4::Context->config('timezone') // ''; -my $config_invalid = !DateTime::TimeZone->is_valid_name( $config_timezone ); -my $env_timezone = $ENV{TZ} // ''; -my $env_invalid = !DateTime::TimeZone->is_valid_name( $env_timezone ); -my $actual_bad_tz_fallback = 0; - -if ( $config_timezone ne '' && - $config_invalid ) { - # Bad config - $actual_bad_tz_fallback = 1; -} -elsif ( $config_timezone eq '' && - $env_timezone ne '' && - $env_invalid ) { - # No config, but bad ENV{TZ} - $actual_bad_tz_fallback = 1; -} -my $time_zone = { - actual => C4::Context->tz->name, - actual_bad_tz_fallback => $actual_bad_tz_fallback, - config => $config_timezone, - config_invalid => $config_invalid, - environment => $env_timezone, - environment_invalid => $env_invalid -}; - -{ # Logger checks - my $log4perl_config = C4::Context->config("log4perl_conf"); - my @log4perl_errors; - if ( ! $log4perl_config ) { - push @log4perl_errors, 'missing_config_entry' +if ( $tab eq 'about' ) { + + my $config_timezone = C4::Context->config('timezone') // ''; + my $config_invalid = !DateTime::TimeZone->is_valid_name( $config_timezone ); + my $env_timezone = $ENV{TZ} // ''; + my $env_invalid = !DateTime::TimeZone->is_valid_name( $env_timezone ); + my $actual_bad_tz_fallback = 0; + + if ( $config_timezone ne '' && + $config_invalid ) { + # Bad config + $actual_bad_tz_fallback = 1; } - else { - my @lines = read_file($log4perl_config) or push @log4perl_errors, 'cannot_read_config_file'; - for my $line ( @lines ) { - next unless $line =~ m|log4perl.appender.\w+.filename=(.*)|; - push @log4perl_errors, 'logfile_not_writable' unless -w $1; - } + elsif ( $config_timezone eq '' && + $env_timezone ne '' && + $env_invalid ) { + # No config, but bad ENV{TZ} + $actual_bad_tz_fallback = 1; } - eval {Koha::Logger->get}; - push @log4perl_errors, 'cannot_init_module' and warn $@ if $@; - $template->param( log4perl_errors => @log4perl_errors ); -} - -$template->param( - time_zone => $time_zone, - current_date_and_time => output_pref({ dt => dt_from_string(), dateformat => 'iso' }) -); -my $perl_path = $^X; -if ($^O ne 'VMS') { - $perl_path .= $Config{_exe} unless $perl_path =~ m/$Config{_exe}$/i; -} + my $time_zone = { + actual => C4::Context->tz->name, + actual_bad_tz_fallback => $actual_bad_tz_fallback, + config => $config_timezone, + config_invalid => $config_invalid, + environment => $env_timezone, + environment_invalid => $env_invalid + }; -my $zebraVersion = `zebraidx -V`; + { # Logger checks + my $log4perl_config = C4::Context->config("log4perl_conf"); + my @log4perl_errors; + if ( ! $log4perl_config ) { + push @log4perl_errors, 'missing_config_entry' + } + else { + my @lines = read_file($log4perl_config) or push @log4perl_errors, 'cannot_read_config_file'; + for my $line ( @lines ) { + next unless $line =~ m|log4perl.appender.\w+.filename=(.*)|; + push @log4perl_errors, 'logfile_not_writable' unless -w $1; + } + } + eval {Koha::Logger->get}; + push @log4perl_errors, 'cannot_init_module' and warn $@ if $@; + $template->param( log4perl_errors => @log4perl_errors ); + } -# Check running PSGI env -if ( C4::Context->psgi_env ) { $template->param( - is_psgi => 1, - psgi_server => ($ENV{ PLACK_ENV }) ? "Plack ($ENV{PLACK_ENV})" : - ($ENV{ MOD_PERL }) ? "mod_perl ($ENV{MOD_PERL})" : - 'Unknown' + time_zone => $time_zone, + current_date_and_time => output_pref({ dt => dt_from_string(), dateformat => 'iso' }) ); -} -# Memcached configuration -my $memcached_servers = $ENV{MEMCACHED_SERVERS} || C4::Context->config('memcached_servers'); -my $memcached_namespace = $ENV{MEMCACHED_NAMESPACE} || C4::Context->config('memcached_namespace') // 'koha'; - -my $cache = Koha::Caches->get_instance; -my $effective_caching_method = ref($cache->cache); -# Memcached may have been running when plack has been initialized but could have been stopped since -# FIXME What are the consequences of that?? -my $is_memcached_still_active = $cache->set_in_cache('test_for_about_page', "just a simple value"); - -my $where_is_memcached_config = 'nowhere'; -if ( $ENV{MEMCACHED_SERVERS} and C4::Context->config('memcached_servers') ) { - $where_is_memcached_config = 'both'; -} elsif ( $ENV{MEMCACHED_SERVERS} and not C4::Context->config('memcached_servers') ) { - $where_is_memcached_config = 'ENV_only'; -} elsif ( C4::Context->config('memcached_servers') ) { - $where_is_memcached_config = 'config_only'; -} + my $perl_path = $^X; + if ($^O ne 'VMS') { + $perl_path .= $Config{_exe} unless $perl_path =~ m/$Config{_exe}$/i; + } -$template->param( - effective_caching_method => $effective_caching_method, - memcached_servers => $memcached_servers, - memcached_namespace => $memcached_namespace, - is_memcached_still_active => $is_memcached_still_active, - where_is_memcached_config => $where_is_memcached_config, - perlPath => $perl_path, - zebraVersion => $zebraVersion, - kohaVersion => $versions{'kohaVersion'}, - osVersion => $versions{'osVersion'}, - perlVersion => $versions{'perlVersion'}, - perlIncPath => [ map { perlinc => $_ }, @INC ], - mysqlVersion => $versions{'mysqlVersion'}, - apacheVersion => $versions{'apacheVersion'}, - memcached_running => Koha::Caches->get_instance->memcached_cache, -); + my $zebraVersion = `zebraidx -V`; + + # Check running PSGI env + if ( C4::Context->psgi_env ) { + $template->param( + is_psgi => 1, + psgi_server => ($ENV{ PLACK_ENV }) ? "Plack ($ENV{PLACK_ENV})" : + ($ENV{ MOD_PERL }) ? "mod_perl ($ENV{MOD_PERL})" : + 'Unknown' + ); + } -# Additional system information for warnings + # Memcached configuration + my $memcached_servers = $ENV{MEMCACHED_SERVERS} || C4::Context->config('memcached_servers'); + my $memcached_namespace = $ENV{MEMCACHED_NAMESPACE} || C4::Context->config('memcached_namespace') // 'koha'; + + my $cache = Koha::Caches->get_instance; + my $effective_caching_method = ref($cache->cache); + # Memcached may have been running when plack has been initialized but could have been stopped since + # FIXME What are the consequences of that?? + my $is_memcached_still_active = $cache->set_in_cache('test_for_about_page', "just a simple value"); + + my $where_is_memcached_config = 'nowhere'; + if ( $ENV{MEMCACHED_SERVERS} and C4::Context->config('memcached_servers') ) { + $where_is_memcached_config = 'both'; + } elsif ( $ENV{MEMCACHED_SERVERS} and not C4::Context->config('memcached_servers') ) { + $where_is_memcached_config = 'ENV_only'; + } elsif ( C4::Context->config('memcached_servers') ) { + $where_is_memcached_config = 'config_only'; + } + + $template->param( + effective_caching_method => $effective_caching_method, + memcached_servers => $memcached_servers, + memcached_namespace => $memcached_namespace, + is_memcached_still_active => $is_memcached_still_active, + where_is_memcached_config => $where_is_memcached_config, + perlPath => $perl_path, + zebraVersion => $zebraVersion, + kohaVersion => $versions{'kohaVersion'}, + osVersion => $versions{'osVersion'}, + perlVersion => $versions{'perlVersion'}, + perlIncPath => [ map { perlinc => $_ }, @INC ], + mysqlVersion => $versions{'mysqlVersion'}, + apacheVersion => $versions{'apacheVersion'}, + memcached_running => Koha::Caches->get_instance->memcached_cache, + ); -my $warnStatisticsFieldsError; -my $prefStatisticsFields = C4::Context->preference('StatisticsFields'); -if ($prefStatisticsFields) { - $warnStatisticsFieldsError = $prefStatisticsFields - unless ( $prefStatisticsFields eq C4::Members::Statistics->get_fields() ); } -my $prefAutoCreateAuthorities = C4::Context->preference('AutoCreateAuthorities'); -my $prefRequireChoosingExistingAuthority = C4::Context->preference('RequireChoosingExistingAuthority'); -my $warnPrefRequireChoosingExistingAuthority = ( !$prefAutoCreateAuthorities && ( !$prefRequireChoosingExistingAuthority) ); +if($tab eq 'sysinfo') { -my $prefEasyAnalyticalRecords = C4::Context->preference('EasyAnalyticalRecords'); -my $prefUseControlNumber = C4::Context->preference('UseControlNumber'); -my $warnPrefEasyAnalyticalRecords = ( $prefEasyAnalyticalRecords && $prefUseControlNumber ); + # Additional system information for warnings -my $AnonymousPatron = C4::Context->preference('AnonymousPatron'); -my $warnPrefAnonymousPatronOPACPrivacy = ( - C4::Context->preference('OPACPrivacy') - and not $AnonymousPatron -); -my $warnPrefAnonymousPatronAnonSuggestions = ( - C4::Context->preference('AnonSuggestions') - and not $AnonymousPatron -); + my $warnStatisticsFieldsError; + my $prefStatisticsFields = C4::Context->preference('StatisticsFields'); + if ($prefStatisticsFields) { + $warnStatisticsFieldsError = $prefStatisticsFields + unless ( $prefStatisticsFields eq C4::Members::Statistics->get_fields() ); + } -my $anonymous_patron = Koha::Patrons->find( $AnonymousPatron ); -my $warnPrefAnonymousPatronAnonSuggestions_PatronDoesNotExist = ( $AnonymousPatron && C4::Context->preference('AnonSuggestions') && not $anonymous_patron ); + my $prefAutoCreateAuthorities = C4::Context->preference('AutoCreateAuthorities'); + my $prefRequireChoosingExistingAuthority = C4::Context->preference('RequireChoosingExistingAuthority'); + my $warnPrefRequireChoosingExistingAuthority = ( !$prefAutoCreateAuthorities && ( !$prefRequireChoosingExistingAuthority) ); -my $warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist = ( not $anonymous_patron and Koha::Patrons->search({ privacy => 2 })->count ); + my $prefEasyAnalyticalRecords = C4::Context->preference('EasyAnalyticalRecords'); + my $prefUseControlNumber = C4::Context->preference('UseControlNumber'); + my $warnPrefEasyAnalyticalRecords = ( $prefEasyAnalyticalRecords && $prefUseControlNumber ); -my $warnPrefKohaAdminEmailAddress = !Koha::Email->is_valid(C4::Context->preference('KohaAdminEmailAddress')); + my $AnonymousPatron = C4::Context->preference('AnonymousPatron'); + my $warnPrefAnonymousPatronOPACPrivacy = ( + C4::Context->preference('OPACPrivacy') + and not $AnonymousPatron + ); + my $warnPrefAnonymousPatronAnonSuggestions = ( + C4::Context->preference('AnonSuggestions') + and not $AnonymousPatron + ); -my $c = Koha::Items->filter_by_visible_in_opac->count; -my @warnings = C4::Context->dbh->selectrow_array('SHOW WARNINGS'); -my $warnPrefOpacHiddenItems = $warnings[2]; + my $anonymous_patron = Koha::Patrons->find( $AnonymousPatron ); + my $warnPrefAnonymousPatronAnonSuggestions_PatronDoesNotExist = ( $AnonymousPatron && C4::Context->preference('AnonSuggestions') && not $anonymous_patron ); -my $invalid_yesno = Koha::Config::SysPrefs->search( - { - type => 'YesNo', - value => { -or => { 'is' => undef, -not_in => [ "1", "0" ] } } - } -); -$template->param( invalid_yesno => $invalid_yesno ); + my $warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist = ( not $anonymous_patron and Koha::Patrons->search({ privacy => 2 })->count ); -my $errZebraConnection = C4::Context->Zconn("biblioserver",0)->errcode(); + my $warnPrefKohaAdminEmailAddress = !Koha::Email->is_valid(C4::Context->preference('KohaAdminEmailAddress')); -my $warnIsRootUser = (! $loggedinuser); + my $c = Koha::Items->filter_by_visible_in_opac->count; + my @warnings = C4::Context->dbh->selectrow_array('SHOW WARNINGS'); + my $warnPrefOpacHiddenItems = $warnings[2]; -my $warnNoActiveCurrency = (! defined Koha::Acquisition::Currencies->get_active); + my $invalid_yesno = Koha::Config::SysPrefs->search( + { + type => 'YesNo', + value => { -or => { 'is' => undef, -not_in => [ "1", "0" ] } } + } + ); + $template->param( invalid_yesno => $invalid_yesno ); -my @xml_config_warnings; + my $errZebraConnection = C4::Context->Zconn("biblioserver",0)->errcode(); -if ( C4::Context->config('zebra_bib_index_mode') - and C4::Context->config('zebra_bib_index_mode') eq 'grs1' ) -{ - push @xml_config_warnings, { error => 'zebra_bib_index_mode_is_grs1' }; -} + my $warnIsRootUser = (! $loggedinuser); -if ( C4::Context->config('zebra_auth_index_mode') - and C4::Context->config('zebra_auth_index_mode') eq 'grs1' ) -{ - push @xml_config_warnings, { error => 'zebra_auth_index_mode_is_grs1' }; -} + my $warnNoActiveCurrency = (! defined Koha::Acquisition::Currencies->get_active); -my $authorityserver = C4::Context->zebraconfig('authorityserver'); -if( ( C4::Context->config('zebra_auth_index_mode') - and C4::Context->config('zebra_auth_index_mode') eq 'dom' ) - && ( $authorityserver->{config} !~ /zebra-authorities-dom.cfg/ ) ) -{ - push @xml_config_warnings, { - error => 'zebra_auth_index_mode_mismatch_warn' - }; -} + my @xml_config_warnings; -if ( ! defined C4::Context->config('log4perl_conf') ) { - push @xml_config_warnings, { - error => 'log4perl_entry_missing' + if ( C4::Context->config('zebra_bib_index_mode') + and C4::Context->config('zebra_bib_index_mode') eq 'grs1' ) + { + push @xml_config_warnings, { error => 'zebra_bib_index_mode_is_grs1' }; } -} -if ( ! defined C4::Context->config('lockdir') ) { - push @xml_config_warnings, { - error => 'lockdir_entry_missing' + if ( C4::Context->config('zebra_auth_index_mode') + and C4::Context->config('zebra_auth_index_mode') eq 'grs1' ) + { + push @xml_config_warnings, { error => 'zebra_auth_index_mode_is_grs1' }; } -} -else { - unless ( -w C4::Context->config('lockdir') ) { + + my $authorityserver = C4::Context->zebraconfig('authorityserver'); + if( ( C4::Context->config('zebra_auth_index_mode') + and C4::Context->config('zebra_auth_index_mode') eq 'dom' ) + && ( $authorityserver->{config} !~ /zebra-authorities-dom.cfg/ ) ) + { + push @xml_config_warnings, { + error => 'zebra_auth_index_mode_mismatch_warn' + }; + } + + if ( ! defined C4::Context->config('log4perl_conf') ) { push @xml_config_warnings, { - error => 'lockdir_not_writable', - lockdir => C4::Context->config('lockdir') + error => 'log4perl_entry_missing' } } -} -if ( ! defined C4::Context->config('upload_path') ) { - if ( Koha::Config::SysPrefs->find('OPACBaseURL')->value ) { - # OPACBaseURL seems to be set + if ( ! defined C4::Context->config('lockdir') ) { push @xml_config_warnings, { - error => 'uploadpath_entry_missing' + error => 'lockdir_entry_missing' } - } else { + } + else { + unless ( -w C4::Context->config('lockdir') ) { + push @xml_config_warnings, { + error => 'lockdir_not_writable', + lockdir => C4::Context->config('lockdir') + } + } + } + + if ( ! defined C4::Context->config('upload_path') ) { + if ( Koha::Config::SysPrefs->find('OPACBaseURL')->value ) { + # OPACBaseURL seems to be set + push @xml_config_warnings, { + error => 'uploadpath_entry_missing' + } + } else { + push @xml_config_warnings, { + error => 'uploadpath_and_opacbaseurl_entry_missing' + } + } + } + + if ( ! C4::Context->config('tmp_path') ) { + my $temporary_directory = C4::Context::temporary_directory; push @xml_config_warnings, { - error => 'uploadpath_and_opacbaseurl_entry_missing' + error => 'tmp_path_missing', + effective_tmp_dir => $temporary_directory, } } -} -if ( ! C4::Context->config('tmp_path') ) { - my $temporary_directory = C4::Context::temporary_directory; - push @xml_config_warnings, { - error => 'tmp_path_missing', - effective_tmp_dir => $temporary_directory, + my $encryption_key = C4::Context->config('encryption_key'); + if ( !$encryption_key || $encryption_key eq '__ENCRYPTION_KEY__') { + push @xml_config_warnings, { error => 'encryption_key_missing' }; } -} -my $encryption_key = C4::Context->config('encryption_key'); -if ( !$encryption_key || $encryption_key eq '__ENCRYPTION_KEY__') { - push @xml_config_warnings, { error => 'encryption_key_missing' }; -} + # Test Zebra facets configuration + if ( !defined C4::Context->config('use_zebra_facets') ) { + push @xml_config_warnings, { error => 'use_zebra_facets_entry_missing' }; + } -# Test Zebra facets configuration -if ( !defined C4::Context->config('use_zebra_facets') ) { - push @xml_config_warnings, { error => 'use_zebra_facets_entry_missing' }; -} + unless ( Koha::I18N->_base_directory ) { + $template->param( warnI18nMissing => 1 ); + } -unless ( Koha::I18N->_base_directory ) { - $template->param( warnI18nMissing => 1 ); -} + # ILL module checks + if ( C4::Context->preference('ILLModule') ) { + my $warnILLConfiguration = 0; + my $ill_config_from_file = C4::Context->config("interlibrary_loans"); + my $ill_config = Koha::ILL::Request::Config->new; -# ILL module checks -if ( C4::Context->preference('ILLModule') ) { - my $warnILLConfiguration = 0; - my $ill_config_from_file = C4::Context->config("interlibrary_loans"); - my $ill_config = Koha::ILL::Request::Config->new; + my $available_ill_backends = + ( scalar @{ $ill_config->available_backends } > 0 ); - my $available_ill_backends = - ( scalar @{ $ill_config->available_backends } > 0 ); + # Check backends + if ( !$available_ill_backends ) { + $template->param( no_ill_backends => 1 ); + $warnILLConfiguration = 1; + } - # Check backends - if ( !$available_ill_backends ) { - $template->param( no_ill_backends => 1 ); - $warnILLConfiguration = 1; - } + # Check ILLPartnerCode sys pref + if ( !Koha::Patron::Categories->find( C4::Context->preference('ILLPartnerCode') ) ) { + $template->param( ill_partner_code_doesnt_exist => C4::Context->preference('ILLPartnerCode') ); + $warnILLConfiguration = 1; + } elsif ( !Koha::Patrons->search( { categorycode => C4::Context->preference('ILLPartnerCode') } )->count ) { + $template->param( ill_partner_code_no_patrons => C4::Context->preference('ILLPartnerCode') ); + $warnILLConfiguration = 1; + } - # Check ILLPartnerCode sys pref - if ( !Koha::Patron::Categories->find( C4::Context->preference('ILLPartnerCode') ) ) { - $template->param( ill_partner_code_doesnt_exist => C4::Context->preference('ILLPartnerCode') ); - $warnILLConfiguration = 1; - } elsif ( !Koha::Patrons->search( { categorycode => C4::Context->preference('ILLPartnerCode') } )->count ) { - $template->param( ill_partner_code_no_patrons => C4::Context->preference('ILLPartnerCode') ); - $warnILLConfiguration = 1; - } + if ( !C4::Context->preference('ILLPartnerCode') ) { + # partner code not defined + $template->param( ill_partner_code_not_defined => 1 ); + $warnILLConfiguration = 1; + } - if ( !C4::Context->preference('ILLPartnerCode') ) { - # partner code not defined - $template->param( ill_partner_code_not_defined => 1 ); - $warnILLConfiguration = 1; - } + if ( !$ill_config_from_file->{branch} ) { + # branch not defined + $template->param( ill_branch_not_defined => 1 ); + $warnILLConfiguration = 1; + } - if ( !$ill_config_from_file->{branch} ) { - # branch not defined - $template->param( ill_branch_not_defined => 1 ); - $warnILLConfiguration = 1; + $template->param( warnILLConfiguration => $warnILLConfiguration ); + } + unless ( can_run('weasyprint') ) { + $template->param( weasyprint_missing => 1 ); } - $template->param( warnILLConfiguration => $warnILLConfiguration ); -} -unless ( can_run('weasyprint') ) { - $template->param( weasyprint_missing => 1 ); -} + { + # XSLT sysprefs + my @xslt_prefs = qw( + OPACXSLTDetailsDisplay + OPACXSLTListsDisplay + OPACXSLTResultsDisplay + XSLTDetailsDisplay + XSLTListsDisplay + XSLTResultsDisplay + ); + my @warnXSLT; + for my $p ( @xslt_prefs ) { + my $xsl_filename = C4::XSLT::get_xsl_filename( $p ); + next if -e $xsl_filename; + push @warnXSLT, + { + syspref => $p, + value => C4::Context->preference("$p"), + filename => $xsl_filename + }; + } -{ - # XSLT sysprefs - my @xslt_prefs = qw( - OPACXSLTDetailsDisplay - OPACXSLTListsDisplay - OPACXSLTResultsDisplay - XSLTDetailsDisplay - XSLTListsDisplay - XSLTResultsDisplay - ); - my @warnXSLT; - for my $p ( @xslt_prefs ) { - my $xsl_filename = C4::XSLT::get_xsl_filename( $p ); - next if -e $xsl_filename; - push @warnXSLT, - { - syspref => $p, - value => C4::Context->preference("$p"), - filename => $xsl_filename - }; - } - - $template->param( warnXSLT => \@warnXSLT ) if @warnXSLT; -} + $template->param( warnXSLT => \@warnXSLT ) if @warnXSLT; + } -if ( C4::Context->preference('SearchEngine') eq 'Elasticsearch' ) { - # Check ES configuration health and runtime status + if ( C4::Context->preference('SearchEngine') eq 'Elasticsearch' ) { + # Check ES configuration health and runtime status - my $es_status; - my $es_config_error; - my $es_running = 1; - my $es_has_missing = 0; + my $es_status; + my $es_config_error; + my $es_running = 1; + my $es_has_missing = 0; - my $es_conf; - try { - $es_conf = Koha::SearchEngine::Elasticsearch::_read_configuration(); - } - catch { - if ( ref($_) eq 'Koha::Exceptions::Config::MissingEntry' ) { - $template->param( elasticsearch_fatal_config_error => $_->message ); - $es_config_error = 1; + my $es_conf; + try { + $es_conf = Koha::SearchEngine::Elasticsearch::_read_configuration(); } - }; - if ( !$es_config_error ) { - - my $biblios_index_name = $es_conf->{index_name} . "_" . $Koha::SearchEngine::BIBLIOS_INDEX; - my $authorities_index_name = $es_conf->{index_name} . "_" . $Koha::SearchEngine::AUTHORITIES_INDEX; - - my @indexes = ($biblios_index_name, $authorities_index_name); - # TODO: When new indexes get added, we could have other ways to - # fetch the list of available indexes (e.g. plugins, etc) - $es_status->{nodes} = $es_conf->{nodes}; - my $es = Search::Elasticsearch->new( $es_conf ); - my $es_status->{version} = $es->info->{version}->{number}; - - foreach my $index ( @indexes ) { - my $index_count; - try { - $index_count = $es->indices->stats( index => $index ) - ->{_all}{primaries}{docs}{count}; + catch { + if ( ref($_) eq 'Koha::Exceptions::Config::MissingEntry' ) { + $template->param( elasticsearch_fatal_config_error => $_->message ); + $es_config_error = 1; } - catch { - if ( ref($_) eq 'Search::Elasticsearch::Error::Missing' ) { - push @{ $es_status->{errors} }, "Index not found ($index)"; - $index_count = -1; + }; + if ( !$es_config_error ) { + + my $biblios_index_name = $es_conf->{index_name} . "_" . $Koha::SearchEngine::BIBLIOS_INDEX; + my $authorities_index_name = $es_conf->{index_name} . "_" . $Koha::SearchEngine::AUTHORITIES_INDEX; + + my @indexes = ($biblios_index_name, $authorities_index_name); + # TODO: When new indexes get added, we could have other ways to + # fetch the list of available indexes (e.g. plugins, etc) + $es_status->{nodes} = $es_conf->{nodes}; + my $es = Search::Elasticsearch->new( $es_conf ); + my $es_status->{version} = $es->info->{version}->{number}; + + foreach my $index ( @indexes ) { + my $index_count; + try { + $index_count = $es->indices->stats( index => $index ) + ->{_all}{primaries}{docs}{count}; } - elsif ( ref($_) eq 'Search::Elasticsearch::Error::NoNodes' ) { - $es_running = 0; + catch { + if ( ref($_) eq 'Search::Elasticsearch::Error::Missing' ) { + push @{ $es_status->{errors} }, "Index not found ($index)"; + $index_count = -1; + } + elsif ( ref($_) eq 'Search::Elasticsearch::Error::NoNodes' ) { + $es_running = 0; + } + else { + # TODO: when time comes, we will cover more use cases + die $_; + } + }; + + my $db_count = -1; + my $missing_count = 0; + if ( $index eq $biblios_index_name ) { + $db_count = Koha::Biblios->search->count; + } elsif ( $index eq $authorities_index_name ) { + $db_count = Koha::Authorities->search->count; } - else { - # TODO: when time comes, we will cover more use cases - die $_; + if ( $db_count != -1 && $index_count != -1 ) { + $missing_count = $db_count - $index_count; + $es_has_missing = 1 if $missing_count > 0; } - }; - - my $db_count = -1; - my $missing_count = 0; - if ( $index eq $biblios_index_name ) { - $db_count = Koha::Biblios->search->count; - } elsif ( $index eq $authorities_index_name ) { - $db_count = Koha::Authorities->search->count; - } - if ( $db_count != -1 && $index_count != -1 ) { - $missing_count = $db_count - $index_count; - $es_has_missing = 1 if $missing_count > 0; + push @{ $es_status->{indexes} }, + { + index_name => $index, + index_count => $index_count, + db_count => $db_count, + missing_count => $missing_count, + }; } - push @{ $es_status->{indexes} }, - { - index_name => $index, - index_count => $index_count, - db_count => $db_count, - missing_count => $missing_count, - }; - } - $es_status->{running} = $es_running; + $es_status->{running} = $es_running; - $template->param( - elasticsearch_status => $es_status, - elasticsearch_has_missing => $es_has_missing, - ); + $template->param( + elasticsearch_status => $es_status, + elasticsearch_has_missing => $es_has_missing, + ); + } } -} -if ( C4::Context->preference('RESTOAuth2ClientCredentials') ) { - # Do we have the required deps? - unless ( can_load( modules => { 'Net::OAuth2::AuthorizationServer' => undef }) ) { - $template->param( oauth2_missing_deps => 1 ); + if ( C4::Context->preference('RESTOAuth2ClientCredentials') ) { + # Do we have the required deps? + unless ( can_load( modules => { 'Net::OAuth2::AuthorizationServer' => undef }) ) { + $template->param( oauth2_missing_deps => 1 ); + } } -} -# Sco Patron should not contain any other perms than circulate => self_checkout -if ( C4::Context->preference('WebBasedSelfCheck') - and C4::Context->preference('AutoSelfCheckAllowed') -) { - my $userid = C4::Context->preference('AutoSelfCheckID'); - my $all_permissions = C4::Auth::get_user_subpermissions( $userid ); - my ( $has_self_checkout_perm, $has_other_permissions ); - while ( my ( $module, $permissions ) = each %$all_permissions ) { - if ( $module eq 'self_check' ) { - while ( my ( $permission, $flag ) = each %$permissions ) { - if ( $permission eq 'self_checkout_module' ) { - $has_self_checkout_perm = 1; - } else { - $has_other_permissions = 1; + # Sco Patron should not contain any other perms than circulate => self_checkout + if ( C4::Context->preference('WebBasedSelfCheck') + and C4::Context->preference('AutoSelfCheckAllowed') + ) { + my $userid = C4::Context->preference('AutoSelfCheckID'); + my $all_permissions = C4::Auth::get_user_subpermissions( $userid ); + my ( $has_self_checkout_perm, $has_other_permissions ); + while ( my ( $module, $permissions ) = each %$all_permissions ) { + if ( $module eq 'self_check' ) { + while ( my ( $permission, $flag ) = each %$permissions ) { + if ( $permission eq 'self_checkout_module' ) { + $has_self_checkout_perm = 1; + } else { + $has_other_permissions = 1; + } } + } else { + $has_other_permissions = 1; } - } else { - $has_other_permissions = 1; } + $template->param( + AutoSelfCheckPatronDoesNotHaveSelfCheckPerm => not ( $has_self_checkout_perm ), + AutoSelfCheckPatronHasTooManyPerm => $has_other_permissions, + ); } - $template->param( - AutoSelfCheckPatronDoesNotHaveSelfCheckPerm => not ( $has_self_checkout_perm ), - AutoSelfCheckPatronHasTooManyPerm => $has_other_permissions, - ); -} - -if ( C4::Context->preference('PatronSelfRegistration') ) { - $template->param( warnPrefPatronSelfRegistrationDefaultCategory => 1 ) - unless Koha::Patron::Categories->find(C4::Context->preference('PatronSelfRegistrationDefaultCategory')); -} -# Test YAML system preferences -# FIXME: This is list of current YAML formatted prefs, should by type of preference -my @yaml_prefs = ( - "BibtexExportAdditionalFields", - "ItemsDeniedRenewal", - "MarcFieldsToOrder", - "MarcItemFieldsToOrder", - "OpacHiddenItems", - "RisExportAdditionalFields", - "UpdateitemLocationOnCheckin", - "UpdateItemWhenLostFromHoldList", - "UpdateNotForLoanStatusOnCheckin", - "UpdateNotForLoanStatusOnCheckout", -); -my @bad_yaml_prefs; -foreach my $syspref (@yaml_prefs) { - my $yaml = C4::Context->preference( $syspref ); - if ( $yaml ) { - eval { YAML::XS::Load( Encode::encode_utf8("$yaml\n\n") ); }; - if ($@) { - push @bad_yaml_prefs, $syspref; - } + if ( C4::Context->preference('PatronSelfRegistration') ) { + $template->param( warnPrefPatronSelfRegistrationDefaultCategory => 1 ) + unless Koha::Patron::Categories->find(C4::Context->preference('PatronSelfRegistrationDefaultCategory')); } -} -$template->param( 'bad_yaml_prefs' => \@bad_yaml_prefs ) if @bad_yaml_prefs; -{ - my $dbh = C4::Context->dbh; - my $patrons = $dbh->selectall_arrayref( - q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|, - { Slice => {} } - ); - my $biblios = $dbh->selectall_arrayref( - q|select b.biblionumber from biblio b join deletedbiblio db on b.biblionumber=db.biblionumber|, - { Slice => {} } - ); - my $biblioitems = $dbh->selectall_arrayref( - q|select bi.biblioitemnumber from biblioitems bi join deletedbiblioitems dbi on bi.biblionumber=dbi.biblionumber|, - { Slice => {} } - ); - my $items = $dbh->selectall_arrayref( - q|select i.itemnumber from items i join deleteditems di on i.itemnumber=di.itemnumber|, - { Slice => {} } - ); - my $checkouts = $dbh->selectall_arrayref( - q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|, - { Slice => {} } + # Test YAML system preferences + # FIXME: This is list of current YAML formatted prefs, should by type of preference + my @yaml_prefs = ( + "BibtexExportAdditionalFields", + "ItemsDeniedRenewal", + "MarcFieldsToOrder", + "MarcItemFieldsToOrder", + "OpacHiddenItems", + "RisExportAdditionalFields", + "UpdateitemLocationOnCheckin", + "UpdateItemWhenLostFromHoldList", + "UpdateNotForLoanStatusOnCheckin", + "UpdateNotForLoanStatusOnCheckout", ); - my $holds = $dbh->selectall_arrayref( - q|select r.reserve_id from reserves r join old_reserves o on r.reserve_id=o.reserve_id|, - { Slice => {} } - ); - if ( @$patrons or @$biblios or @$biblioitems or @$items or @$checkouts or @$holds ) { - $template->param( - has_ai_issues => 1, - ai_patrons => $patrons, - ai_biblios => $biblios, - ai_biblioitems => $biblioitems, - ai_items => $items, - ai_checkouts => $checkouts, - ai_holds => $holds, - ); + my @bad_yaml_prefs; + foreach my $syspref (@yaml_prefs) { + my $yaml = C4::Context->preference( $syspref ); + if ( $yaml ) { + eval { YAML::XS::Load( Encode::encode_utf8("$yaml\n\n") ); }; + if ($@) { + push @bad_yaml_prefs, $syspref; + } + } } -} - -# Circ rule warnings -{ - my $dbh = C4::Context->dbh; - my $units = Koha::CirculationRules->search({ rule_name => 'lengthunit', rule_value => { -not_in => ['days', 'hours'] } }); + $template->param( 'bad_yaml_prefs' => \@bad_yaml_prefs ) if @bad_yaml_prefs; - if ( $units->count ) { - $template->param( - warnIssuingRules => 1, - ir_units => $units, + { + my $dbh = C4::Context->dbh; + my $patrons = $dbh->selectall_arrayref( + q|select b.borrowernumber from borrowers b join deletedborrowers db on b.borrowernumber=db.borrowernumber|, + { Slice => {} } + ); + my $biblios = $dbh->selectall_arrayref( + q|select b.biblionumber from biblio b join deletedbiblio db on b.biblionumber=db.biblionumber|, + { Slice => {} } + ); + my $biblioitems = $dbh->selectall_arrayref( + q|select bi.biblioitemnumber from biblioitems bi join deletedbiblioitems dbi on bi.biblionumber=dbi.biblionumber|, + { Slice => {} } + ); + my $items = $dbh->selectall_arrayref( + q|select i.itemnumber from items i join deleteditems di on i.itemnumber=di.itemnumber|, + { Slice => {} } + ); + my $checkouts = $dbh->selectall_arrayref( + q|select i.issue_id from issues i join old_issues oi on i.issue_id=oi.issue_id|, + { Slice => {} } + ); + my $holds = $dbh->selectall_arrayref( + q|select r.reserve_id from reserves r join old_reserves o on r.reserve_id=o.reserve_id|, + { Slice => {} } ); + if ( @$patrons or @$biblios or @$biblioitems or @$items or @$checkouts or @$holds ) { + $template->param( + has_ai_issues => 1, + ai_patrons => $patrons, + ai_biblios => $biblios, + ai_biblioitems => $biblioitems, + ai_items => $items, + ai_checkouts => $checkouts, + ai_holds => $holds, + ); + } } -} -# Guarantor relationships warnings -{ - my $dbh = C4::Context->dbh; - my ($bad_relationships_count) = $dbh->selectall_arrayref(q{ - SELECT COUNT(*) - FROM ( - SELECT relationship FROM borrower_relationships WHERE relationship='_bad_data' - UNION ALL - SELECT relationship FROM borrowers WHERE relationship='_bad_data') a - }); - - $bad_relationships_count = $bad_relationships_count->[0]->[0]; - - my $existing_relationships = $dbh->selectall_arrayref(q{ - SELECT DISTINCT(relationship) - FROM ( - SELECT relationship FROM borrower_relationships WHERE relationship IS NOT NULL - UNION ALL - SELECT relationship FROM borrowers WHERE relationship IS NOT NULL) a - }); - - my %valid_relationships = map { $_ => 1 } split( /,|\|/, C4::Context->preference('borrowerRelationship') ); - $valid_relationships{ _bad_data } = 1; # we handle this case in another way - - my $wrong_relationships = [ grep { !$valid_relationships{ $_->[0] } } @{$existing_relationships} ]; - if ( @$wrong_relationships or $bad_relationships_count ) { - - $template->param( - warnRelationships => 1, - ); + # Circ rule warnings + { + my $dbh = C4::Context->dbh; + my $units = Koha::CirculationRules->search({ rule_name => 'lengthunit', rule_value => { -not_in => ['days', 'hours'] } }); - if ( $wrong_relationships ) { + if ( $units->count ) { $template->param( - wrong_relationships => $wrong_relationships + warnIssuingRules => 1, + ir_units => $units, ); } - if ($bad_relationships_count) { + } + + # Guarantor relationships warnings + { + my $dbh = C4::Context->dbh; + my ($bad_relationships_count) = $dbh->selectall_arrayref(q{ + SELECT COUNT(*) + FROM ( + SELECT relationship FROM borrower_relationships WHERE relationship='_bad_data' + UNION ALL + SELECT relationship FROM borrowers WHERE relationship='_bad_data') a + }); + + $bad_relationships_count = $bad_relationships_count->[0]->[0]; + + my $existing_relationships = $dbh->selectall_arrayref(q{ + SELECT DISTINCT(relationship) + FROM ( + SELECT relationship FROM borrower_relationships WHERE relationship IS NOT NULL + UNION ALL + SELECT relationship FROM borrowers WHERE relationship IS NOT NULL) a + }); + + my %valid_relationships = map { $_ => 1 } split( /,|\|/, C4::Context->preference('borrowerRelationship') ); + $valid_relationships{ _bad_data } = 1; # we handle this case in another way + + my $wrong_relationships = [ grep { !$valid_relationships{ $_->[0] } } @{$existing_relationships} ]; + if ( @$wrong_relationships or $bad_relationships_count ) { + $template->param( - bad_relationships_count => $bad_relationships_count, + warnRelationships => 1, ); + + if ( $wrong_relationships ) { + $template->param( + wrong_relationships => $wrong_relationships + ); + } + if ($bad_relationships_count) { + $template->param( + bad_relationships_count => $bad_relationships_count, + ); + } } } -} -{ - # Test 'bcrypt_settings' config for Pseudonymization - $template->param( config_bcrypt_settings_no_set => 1 ) - if C4::Context->preference('Pseudonymization') - and not C4::Context->config('bcrypt_settings'); -} + { + # Test 'bcrypt_settings' config for Pseudonymization + $template->param( config_bcrypt_settings_no_set => 1 ) + if C4::Context->preference('Pseudonymization') + and not C4::Context->config('bcrypt_settings'); + } -{ - my @frameworkcodes = Koha::BiblioFrameworks->search->get_column('frameworkcode'); - my @hidden_biblionumbers; - push @frameworkcodes, ""; # it's not in the biblio_frameworks table! - my $no_FA_framework = 1; - for my $frameworkcode ( @frameworkcodes ) { - $no_FA_framework = 0 if $frameworkcode eq 'FA'; - my $shouldhidemarc_opac = Koha::Filter::MARC::ViewPolicy->should_hide_marc( - { - frameworkcode => $frameworkcode, - interface => "opac" - } - ); - push @hidden_biblionumbers, { frameworkcode => $frameworkcode, interface => 'opac' } - if $shouldhidemarc_opac->{biblionumber}; + { + my @frameworkcodes = Koha::BiblioFrameworks->search->get_column('frameworkcode'); + my @hidden_biblionumbers; + push @frameworkcodes, ""; # it's not in the biblio_frameworks table! + my $no_FA_framework = 1; + for my $frameworkcode ( @frameworkcodes ) { + $no_FA_framework = 0 if $frameworkcode eq 'FA'; + my $shouldhidemarc_opac = Koha::Filter::MARC::ViewPolicy->should_hide_marc( + { + frameworkcode => $frameworkcode, + interface => "opac" + } + ); + push @hidden_biblionumbers, { frameworkcode => $frameworkcode, interface => 'opac' } + if $shouldhidemarc_opac->{biblionumber}; - my $shouldhidemarc_intranet = Koha::Filter::MARC::ViewPolicy->should_hide_marc( - { - frameworkcode => $frameworkcode, - interface => "intranet" - } - ); - push @hidden_biblionumbers, { frameworkcode => $frameworkcode, interface => 'intranet' } - if $shouldhidemarc_intranet->{biblionumber}; + my $shouldhidemarc_intranet = Koha::Filter::MARC::ViewPolicy->should_hide_marc( + { + frameworkcode => $frameworkcode, + interface => "intranet" + } + ); + push @hidden_biblionumbers, { frameworkcode => $frameworkcode, interface => 'intranet' } + if $shouldhidemarc_intranet->{biblionumber}; + } + $template->param( warnHiddenBiblionumbers => \@hidden_biblionumbers ); + $template->param( warnFastCataloging => $no_FA_framework ); } - $template->param( warnHiddenBiblionumbers => \@hidden_biblionumbers ); - $template->param( warnFastCataloging => $no_FA_framework ); -} -{ - # BackgroundJob - test connection to message broker - eval { - Koha::BackgroundJob->connect; - }; - if ( $@ ) { - warn $@; - $template->param( warnConnectBroker => $@ ); + { + # BackgroundJob - test connection to message broker + eval { + Koha::BackgroundJob->connect; + }; + if ( $@ ) { + warn $@; + $template->param( warnConnectBroker => $@ ); + } + } + + #BZ 28267: Warn administrators if there are database rows with a format other than 'DYNAMIC' + { + $template->param( warnDbRowFormat => C4::Installer->has_non_dynamic_row_format ); } -} -#BZ 28267: Warn administrators if there are database rows with a format other than 'DYNAMIC' -{ - $template->param( warnDbRowFormat => C4::Installer->has_non_dynamic_row_format ); + $template->param( + prefRequireChoosingExistingAuthority => $prefRequireChoosingExistingAuthority, + prefAutoCreateAuthorities => $prefAutoCreateAuthorities, + warnPrefRequireChoosingExistingAuthority => $warnPrefRequireChoosingExistingAuthority, + warnPrefEasyAnalyticalRecords => $warnPrefEasyAnalyticalRecords, + warnPrefAnonymousPatronOPACPrivacy => $warnPrefAnonymousPatronOPACPrivacy, + warnPrefAnonymousPatronAnonSuggestions => $warnPrefAnonymousPatronAnonSuggestions, + warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist => $warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist, + warnPrefAnonymousPatronAnonSuggestions_PatronDoesNotExist => $warnPrefAnonymousPatronAnonSuggestions_PatronDoesNotExist, + warnPrefKohaAdminEmailAddress => $warnPrefKohaAdminEmailAddress, + warnPrefOpacHiddenItems => $warnPrefOpacHiddenItems, + errZebraConnection => $errZebraConnection, + warnIsRootUser => $warnIsRootUser, + warnNoActiveCurrency => $warnNoActiveCurrency, + warnNoTemplateCaching => ( C4::Context->config('template_cache_dir') ? 0 : 1 ), + xml_config_warnings => \@xml_config_warnings, + warnStatisticsFieldsError => $warnStatisticsFieldsError, + ); } -$template->param( - prefRequireChoosingExistingAuthority => $prefRequireChoosingExistingAuthority, - prefAutoCreateAuthorities => $prefAutoCreateAuthorities, - warnPrefRequireChoosingExistingAuthority => $warnPrefRequireChoosingExistingAuthority, - warnPrefEasyAnalyticalRecords => $warnPrefEasyAnalyticalRecords, - warnPrefAnonymousPatronOPACPrivacy => $warnPrefAnonymousPatronOPACPrivacy, - warnPrefAnonymousPatronAnonSuggestions => $warnPrefAnonymousPatronAnonSuggestions, - warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist => $warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist, - warnPrefAnonymousPatronAnonSuggestions_PatronDoesNotExist => $warnPrefAnonymousPatronAnonSuggestions_PatronDoesNotExist, - warnPrefKohaAdminEmailAddress => $warnPrefKohaAdminEmailAddress, - warnPrefOpacHiddenItems => $warnPrefOpacHiddenItems, - errZebraConnection => $errZebraConnection, - warnIsRootUser => $warnIsRootUser, - warnNoActiveCurrency => $warnNoActiveCurrency, - warnNoTemplateCaching => ( C4::Context->config('template_cache_dir') ? 0 : 1 ), - xml_config_warnings => \@xml_config_warnings, - warnStatisticsFieldsError => $warnStatisticsFieldsError, -); +if ( $tab eq 'perl' ) { -my @components = (); + my @components = (); -my $perl_modules = C4::Installer::PerlModules->new; -$perl_modules->versions_info; + my $perl_modules = C4::Installer::PerlModules->new; + $perl_modules->versions_info; -my @pm_types = qw(missing_pm upgrade_pm current_pm); + my @pm_types = qw(missing_pm upgrade_pm current_pm); -foreach my $pm_type(@pm_types) { - my $modules = $perl_modules->get_attr($pm_type); - foreach (@$modules) { - my ($module, $stats) = each %$_; - push( - @components, - { - name => $module, - version => $stats->{'cur_ver'}, - missing => ($pm_type eq 'missing_pm' ? 1 : 0), - upgrade => ($pm_type eq 'upgrade_pm' ? 1 : 0), - current => ($pm_type eq 'current_pm' ? 1 : 0), - require => $stats->{'required'}, - reqversion => $stats->{'min_ver'}, - maxversion => $stats->{'max_ver'}, - excversion => $stats->{'exc_ver'} - } - ); + foreach my $pm_type(@pm_types) { + my $modules = $perl_modules->get_attr($pm_type); + foreach (@$modules) { + my ($module, $stats) = each %$_; + push( + @components, + { + name => $module, + version => $stats->{'cur_ver'}, + missing => ($pm_type eq 'missing_pm' ? 1 : 0), + upgrade => ($pm_type eq 'upgrade_pm' ? 1 : 0), + current => ($pm_type eq 'current_pm' ? 1 : 0), + require => $stats->{'required'}, + reqversion => $stats->{'min_ver'}, + maxversion => $stats->{'max_ver'}, + excversion => $stats->{'exc_ver'} + } + ); + } } -} -@components = sort {$a->{'name'} cmp $b->{'name'}} @components; + @components = sort {$a->{'name'} cmp $b->{'name'}} @components; -my $counter=0; -my $row = []; -my $table = []; -foreach (@components) { - push (@$row, $_); - unless (++$counter % 4) { + my $counter=0; + my $row = []; + my $table = []; + foreach (@components) { + push (@$row, $_); + unless (++$counter % 4) { + push (@$table, {row => $row}); + $row = []; + } + } + # Processing the last line (if there are any modules left) + if (scalar(@$row) > 0) { + # Extending $row to the table size + $$row[3] = ''; + # Pushing the last line push (@$table, {row => $row}); - $row = []; } -} -# Processing the last line (if there are any modules left) -if (scalar(@$row) > 0) { - # Extending $row to the table size - $$row[3] = ''; - # Pushing the last line - push (@$table, {row => $row}); -} -## ## $table - -$template->param( table => $table ); - - -## ------------------------------------------ -## Koha contributions - -## Release teams -my $teams = - -e "$docdir" . "/teams.yaml" - ? YAML::XS::LoadFile( "$docdir" . "/teams.yaml" ) - : {}; -my $dev_team = (sort {$b <=> $a} (keys %{$teams->{team}}))[0]; -my $short_version = substr($versions{'kohaVersion'},0,5); -my $minor = substr($versions{'kohaVersion'},3,2); -my $development_version = ( $minor eq '05' || $minor eq '11' ) ? 0 : 1; -my $codename; -$template->param( short_version => $short_version ); -$template->param( development_version => $development_version ); - -## Contributors -my $contributors = - -e "$docdir" . "/contributors.yaml" - ? YAML::XS::LoadFile( "$docdir" . "/contributors.yaml" ) - : {}; -delete $contributors->{_others_}; -for my $version ( sort { $a <=> $b } keys %{$teams->{team}} ) { - for my $role ( keys %{ $teams->{team}->{$version} } ) { - my $detail = $teams->{team}->{$version}->{$role}; - my $normalized_role = "$role"; - $normalized_role =~ s/s$//; - if ( ref( $detail ) eq 'ARRAY' ) { - for my $contributor ( @{ $detail } ) { - - my $localized_role = $normalized_role; - if ( my $subversion = $contributor->{version} ) { - $localized_role .= ':' . $subversion; + ## ## $table + + $template->param( table => $table ); + +} + +if ( $tab eq 'team' ) { + + ## ------------------------------------------ + ## Koha contributions + + ## Release teams + my $teams = + -e "$docdir" . "/teams.yaml" + ? YAML::XS::LoadFile( "$docdir" . "/teams.yaml" ) + : {}; + my $dev_team = (sort {$b <=> $a} (keys %{$teams->{team}}))[0]; + my $short_version = substr($versions{'kohaVersion'},0,5); + my $minor = substr($versions{'kohaVersion'},3,2); + my $development_version = ( $minor eq '05' || $minor eq '11' ) ? 0 : 1; + my $codename; + $template->param( short_version => $short_version ); + $template->param( development_version => $development_version ); + + ## Contributors + my $contributors = + -e "$docdir" . "/contributors.yaml" + ? YAML::XS::LoadFile( "$docdir" . "/contributors.yaml" ) + : {}; + delete $contributors->{_others_}; + for my $version ( sort { $a <=> $b } keys %{$teams->{team}} ) { + for my $role ( keys %{ $teams->{team}->{$version} } ) { + my $detail = $teams->{team}->{$version}->{$role}; + my $normalized_role = "$role"; + $normalized_role =~ s/s$//; + if ( ref( $detail ) eq 'ARRAY' ) { + for my $contributor ( @{ $detail } ) { + + my $localized_role = $normalized_role; + if ( my $subversion = $contributor->{version} ) { + $localized_role .= ':' . $subversion; + } + if ( my $area = $contributor->{area} ) { + $localized_role .= ':' . $area; + } + + my $name = $contributor->{name}; + # Add role to contributors + push @{ $contributors->{$name}->{roles}->{$localized_role} }, + $version; + # Add openhub to teams + if ( exists( $contributors->{$name}->{openhub} ) ) { + $contributor->{openhub} = $contributors->{$name}->{openhub}; + } } - if ( my $area = $contributor->{area} ) { - $localized_role .= ':' . $area; + } + elsif ( $role eq 'release_date' ) { + $teams->{team}->{$version}->{$role} = DateTime->from_epoch( epoch => $teams->{team}->{$version}->{$role} ); + } + elsif ( $role eq 'codename' ) { + if ( $version == $short_version ) { + $codename = $detail; + } + next; + } + else { + if ( my $subversion = $detail->{version} ) { + $normalized_role .= ':' . $subversion; + } + if ( my $area = $detail->{area} ) { + $normalized_role .= ':' . $area; } - my $name = $contributor->{name}; + my $name = $detail->{name}; # Add role to contributors - push @{ $contributors->{$name}->{roles}->{$localized_role} }, - $version; + push @{ $contributors->{$name}->{roles}->{$normalized_role} }, + $version; # Add openhub to teams if ( exists( $contributors->{$name}->{openhub} ) ) { - $contributor->{openhub} = $contributors->{$name}->{openhub}; + $detail->{openhub} = + $contributors->{$name}->{openhub}; } } } - elsif ( $role eq 'release_date' ) { - $teams->{team}->{$version}->{$role} = DateTime->from_epoch( epoch => $teams->{team}->{$version}->{$role} ); - } - elsif ( $role eq 'codename' ) { - if ( $version == $short_version ) { - $codename = $detail; - } - next; - } - else { - if ( my $subversion = $detail->{version} ) { - $normalized_role .= ':' . $subversion; - } - if ( my $area = $detail->{area} ) { - $normalized_role .= ':' . $area; - } - - my $name = $detail->{name}; - # Add role to contributors - push @{ $contributors->{$name}->{roles}->{$normalized_role} }, - $version; - # Add openhub to teams - if ( exists( $contributors->{$name}->{openhub} ) ) { - $detail->{openhub} = - $contributors->{$name}->{openhub}; - } - } } -} -## Create last name ordered array of people from contributors -my @people = map { - { name => $_, ( $contributors->{$_} ? %{ $contributors->{$_} } : () ) } -} sort { - my ($alast) = $a =~ /(\S+)$/; - my ($blast) = $b =~ /(\S+)$/; - my $cmp = lc($alast||"") cmp lc($blast||""); - return $cmp if $cmp; + ## Create last name ordered array of people from contributors + my @people = map { + { name => $_, ( $contributors->{$_} ? %{ $contributors->{$_} } : () ) } + } sort { + my ($alast) = $a =~ /(\S+)$/; + my ($blast) = $b =~ /(\S+)$/; + my $cmp = lc($alast||"") cmp lc($blast||""); + return $cmp if $cmp; - my ($a2last) = $a =~ /(\S+)\s\S+$/; - my ($b2last) = $b =~ /(\S+)\s\S+$/; - lc($a2last||"") cmp lc($b2last||""); -} keys %$contributors; + my ($a2last) = $a =~ /(\S+)\s\S+$/; + my ($b2last) = $b =~ /(\S+)\s\S+$/; + lc($a2last||"") cmp lc($b2last||""); + } keys %$contributors; -$template->param( kohaCodename => $codename); -$template->param( contributors => \@people ); -$template->param( maintenance_team => $teams->{team}->{$dev_team} ); -$template->param( release_team => $teams->{team}->{$short_version} ); + $template->param( kohaCodename => $codename); + $template->param( contributors => \@people ); + $template->param( maintenance_team => $teams->{team}->{$dev_team} ); + $template->param( release_team => $teams->{team}->{$short_version} ); -## Timeline -if ( open( my $file, "<:encoding(UTF-8)", "$docdir" . "/history.txt" ) ) { +} +if ( $tab eq 'history' ) { - my $i = 0; + ## Timeline + if ( open( my $file, "<:encoding(UTF-8)", "$docdir" . "/history.txt" ) ) { - my @rows2 = (); - my $row2 = []; + my $i = 0; - my @lines = <$file>; - close($file); + my @rows2 = (); + my $row2 = []; - shift @lines; #remove header row + my @lines = <$file>; + close($file); - foreach (@lines) { - my ( $epoch, $date, $desc, $tag ) = split(/\t/); - if(!$desc && $date=~ /(?<=\d{4})\s+/) { - ($date, $desc)= ($`, $'); - } - push( - @rows2, - { - date => $date, - desc => $desc, + shift @lines; #remove header row + + foreach (@lines) { + my ( $epoch, $date, $desc, $tag ) = split(/\t/); + if(!$desc && $date=~ /(?<=\d{4})\s+/) { + ($date, $desc)= ($`, $'); } - ); - } + push( + @rows2, + { + date => $date, + desc => $desc, + } + ); + } - my $table2 = []; - #foreach my $row2 (@rows2) { - foreach (@rows2) { - push (@$row2, $_); - push( @$table2, { row2 => $row2 } ); - $row2 = []; - } + my $table2 = []; + #foreach my $row2 (@rows2) { + foreach (@rows2) { + push (@$row2, $_); + push( @$table2, { row2 => $row2 } ); + $row2 = []; + } - $template->param( table2 => $table2 ); -} else { - $template->param( timeline_read_error => 1 ); + $template->param( table2 => $table2 ); + } else { + $template->param( timeline_read_error => 1 ); + } } output_html_with_http_headers $query, $cookie, $template->output; -- 2.39.5