@@ -, +, @@ database as the default server verify only one server can be set as the default server a cronjob, AND/OR prove t/db_dependent/Koha/SMTP/Server.t --- Koha/SMTP/Servers.pm | 6 +++- admin/smtp_servers.pl | 33 +++++++++++++++---- api/v1/swagger/definitions/smtp_server.yaml | 3 ++ installer/data/mysql/kohastructure.sql | 1 + .../prog/en/modules/admin/smtp_servers.tt | 27 +++++++++++++++ t/db_dependent/Koha/SMTP/Server.t | 20 +++++++++-- 6 files changed, 80 insertions(+), 10 deletions(-) --- a/Koha/SMTP/Servers.pm +++ a/Koha/SMTP/Servers.pm @@ -44,9 +44,13 @@ sub get_default { my ($self) = @_; my $default; + my $smtp_config = C4::Context->config('smtp_server'); - if ( $smtp_config ) { + if ( $default = $self->search({ is_default => 1 }, { rows => 1 })->single ) { + + } + elsif ( $smtp_config ) { $default = Koha::SMTP::Server->new( $smtp_config ); } else { --- a/admin/smtp_servers.pl +++ a/admin/smtp_servers.pl @@ -52,8 +52,14 @@ if ( $op eq 'add' ) { my $user_name = $input->param('smtp_user_name') || undef; my $password = $input->param('smtp_password') || undef; my $debug = ( scalar $input->param('smtp_debug_mode') ) ? 1 : 0; + my $is_default = ( scalar $input->param('smtp_default') ) ? 1 : 0; + my $schema = Koha::Database->new->schema; try { + $schema->storage->txn_begin; + + Koha::SMTP::Servers->search->update({ is_default => 0 }) if $is_default; + Koha::SMTP::Server->new( { name => $name, @@ -64,12 +70,15 @@ if ( $op eq 'add' ) { user_name => $user_name, password => $password, debug => $debug, + is_default => $is_default, } )->store; push @messages, { type => 'message', code => 'success_on_insert' }; + $schema->storage->txn_commit; } catch { + $schema->storage->txn_rollback; if ( blessed $_ and $_->isa('Koha::Exceptions::Object::DuplicateID') ) { push @messages, { @@ -122,21 +131,29 @@ elsif ( $op eq 'edit_save' ) { my $user_name = $input->param('smtp_user_name') || undef; my $password = $input->param('smtp_password') || undef; my $debug = ( scalar $input->param('smtp_debug_mode') ) ? 1 : 0; + my $is_default = ( scalar $input->param('smtp_default') ) ? 1 : 0; + + my $schema = Koha::Database->new->schema; try { + $schema->storage->txn_begin; + + Koha::SMTP::Servers->search->update({ is_default => 0 }) if $is_default; + $smtp_server->password( $password ) if defined $password and $password ne '****' or not defined $password; $smtp_server->set( { - name => $name, - host => $host, - port => $port, - timeout => $timeout, - ssl_mode => $ssl_mode, - user_name => $user_name, - debug => $debug + name => $name, + host => $host, + port => $port, + timeout => $timeout, + ssl_mode => $ssl_mode, + user_name => $user_name, + debug => $debug, + is_default => $is_default, } )->store; @@ -145,8 +162,10 @@ elsif ( $op eq 'edit_save' ) { type => 'message', code => 'success_on_update' }; + $schema->storage->txn_commit; } catch { + $schema->storage->txn_rollback; push @messages, { type => 'alert', --- a/api/v1/swagger/definitions/smtp_server.yaml +++ a/api/v1/swagger/definitions/smtp_server.yaml @@ -37,6 +37,9 @@ properties: debug: type: boolean description: If the SMTP connection is set to debug mode + is_default: + type: boolean + description: Is this the default SMTP server additionalProperties: false required: - name --- a/installer/data/mysql/kohastructure.sql +++ a/installer/data/mysql/kohastructure.sql @@ -4647,6 +4647,7 @@ CREATE TABLE `smtp_servers` ( `user_name` varchar(80) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `password` varchar(80) COLLATE utf8mb4_unicode_ci DEFAULT NULL, `debug` tinyint(1) NOT NULL DEFAULT 0, + `is_default` tinyint(1) NOT NULL DEFAULT 0, PRIMARY KEY (`id`), KEY `host_idx` (`host`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smtp_servers.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/smtp_servers.tt @@ -134,6 +134,11 @@ Enables additional debug output in the logs +
  • + + + Sets this SMTP server as the default SMTP server. +
  • @@ -216,6 +221,15 @@ [%- END -%] +
  • + + [% IF smtp_server.is_default %] + + [% ELSE %] + + [% END %] + Sets this SMTP server as the default SMTP server. +
  • @@ -255,6 +269,7 @@ Timeout (secs) SSL Authenticated + Is default Actions @@ -368,6 +383,18 @@ "searchable": false, "orderable": false }, + { + "data": function( row, type, val, meta ) { + if ( row.is_default ) { + return _("Yes"); + } + else { + return _("No"); + } + }, + "searchable": false, + "orderable": false + }, { "data": function( row, type, val, meta ) { var result = ' '+_("Edit")+''+"\n"; --- a/t/db_dependent/Koha/SMTP/Server.t +++ a/t/db_dependent/Koha/SMTP/Server.t @@ -64,16 +64,32 @@ subtest 'transport() tests' => sub { subtest 'is_system_default() tests' => sub { - plan tests => 2; + plan tests => 3; $schema->storage->txn_begin; - my $smtp_server = $builder->build_object({ class => 'Koha::SMTP::Servers' }); + Koha::SMTP::Servers->search()->delete(); + + my $smtp_server = $builder->build_object( + { + class => 'Koha::SMTP::Servers', + value => { is_default => 0 } + } + ); + ok( !$smtp_server->is_system_default, 'A generated server is not the system default' ); my $system_default_server = Koha::SMTP::Servers->get_default; ok( $system_default_server->is_system_default, 'The server returned by get_default is the system default' ); + $smtp_server = $builder->build_object( + { + class => 'Koha::SMTP::Servers', + value => { ssl_mode => 'disabled', debug => 0, is_default => 1 } + } + ); + is( Koha::SMTP::Servers->get_default->id, $smtp_server->id, "Default server correctly retrieved from database" ); + $schema->storage->txn_rollback; }; --