Bug 36217: Fix background jobs page's include_last_hour filter

Test plan:
1) Create a background job
2) Go to the background jobs page
3) See your job listed
4) Unselect "include_last_hour" from the filter
5) Verify that the job is not listed
6) Apply the patch
7) perl build-resources.PL
8) Repeat steps 1-3
9) Verify that the job is now listed
10) prove t/db_dependent/Koha/BackgroundJobs.t
11) Verify that the tests pass

Sponsored-by: Koha-Suomi Oy
Signed-off-by: David Cook <dcook@prosentient.com.au>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Katrin Fischer <katrin.fischer@bsz-bw.de>
This commit is contained in:
Johanna Räisä 2023-04-25 13:00:24 +03:00 committed by Katrin Fischer
parent 1bc9d18dd6
commit f5c8393480
No known key found for this signature in database
GPG Key ID: 0EF6E2C03357A834
5 changed files with 97 additions and 27 deletions

View File

@ -72,6 +72,20 @@ sub filter_by_current {
);
}
=head3 filter_by_last_hour
my $current_jobs = $jobs->filter_by_last_hour;
Returns a new resultset, filtering out jobs that were enqueued more than an hour ago.
=cut
sub filter_by_last_hour {
my ($self) = @_;
return $self->search( { enqueued_on => { '>', \"NOW() - INTERVAL 1 HOUR" } } );
}
=head2 Internal methods
=head3 _type

View File

@ -38,8 +38,10 @@ sub list {
return try {
my $only_current = $c->param('only_current');
my $only_current = $c->param('only_current');
my $only_last_hour = $c->param('only_last_hour');
$c->req->params->remove('only_current');
$c->req->params->remove('only_last_hour');
my $bj_rs = Koha::BackgroundJobs->new;
@ -47,6 +49,10 @@ sub list {
$bj_rs = $bj_rs->filter_by_current;
}
if ($only_last_hour) {
$bj_rs = $bj_rs->filter_by_last_hour;
}
return $c->render(
status => 200,
openapi => $c->objects->search($bj_rs)

View File

@ -14,6 +14,11 @@
required: false
type: boolean
description: Only include current jobs
- name: only_last_hour
in: query
required: false
type: boolean
description: Only include jobs started in the last hour
- $ref: "../swagger.yaml#/parameters/match"
- $ref: "../swagger.yaml#/parameters/order_by"
- $ref: "../swagger.yaml#/parameters/page"

View File

@ -259,29 +259,21 @@
$("#job_details").show();
[% END %]
let additional_filters = {
enqueued_on: function(){
let now = new Date();
if ( $("#include_last_hour").is(":checked") ) {
now.setHours(now.getHours() - 1);
return { ">": now.toISOString() };
} else {
return { "<": now.toISOString() };
}
}
};
let only_current_filter = function(){
if ( $("#only_current").is(":checked") ) {
return 'only_current=1';
let query_filters = function(){
if ( $("#only_current").is(":checked") && !$("#include_last_hour").is(":checked") ) {
return 'only_current=1&only_last_hour=0';
} else if ( $("#include_last_hour").is(":checked") && !$("#only_current").is(":checked")) {
return 'only_current=0&only_last_hour=1';
} else if ( $("#only_current").is(":checked") && $("#include_last_hour").is(":checked") ) {
return 'only_current=1&only_last_hour=1';
} else {
return 'only_current=0';
return 'only_current=0&only_last_hour=0';
}
}
let jobs_table = $("#table_jobs").kohaTable({
"ajax": {
"url": "/api/v1/jobs?" + only_current_filter()
"url": "/api/v1/jobs?" + query_filters(),
},
"order": [[ 1, "desc" ]],
"columns": [
@ -350,15 +342,10 @@
"orderable": false
}
]
}, null, 1, additional_filters);
}, null, 1);
$("#include_last_hour").on("change", function(){
jobs_table.DataTable().draw();
return false;
});
$("#only_current").on("change", function(){
jobs_table.DataTable().ajax.url("/api/v1/jobs?" + only_current_filter()).load();
$("#only_current, #include_last_hour").on("change", function(){
jobs_table.DataTable().ajax.url("/api/v1/jobs?" + query_filters()).load();
return false;
});
});

View File

@ -19,7 +19,7 @@
use Modern::Perl;
use Test::More tests => 14;
use Test::More tests => 16;
use Test::MockModule;
use List::MoreUtils qw(any);
@ -123,6 +123,64 @@ subtest 'filter_by_current() tests' => sub {
$schema->storage->txn_rollback;
};
subtest 'filter_by_last_hour() tests' => sub {
plan tests => 2;
$schema->storage->txn_begin;
my $job_now =
$builder->build_object( { class => 'Koha::BackgroundJobs', value => { enqueued_on => dt_from_string } } );
my $job_old = $builder->build_object(
{ class => 'Koha::BackgroundJobs', value => { enqueued_on => dt_from_string->subtract( hours => 2 ) } } );
my $rs = Koha::BackgroundJobs->search( { id => [ $job_now->id, $job_old->id ] } );
is( $rs->count, 2, '2 jobs in resultset' );
$rs = $rs->filter_by_last_hour;
is( $rs->count, 1, 'Only 1 job in filtered resultset' );
$schema->storage->txn_rollback;
};
subtest 'filter_by_last_hour() and filter_by_current() tests' => sub {
plan tests => 3;
$schema->storage->txn_begin;
my $job_new_now = $builder->build_object(
{ class => 'Koha::BackgroundJobs', value => { status => 'new', enqueued_on => dt_from_string } } );
my $job_new_old = $builder->build_object(
{
class => 'Koha::BackgroundJobs',
value => { status => 'new', enqueued_on => dt_from_string->subtract( hours => 2 ) }
}
);
my $job_cancelled = $builder->build_object(
{ class => 'Koha::BackgroundJobs', value => { status => 'cancelled', enqueued_on => dt_from_string } } );
my $job_failed = $builder->build_object(
{ class => 'Koha::BackgroundJobs', value => { status => 'failed', enqueued_on => dt_from_string } } );
my $job_finished = $builder->build_object(
{ class => 'Koha::BackgroundJobs', value => { status => 'finished', enqueued_on => dt_from_string } } );
my $rs = Koha::BackgroundJobs->search(
{ id => [ $job_new_now->id, $job_new_old->id, $job_cancelled->id, $job_failed->id, $job_finished->id ] } );
is( $rs->count, 5, '5 jobs in resultset' );
$rs = $rs->filter_by_last_hour;
is( $rs->count, 4, '4 jobs in last hour' );
$rs = $rs->filter_by_current;
is( $rs->count, 1, 'Only 1 current job in last hour' );
$schema->storage->txn_rollback;
};
subtest 'search_limited' => sub {
plan tests => 3;