Bug 20123: Allow multiple instances of Koha to have different timezones on the same server

Most of Koha depends on the local timezone of the server, except for Koha::Database which support an ENV override with the key TZ.

We should take this a step further. We should not only accept the TZ environment variable for all of Koha, we should really be able to set the timezone in the koha conf file as well so we don't have to pass that environment variable to things like cronjobs and one-off scripts.

Test Plan:
1) Apply this patch
2) Set a timzone in your koha_conf file, that is *not* your local time zone
   Available timzones are listed here: https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
3) Restart apache/plack
4) Perform some actions, check the timestamps in the database and in the
   html output, note they are for the set timezone and not the local
   timezone.

Signed-off-by: Mark Tompsett <mtompset@hotmail.com>
Signed-off-by: Tomas Cohen Arazi <tomascohen@theke.io>

Signed-off-by: Jonathan Druart <jonathan.druart@bugs.koha-community.org>
This commit is contained in:
Kyle M Hall 2018-02-01 13:21:54 -05:00 committed by Jonathan Druart
parent 33618eaec3
commit 4cdf3e38af
3 changed files with 43 additions and 2 deletions

View file

@ -969,6 +969,21 @@ sub get_versions {
return %versions;
}
=head2 timezone
my $C4::Context->timzone
Returns a timezone code for the instance of Koha
=cut
sub timezone {
my $self = shift;
my $timezone = C4::Context->config('timezone') || $ENV{TZ} || 'local';
return $timezone;
}
=head2 tz
@ -981,7 +996,8 @@ sub get_versions {
sub tz {
my $self = shift;
if (!defined $context->{tz}) {
$context->{tz} = DateTime::TimeZone->new(name => 'local');
my $timezone = $self->timezone;
$context->{tz} = DateTime::TimeZone->new(name => $timezone);
}
return $context->{tz};
}

View file

@ -70,7 +70,7 @@ sub _new_schema {
my ( %encoding_attr, $encoding_query, $tz_query, $sql_mode_query );
my $tz = $ENV{TZ};
my $tz = C4::Context->timezone;
if ( $db_driver eq 'mysql' ) {
%encoding_attr = ( mysql_enable_utf8 => 1 );
$encoding_query = "set NAMES 'utf8mb4'";

25
t/timezones.t Normal file
View file

@ -0,0 +1,25 @@
use Modern::Perl;
use C4::Context;
use Test::More tests => 3;
use t::lib::Mocks;
$ENV{TZ} = q{};
t::lib::Mocks::mock_config( 'timezone', q{} );
is( C4::Context->timezone, 'local',
'Got local timezone with no env or config timezone set' );
$ENV{TZ} = 'Antarctica/Macquarie';
is(
C4::Context->timezone,
'Antarctica/Macquarie',
'Got correct timezone using ENV, overrides local time'
);
t::lib::Mocks::mock_config( 'timezone', 'Antarctica/South_Pole' );
is(
C4::Context->timezone,
'Antarctica/South_Pole',
'Got correct timezone using config, overrides env'
);