use CGI qw ( -utf8 );
use DateTime::TimeZone;
-use File::Spec;
-use File::Slurp;
-use List::MoreUtils qw/ any /;
-use LWP::Simple;
-use Module::Load::Conditional qw(can_load);
-use XML::Simple;
-use Config;
+use File::Slurp qw( read_file );
+use IPC::Cmd qw(can_run);
+use List::MoreUtils qw( any );
+use Module::Load::Conditional qw( can_load );
+use Config qw( %Config );
use Search::Elasticsearch;
-use Try::Tiny;
-use YAML qw/LoadFile/;
+use Try::Tiny qw( catch try );
+use YAML::XS;
+use Encode;
-use C4::Output;
-use C4::Auth;
+use C4::Output qw( output_html_with_http_headers );
+use C4::Auth qw( get_template_and_user get_user_subpermissions );
use C4::Context;
use C4::Installer::PerlModules;
use Koha;
-use Koha::DateUtils qw(dt_from_string output_pref);
+use Koha::DateUtils qw( dt_from_string output_pref );
use Koha::Acquisition::Currencies;
+use Koha::Authorities;
+use Koha::BackgroundJob;
use Koha::BiblioFrameworks;
+use Koha::Biblios;
+use Koha::Email;
use Koha::Patron::Categories;
use Koha::Patrons;
use Koha::Caches;
use C4::Members::Statistics;
-
-#use Smart::Comments '####';
-
-my $query = new CGI;
+my $query = CGI->new;
my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
{
template_name => "about.tt",
query => $query,
type => "intranet",
flagsrequired => { catalogue => 1 },
- debug => 1,
}
);
my $zebraVersion = `zebraidx -V`;
# Check running PSGI env
-if ( any { /(^psgi\.|^plack\.)/i } keys %ENV ) {
+if ( C4::Context->psgi_env ) {
$template->param(
is_psgi => 1,
psgi_server => ($ENV{ PLACK_ENV }) ? "Plack ($ENV{PLACK_ENV})" :
}
my $prefAutoCreateAuthorities = C4::Context->preference('AutoCreateAuthorities');
-my $prefBiblioAddsAuthorities = C4::Context->preference('BiblioAddsAuthorities');
-my $warnPrefBiblioAddsAuthorities = ( $prefAutoCreateAuthorities && ( !$prefBiblioAddsAuthorities) );
+my $prefRequireChoosingExistingAuthority = C4::Context->preference('RequireChoosingExistingAuthority');
+my $warnPrefRequireChoosingExistingAuthority = ( !$prefAutoCreateAuthorities && ( !$prefRequireChoosingExistingAuthority) );
my $prefEasyAnalyticalRecords = C4::Context->preference('EasyAnalyticalRecords');
my $prefUseControlNumber = C4::Context->preference('UseControlNumber');
my $warnPrefAnonymousPatronOPACPrivacy_PatronDoesNotExist = ( not $anonymous_patron and Koha::Patrons->search({ privacy => 2 })->count );
+my $warnPrefKohaAdminEmailAddress = !Koha::Email->is_valid(C4::Context->preference('KohaAdminEmailAddress'));
+
+my $c = Koha::Items->filter_by_visible_in_opac->count;
+my @warnings = C4::Context->dbh->selectrow_array('SHOW WARNINGS');
+my $warnPrefOpacHiddenItems = $warnings[2];
+
+my $invalid_yesno = Koha::Config::SysPrefs->search(
+ {
+ type => 'YesNo',
+ value => { -or => { 'is' => undef, -not_in => [ "1", "0" ] } }
+ }
+);
+$template->param( invalid_yesno => $invalid_yesno );
+
my $errZebraConnection = C4::Context->Zconn("biblioserver",0)->errcode();
my $warnIsRootUser = (! $loggedinuser);
my @xml_config_warnings;
-my $context = new C4::Context;
-
if ( C4::Context->config('zebra_bib_index_mode')
and C4::Context->config('zebra_bib_index_mode') eq 'grs1' )
{
push @xml_config_warnings, { error => 'zebra_auth_index_mode_is_grs1' };
}
+my $authorityserver = C4::Context->zebraconfig('authorityserver');
if( ( C4::Context->config('zebra_auth_index_mode')
and C4::Context->config('zebra_auth_index_mode') eq 'dom' )
- && ( $context->{'server'}->{'authorityserver'}->{'config'} !~ /zebra-authorities-dom.cfg/ ) )
+ && ( $authorityserver->{config} !~ /zebra-authorities-dom.cfg/ ) )
{
push @xml_config_warnings, {
error => 'zebra_auth_index_mode_mismatch_warn'
}
}
+if( ! C4::Context->config('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' };
$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
+ };
+ }
+
+ $template->param( warnXSLT => \@warnXSLT ) if @warnXSLT;
+}
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_conf;
try {
# fetch the list of available indexes (e.g. plugins, etc)
$es_status->{nodes} = $es_conf->{nodes};
my $es = Search::Elasticsearch->new({ nodes => $es_conf->{nodes} });
+ my $es_status->{version} = $es->info->{version}->{number};
foreach my $index ( @indexes ) {
- my $count;
+ my $index_count;
try {
- $count = $es->indices->stats( index => $index )
+ $index_count = $es->indices->stats( index => $index )
->{_all}{primaries}{docs}{count};
}
catch {
if ( ref($_) eq 'Search::Elasticsearch::Error::Missing' ) {
push @{ $es_status->{errors} }, "Index not found ($index)";
- $count = -1;
+ $index_count = -1;
}
elsif ( ref($_) eq 'Search::Elasticsearch::Error::NoNodes' ) {
$es_running = 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,
- count => $count
+ index_name => $index,
+ index_count => $index_count,
+ db_count => $db_count,
+ missing_count => $missing_count,
};
}
$es_status->{running} = $es_running;
- $template->param( elasticsearch_status => $es_status );
+ $template->param(
+ elasticsearch_status => $es_status,
+ elasticsearch_has_missing => $es_has_missing,
+ );
}
}
foreach my $syspref (@yaml_prefs) {
my $yaml = C4::Context->preference( $syspref );
if ( $yaml ) {
- eval { YAML::Load( "$yaml\n\n" ); };
+ eval { YAML::XS::Load( Encode::encode_utf8("$yaml\n\n") ); };
if ($@) {
push @bad_yaml_prefs, $syspref;
}
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,
if $shouldhidemarc_intranet->{biblionumber};
}
$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 => $@ );
+ }
}
my %versions = C4::Context::get_versions();
mysqlVersion => $versions{'mysqlVersion'},
apacheVersion => $versions{'apacheVersion'},
zebraVersion => $zebraVersion,
- prefBiblioAddsAuthorities => $prefBiblioAddsAuthorities,
+ prefRequireChoosingExistingAuthority => $prefRequireChoosingExistingAuthority,
prefAutoCreateAuthorities => $prefAutoCreateAuthorities,
- warnPrefBiblioAddsAuthorities => $warnPrefBiblioAddsAuthorities,
+ 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,
## Release teams
my $teams =
-e "$docdir" . "/teams.yaml"
- ? LoadFile( "$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"
- ? LoadFile( "$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 $normalized_role = "$role";
}
}
}
- elsif ( $role ne 'release_date' ) {
+ 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 = $teams->{team}->{$version}->{$role};
+ }
+ next;
+ }
+ else {
my $name = $teams->{team}->{$version}->{$role}->{name};
# Add role to contributors
push @{ $contributors->{$name}->{roles}->{$normalized_role} },
$contributors->{$name}->{openhub};
}
}
- else {
- $teams->{team}->{$version}->{$role} = DateTime->from_epoch( epoch => $teams->{team}->{$version}->{$role});
- }
}
}
my @people = map {
{ name => $_, ( $contributors->{$_} ? %{ $contributors->{$_} } : () ) }
} sort {
- my ($alast) = ( split( /\s/, $a ) )[-1];
- my ($blast) = ( split( /\s/, $b ) )[-1];
- lc($alast) cmp lc($blast)
-} keys %{$contributors};
+ 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;
+$template->param( kohaCodename => $codename);
$template->param( contributors => \@people );
$template->param( maintenance_team => $teams->{team}->{$dev_team} );
$template->param( release_team => $teams->{team}->{$short_version} );