diff --git a/Koha/Reports.pm b/Koha/Reports.pm
index 6e2f8f3974..e36bb464d3 100644
--- a/Koha/Reports.pm
+++ b/Koha/Reports.pm
@@ -103,7 +103,8 @@ sub running {
$report_ids{$1} = 1 if $row->{info} =~ /saved_sql\.id:\s*(\d+)/;
}
- return $class->search( { id => { -in => [ keys %report_ids ] } } );
+ my $rs = $class->search( { id => { -in => [ keys %report_ids ] } } );
+ return wantarray ? $rs->as_list : $rs;
}
=head3 _processlist_rows
diff --git a/debian/templates/koha-conf-site.xml.in b/debian/templates/koha-conf-site.xml.in
index 03fffb6317..f31f6ea442 100644
--- a/debian/templates/koha-conf-site.xml.in
+++ b/debian/templates/koha-conf-site.xml.in
@@ -348,6 +348,7 @@ __END_SRU_PUBLICSERVER__
This report is already running. Please wait for it to finish before running it again.
[% ELSIF ( error.total_running_reports_limit_exceeded ) %]You have too many reports running at the moment. Please wait for some of them to finish before running this report again.
+ [% ELSIF ( error.total_running_reports_per_instance_limit_exceeded ) %] +There are too many total reports running at the moment. Please wait for some of them to finish before running this report again.
[% ELSIF ( error.sqlerr ) %]This report contains an SQL keyword: [% error.sqlerr | html %].
Use of this keyword is not allowed in Koha reports due to security and data integrity risks. Only SELECT queries are allowed.
diff --git a/reports/guided_reports.pl b/reports/guided_reports.pl index 8b9f72ec4e..2a4132b7fa 100755 --- a/reports/guided_reports.pl +++ b/reports/guided_reports.pl @@ -885,6 +885,42 @@ if ( $op eq 'run' ) { my $template_code = $input->param('template_code'); my $want_full_chart = $input->param('want_full_chart') || 0; + # Determine if the user is running this report too many times + my @duplicate_running_report_ids; + my $duplicate_running_reports_per_user_limit = C4::Context->config('duplicate_running_reports_per_user_limit'); + if ( $duplicate_running_reports_per_user_limit && C4::Context->userenv ) { + my $user_id = C4::Context->userenv ? C4::Context->userenv->{number} : undef; + @duplicate_running_report_ids = Koha::Reports->running( { report_id => $report_id, user_id => $user_id } ); + } + my $duplicate_running_reports_per_user_limit_exceeded = + $duplicate_running_reports_per_user_limit + ? scalar(@duplicate_running_report_ids) >= $duplicate_running_reports_per_user_limit + : 0; + + # Determine if the user is running too many reports in total + my @total_running_for_user_report_ids; + my $total_running_reports_per_user_limit = C4::Context->config('total_running_reports_per_user_limit'); + if ( $total_running_reports_per_user_limit && C4::Context->userenv ) { + my $user_id = C4::Context->userenv ? C4::Context->userenv->{number} : undef; + @total_running_for_user_report_ids = Koha::Reports->running( { user_id => $user_id } ); + } + my $total_running_reports_per_user_limit_exceeded = + $total_running_reports_per_user_limit + ? scalar(@total_running_for_user_report_ids) >= $total_running_reports_per_user_limit + : 0; + + # Determine if the Koha instance is running too many reports in total + my @total_running_for_instance_report_ids; + my $total_running_reports_per_instance_limit = C4::Context->config('total_running_reports_per_instance_limit'); + if ( $total_running_reports_per_instance_limit && C4::Context->userenv ) { + my $instance_id = C4::Context->userenv ? C4::Context->userenv->{number} : undef; + @total_running_for_instance_report_ids = Koha::Reports->running(); + } + my $total_running_reports_per_instance_limit_exceeded = + $total_running_reports_per_instance_limit + ? scalar(@total_running_for_instance_report_ids) >= $total_running_reports_per_instance_limit + : 0; + # offset algorithm if ( $input->param('page') ) { $offset = ( $input->param('page') - 1 ) * $limit; @@ -1070,6 +1106,33 @@ if ( $op eq 'run' ) { 'id' => $report_id, 'template_code' => $template_code, ); + } elsif ( $duplicate_running_reports_per_user_limit_exceeded + || $total_running_reports_per_user_limit_exceeded + || $total_running_reports_per_instance_limit_exceeded ) + { + $template->param( + 'sql' => $sql, + 'original_sql' => $original_sql, + 'id' => $report_id, + 'execute' => 1, + 'name' => $name, + 'notes' => $notes, + 'errors' => [ + $duplicate_running_reports_per_user_limit_exceeded + ? { duplicate_running_report_ids => \@duplicate_running_report_ids } + : (), + $total_running_reports_per_user_limit_exceeded + ? { total_running_reports_per_user_limit_exceeded => \@total_running_for_user_report_ids } + : (), + $total_running_reports_per_instance_limit_exceeded + ? { + total_running_reports_per_instance_limit_exceeded => \@total_running_for_instance_report_ids + } + : (), + ], + 'sql_params' => \@sql_params, + 'param_names' => \@param_names, + ); } else { my ( $sql, $header_types ); eval { ( $sql, $header_types ) = $report->prep_report( \@param_names, \@sql_params ); };