From f5c839348091d129bb7100af2c9e64e486d0ea1d Mon Sep 17 00:00:00 2001 From: =?utf8?q?Johanna=20R=C3=A4is=C3=A4?= Date: Tue, 25 Apr 2023 13:00:24 +0300 Subject: [PATCH] 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 Signed-off-by: Kyle M Hall Signed-off-by: Katrin Fischer --- Koha/BackgroundJobs.pm | 14 +++++ Koha/REST/V1/BackgroundJobs.pm | 8 ++- api/v1/swagger/paths/jobs.yaml | 5 ++ .../prog/en/modules/admin/background_jobs.tt | 37 ++++-------- t/db_dependent/Koha/BackgroundJobs.t | 60 ++++++++++++++++++- 5 files changed, 97 insertions(+), 27 deletions(-) diff --git a/Koha/BackgroundJobs.pm b/Koha/BackgroundJobs.pm index 48afbf68fa..1370fcb13c 100644 --- a/Koha/BackgroundJobs.pm +++ b/Koha/BackgroundJobs.pm @@ -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 diff --git a/Koha/REST/V1/BackgroundJobs.pm b/Koha/REST/V1/BackgroundJobs.pm index 87d715e880..a55e105541 100644 --- a/Koha/REST/V1/BackgroundJobs.pm +++ b/Koha/REST/V1/BackgroundJobs.pm @@ -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) diff --git a/api/v1/swagger/paths/jobs.yaml b/api/v1/swagger/paths/jobs.yaml index 7edd87dad2..a044289562 100644 --- a/api/v1/swagger/paths/jobs.yaml +++ b/api/v1/swagger/paths/jobs.yaml @@ -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" diff --git a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/background_jobs.tt b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/background_jobs.tt index e23f04ba41..6cf4e07049 100644 --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/background_jobs.tt +++ b/koha-tmpl/intranet-tmpl/prog/en/modules/admin/background_jobs.tt @@ -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); - - $("#include_last_hour").on("change", function(){ - jobs_table.DataTable().draw(); - return false; - }); + }, null, 1); - $("#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; }); }); diff --git a/t/db_dependent/Koha/BackgroundJobs.t b/t/db_dependent/Koha/BackgroundJobs.t index c8089d4488..58b34d544d 100755 --- a/t/db_dependent/Koha/BackgroundJobs.t +++ b/t/db_dependent/Koha/BackgroundJobs.t @@ -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; -- 2.39.5