[Koha-bugs] [Bug 12802] Send notices using several email addresses

bugzilla-daemon at bugs.koha-community.org bugzilla-daemon at bugs.koha-community.org
Mon Dec 18 12:12:17 CET 2023


https://bugs.koha-community.org/bugzilla3/show_bug.cgi?id=12802

--- Comment #121 from Mathieu Saby <mathsabypro at gmail.com> ---
I applied the patch. With it, the notice mechanism is broken : when Koha try to
generate a notice after checkin, this message appears :


Error trace
Can't call method "borrowernumber" on unblessed reference at
/kohadevbox/koha/C4/Letters.pm line 961
in C4::Letters::EnqueueLetter at /kohadevbox/koha/C4/Letters.pm line 961
  958:         $from_address = $params->{from_address};
  959:     } elsif ( $params->{message_transport_type} eq 'email' ) {
  960:         if ( $params->{borrowernumber} ) {
  961:             my $patron = Koha::Patrons->find( $params->borrowernumber );
  962:             if ( $patron ) {
  963:                 $from_address = $patron->library->from_email_address;
  964:             }
Show function arguments

in C4::Message::enqueue at /kohadevbox/koha/C4/Message.pm line 166
  163:     $letter->{content} = $metadata->{header} . $body .
$metadata->{footer};
  164: 
  165:     $letter->{metadata} = Encode::decode_utf8( Dump($metadata) );
  166:     C4::Letters::EnqueueLetter(
  167:         {
  168:             letter                 => $letter,
  169:             borrowernumber         => $patron->id,
Show function arguments

in C4::Circulation::SendCirculationAlert at /kohadevbox/koha/C4/Circulation.pm
line 3787
 3784:         unless ( @messages ) {
 3785:             C4::Context->dbh->do(q|UNLOCK TABLES|) unless $do_not_lock;
 3786:             my $patron =
Koha::Patrons->find($borrower->{borrowernumber});
 3787:             C4::Message->enqueue($letter, $patron, $mtt);
 3788:         } else {
 3789:             foreach my $message (@messages) {
 3790:                 $message->append($letter);
Show function arguments

in C4::Circulation::AddIssue at /kohadevbox/koha/C4/Circulation.pm line 1833
 1830:                 item_type    => $item_object->effective_itemtype,
 1831:                 notification => 'CHECKOUT',
 1832:             );
 1833:             if ( $circulation_alert->is_enabled_for( \%conditions ) ) {
 1834:                 SendCirculationAlert(
 1835:                     {
 1836:                         type     => 'CHECKOUT',
Show function arguments

in (eval) at /kohadevbox/koha/circ/circulation.pl line 451
  448:             if ( my $booked = $question->{BOOKED_EARLY} //
$alerts->{BOOKED} ) {
  449:                 $datedue = $booked->end_date;
  450:             }
  451:             my $issue = AddIssue(
  452:                 $patron, $barcode, $datedue,
  453:                 $cancelreserve,
  454:                 undef, undef,
in CGI::Compile::ROOT::kohadevbox_koha_circ_circulation_2epl::__ANON__ at
/kohadevbox/koha/circ/circulation.pl line 2
    1: #!/usr/bin/perl
    2: 
    3: # script to execute issuing of books
    4: 
    5: # Copyright 2000-2002 Katipo Communications
Show function arguments

in CGI::Compile::ROOT::kohadevbox_koha_circ_circulation_2epl::circulation_2epl
at /usr/share/perl5/CGI/Compile.pm line 151
  148:             # this is necessary for MSWin32
  149:             my $orig_warn = $SIG{__WARN__} || sub { warn(@_) };
  150:             local $SIG{__WARN__} = sub { $orig_warn->(@_) unless $_[0]
=~ /^No such signal/ };
  151:             $code->($self, $data, $path, $dir, \@args)
  152:         };
  153:     };
  154: 
in CGI::Emulate::PSGI::__ANON__ at /usr/share/perl5/CGI/Emulate/PSGI.pm line 30
   27:                 local *STDOUT = $stdout;
   28:                 local *STDERR = $env->{'psgi.errors'};
   29: 
   30:                 $code->();
   31:             }
   32:         }
   33: 
Show function arguments

in Plack::App::WrapCGI::call at /usr/share/perl5/Plack/App/WrapCGI.pm line 95
   92: 
   93: sub call {
   94:     my($self, $env) = @_;
   95:     $self->_app->($env);
   96: }
   97: 
   98: 1;
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::App::CGIBin::serve_path at /usr/share/perl5/Plack/App/CGIBin.pm line
50
   47:     my $app = $self->{_compiled}->{$file} ||= Plack::App::WrapCGI->new(
   48:         script => $file, execute => $self->would_exec($file),
   49:     )->to_app;
   50:     $app->($env);
   51: }
   52: 
   53: 1;
Show function arguments

in Plack::App::File::call at /usr/share/perl5/Plack/App/File.pm line 34
   31:         $env->{'plack.file.PATH_INFO'}   = '';
   32:     }
   33: 
   34:     return $self->serve_path($env, $file);
   35: }
   36: 
   37: sub locate_file {
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::LogWarn::call at
/usr/share/perl5/Plack/Middleware/LogWarn.pm line 22
   19:          message => join '', @_
   20:       });
   21:    };
   22:    my $res = $self->app->($env);
   23: 
   24:    return $res;
   25: }
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::Log4perl::call at
/usr/share/perl5/Plack/Middleware/Log4perl.pm line 30
   27:         $self->logger->$level($args->{message});
   28:     };
   29: 
   30:     $self->app->($env);
   31: }
   32: 
   33: 1;
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::HTTPExceptions::try {...} at
/usr/share/perl5/Plack/Middleware/HTTPExceptions.pm line 20
   17:     my($self, $env) = @_;
   18: 
   19:     my $res = try {
   20:         $self->app->($env);
   21:     } catch {
   22:         $self->transform_error($_, $env);
   23:     };
in (eval) at /usr/share/perl5/Try/Tiny.pm line 100
   97:     if ( $wantarray ) {
   98:       @ret = $try->();
   99:     } elsif ( defined $wantarray ) {
  100:       $ret[0] = $try->();
  101:     } else {
  102:       $try->();
  103:     };
in Try::Tiny::try at /usr/share/perl5/Try/Tiny.pm line 93
   90: 
   91:   # failed will be true if the eval dies, because 1 will not be returned
   92:   # from the eval body
   93:   my $failed = not eval {
   94:     $@ = $prev_error;
   95: 
   96:     # evaluate the try block in the correct context
Show function arguments

in Plack::Middleware::HTTPExceptions::call at
/usr/share/perl5/Plack/Middleware/HTTPExceptions.pm line 23
   20:         $self->app->($env);
   21:     } catch {
   22:         $self->transform_error($_, $env);
   23:     };
   24: 
   25:     return $res if ref $res eq 'ARRAY';
   26: 
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::ErrorDocument::call at
/usr/share/perl5/Plack/Middleware/ErrorDocument.pm line 15
   12:     my $self = shift;
   13:     my $env  = shift;
   14: 
   15:     my $r = $self->app->($env);
   16: 
   17:     $self->response_cb($r, sub {
   18:         my $r = shift;
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::App::URLMap::call at /usr/share/perl5/Plack/App/URLMap.pm line 71
   68:         return $self->response_cb($app->($env), sub {
   69:             $env->{PATH_INFO} = $orig_path_info;
   70:             $env->{SCRIPT_NAME} = $orig_script_name;
   71:         });
   72:     }
   73: 
   74:     DEBUG && warn "All matching failed.\n";
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Koha::Middleware::RealIP::call at /kohadevbox/koha/Koha/Middleware/RealIP.pm
line 64
   61:         }
   62:     }
   63: 
   64:     return $self->app->($env);
   65: }
   66: 
   67: =head2 get_real_ip
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Koha::Middleware::SetEnv::call at /kohadevbox/koha/Koha/Middleware/SetEnv.pm
line 106
  103:         $env->{$key} = $setenvs{$key};
  104:     }
  105: 
  106:     return $self->app->($env);
  107: }
  108: 
  109: =head1 AUTHOR
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::Static::call at
/usr/share/perl5/Plack/Middleware/Static.pm line 18
   15:         return $res;
   16:     }
   17: 
   18:     return $self->app->($env);
   19: }
   20: 
   21: sub _handle_static {
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::ReverseProxy::call at
/usr/share/perl5/Plack/Middleware/ReverseProxy.pm line 68
   65:         }
   66:     }
   67: 
   68:     $self->app->($env);
   69: }
   70: 
   71: 1;
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::Lint::call at /usr/share/perl5/Plack/Middleware/Lint.pm
line 24
   21:     my $env = shift;
   22: 
   23:     $self->validate_env($env);
   24:     my $res = $self->app->($env);
   25:     return $self->validate_res($res);
   26: }
   27: 
Show function arguments

in Plack::Middleware::StackTrace::try {...} at
/usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
in (eval) at /usr/share/perl5/Try/Tiny.pm line 100
   97:     if ( $wantarray ) {
   98:       @ret = $try->();
   99:     } elsif ( defined $wantarray ) {
  100:       $ret[0] = $try->();
  101:     } else {
  102:       $try->();
  103:     };
in Plack::Middleware::StackTrace::call at /usr/share/perl5/Try/Tiny.pm line 93
   90: 
   91:   # failed will be true if the eval dies, because 1 will not be returned
   92:   # from the eval body
   93:   my $failed = not eval {
   94:     $@ = $prev_error;
   95: 
   96:     # evaluate the try block in the correct context
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in Plack::Middleware::AccessLog::call at
/usr/share/perl5/Plack/Middleware/AccessLog.pm line 27
   24:     my $self = shift;
   25:     my($env) = @_;
   26: 
   27:     my $res = $self->app->($env);
   28: 
   29:     if ( ref($res) && ref($res) eq 'ARRAY' ) {
   30:         my $content_length = Plack::Util::content_length($res->[2]);
Show function arguments

in Plack::Component::__ANON__ at /usr/share/perl5/Plack/Component.pm line 50
   47: sub to_app {
   48:     my $self = shift;
   49:     $self->prepare_app;
   50:     return sub { $self->call(@_) };
   51: }
   52: 
   53: 
Show function arguments

in (eval) at /usr/share/perl5/Plack/Util.pm line 145
  142: sub run_app($$) {
  143:     my($app, $env) = @_;
  144: 
  145:     return eval { $app->($env) } || do {
  146:         my $body = "Internal Server Error";
  147:         $env->{'psgi.errors'}->print($@);
  148:         [ 500, [ 'Content-Type' => 'text/plain', 'Content-Length' =>
length($body) ], [ $body ] ];
in Plack::Util::run_app at /usr/share/perl5/Plack/Util.pm line 145
  142: sub run_app($$) {
  143:     my($app, $env) = @_;
  144: 
  145:     return eval { $app->($env) } || do {
  146:         my $body = "Internal Server Error";
  147:         $env->{'psgi.errors'}->print($@);
  148:         [ 500, [ 'Content-Type' => 'text/plain', 'Content-Length' =>
length($body) ], [ $body ] ];
Show function arguments

in Starman::Server::dispatch_request at /usr/share/perl5/Starman/Server.pm line
195
  192:     my ($self, $env) = @_;
  193: 
  194:     # Run PSGI apps
  195:     my $res = Plack::Util::run_app($self->{app}, $env);
  196: 
  197:     if (ref $res eq 'CODE') {
  198:         $res->(sub { $self->_finalize_response($env, $_[0]) });
Show function arguments

in Starman::Server::process_request at /usr/share/perl5/Starman/Server.pm line
298
  295: 
  296:         $self->_prepare_env($env);
  297: 
  298:         $self->dispatch_request($env);
  299: 
  300:         DEBUG && warn "[$$] Request done\n";
  301: 
Show function arguments

in Net::Server::run_client_connection at /usr/share/perl5/Net/Server.pm line 72
   69:     $self->post_accept_hook($c);    # user customizable hook
   70: 
   71:     my $ok = $self->allow_deny($c) && $self->allow_deny_hook($c); # do
allow/deny check on client info
   72:     if ($ok) {
   73:         $self->process_request($c);   # This is where the core
functionality of a Net::Server should be.
   74:     } else {
   75:         $self->request_denied_hook($c);     # user customizable hook
Show function arguments

in (eval) at /usr/share/perl5/Net/Server/PreFork.pm line 225
  222:         $prop->{'connected'} = 1;
  223:         print $write "$$ processing\n";
  224: 
  225:         my $ok = eval { $self->run_client_connection; 1 };
  226:         if (! $ok) {
  227:             print $write "$$ exiting\n";
  228:             die $@;
in Net::Server::PreFork::run_child at /usr/share/perl5/Net/Server/PreFork.pm
line 225
  222:         $prop->{'connected'} = 1;
  223:         print $write "$$ processing\n";
  224: 
  225:         my $ok = eval { $self->run_client_connection; 1 };
  226:         if (! $ok) {
  227:             print $write "$$ exiting\n";
  228:             die $@;
Show function arguments

in Net::Server::PreFork::run_n_children at
/usr/share/perl5/Net/Server/PreFork.pm line 183
  180:             if ($prop->{'child_communication'}) {
  181:                 $prop->{'parent_sock'} = $childsock;
  182:             }
  183:             $self->run_child;
  184:         }
  185:     }
  186: }
Show function arguments

in Net::Server::PreFork::loop at /usr/share/perl5/Net/Server/PreFork.pm line
107
  104: 
  105:     my $start = $prop->{'min_servers'};
  106:     $self->log(3, "Beginning prefork ($start processes)");
  107:     $self->run_n_children($start);
  108: 
  109:     $self->run_parent;
  110: }
Show function arguments

in Net::Server::run at /usr/share/perl5/Net/Server.pm line 58
   55:     $self->post_bind;           # allow for chrooting, becoming a
different user and group
   56: 
   57:     $self->pre_loop_hook;       # user customizable hook
   58:     $self->loop;                # repeat accept/process cycle
   59: 
   60:     $self->server_close;        # close the server and release the port
   61: }
Show function arguments

in Starman::Server::run at /usr/share/perl5/Starman/Server.pm line 106
  103:         max_requests        => $options->{max_requests}      || 1000,
  104:         user                => $options->{user}              || $>,
  105:         group               => $options->{group}             || $),
  106:         listen              => $options->{backlog}           || 1024,
  107:         check_for_waiting   => 1,
  108:         no_client_stdout    => 1,
  109:         %extra
Show function arguments

in Plack::Handler::Starman::run at /usr/share/perl5/Plack/Handler/Starman.pm
line 25
   22:     }
   23:     $self->{net_server_args} = \%nsa if %nsa;
   24: 
   25:     Starman::Server->new->run($app, {%$self});
   26: }
   27: 
   28: 1;
Show function arguments

in Plack::Loader::Delayed::run at /usr/share/perl5/Plack/Loader/Delayed.pm line
20
   17:     };
   18: 
   19:     $server->{psgi_app_builder} = $self->{builder};
   20:     $server->run($app);
   21: }
   22: 
   23: 1;
Show function arguments

in Plack::Runner::run at /usr/share/perl5/Plack/Runner.pm line 279
  276:     $loader->preload_app($app);
  277: 
  278:     my $server = $self->load_server($loader);
  279:     $loader->run($server);
  280: }
  281: 
  282: 1;
Show function arguments

at /usr/bin/starman line 38
   35: }
   36: 
   37: $runner->set_options(argv => \@argv);
   38: $runner->run;
   39: 
   40: __END__
   41:

-- 
You are receiving this mail because:
You are watching all bug changes.


More information about the Koha-bugs mailing list