@@ -, +, @@ --- Koha/BackgroundJob.pm | 3 + Koha/BackgroundJob/BatchDeleteAuthority.pm | 101 ++++++++++++++++++ .../batch_authority_record_deletion.inc | 42 ++++++++ .../prog/en/modules/admin/background_jobs.tt | 1 + .../en/modules/tools/batch_delete_records.tt | 18 +--- misc/background_jobs_worker.pl | 1 + tools/batch_delete_records.pl | 1 + 7 files changed, 154 insertions(+), 13 deletions(-) create mode 100644 Koha/BackgroundJob/BatchDeleteAuthority.pm create mode 100644 koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/batch_authority_record_deletion.inc --- a/Koha/BackgroundJob.pm +++ a/Koha/BackgroundJob.pm @@ -27,6 +27,7 @@ use Koha::Exceptions; use Koha::BackgroundJob::BatchUpdateBiblio; use Koha::BackgroundJob::BatchUpdateAuthority; use Koha::BackgroundJob::BatchDeleteBiblio; +use Koha::BackgroundJob::BatchDeleteAuthority; use base qw( Koha::Object ); @@ -158,6 +159,8 @@ sub process { ? Koha::BackgroundJob::BatchUpdateAuthority->process($args) : $job_type eq 'batch_biblio_record_deletion' ? Koha::BackgroundJob::BatchDeleteBiblio->process($args) + : $job_type eq 'batch_authority_record_deletion' + ? Koha::BackgroundJob::BatchDeleteAuthority->process($args) : Koha::Exceptions::Exception->throw('->process called without valid job_type'); } --- a/Koha/BackgroundJob/BatchDeleteAuthority.pm +++ a/Koha/BackgroundJob/BatchDeleteAuthority.pm @@ -0,0 +1,101 @@ +package Koha::BackgroundJob::BatchDeleteAuthority; + +use Modern::Perl; +use JSON qw( encode_json decode_json ); + +use Koha::BackgroundJobs; +use Koha::DateUtils qw( dt_from_string ); +use C4::AuthoritiesMarc; + +use base 'Koha::BackgroundJob'; + +sub job_type { + return 'batch_authority_record_deletion'; +} + +sub process { + my ( $self, $args ) = @_; + + my $job_type = $args->{job_type}; + + my $job = Koha::BackgroundJobs->find( $args->{job_id} ); + + if ( !exists $args->{job_id} || !$job || $job->status eq 'cancelled' ) { + return; + } + + # FIXME If the job has already been started, but started again (worker has been restart for instance) + # Then we will start from scratch and so double delete the same records + + my $job_progress = 0; + $job->started_on(dt_from_string) + ->progress($job_progress) + ->status('started') + ->store; + + my $mmtid = $args->{mmtid}; + my @record_ids = @{ $args->{record_ids} }; + + my $report = { + total_records => scalar @record_ids, + total_success => 0, + }; + my @messages; + my $schema = Koha::Database->new->schema; + RECORD_IDS: for my $record_id ( sort { $a <=> $b } @record_ids ) { + + last if $job->get_from_storage->status eq 'cancelled'; + + next unless $record_id; + + $schema->storage->txn_begin; + + my $authid = $record_id; + eval { C4::AuthoritiesMarc::DelAuthority({ authid => $authid }) }; + if ( $@ ) { + push @messages, { + type => 'error', + code => 'authority_not_deleted', + authid => $authid, + error => ($@ ? $@ : 0), + }; + $schema->storage->txn_rollback; + next; + } else { + push @messages, { + type => 'success', + code => 'authority_deleted', + authid => $authid, + }; + $report->{total_success}++; + $schema->storage->txn_commit; + } + + $job->progress( ++$job_progress )->store; + } + + my $job_data = decode_json $job->data; + $job_data->{messages} = \@messages; + $job_data->{report} = $report; + + $job->ended_on(dt_from_string) + ->data(encode_json $job_data); + $job->status('finished') if $job->status ne 'cancelled'; + $job->store; +} + +sub enqueue { + my ( $self, $args) = @_; + + # TODO Raise exception instead + return unless exists $args->{record_ids}; + + my @record_ids = @{ $args->{record_ids} }; + + $self->SUPER::enqueue({ + job_size => scalar @record_ids, + job_args => {record_ids => \@record_ids,} + }); +} + +1; --- a/koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/batch_authority_record_deletion.inc +++ a/koha-tmpl/intranet-tmpl/prog/en/includes/background_jobs/batch_authority_record_deletion.inc @@ -0,0 +1,42 @@ +[% BLOCK report %] + [% SET report = job.report %] + [% IF report %] + [% IF report.total_records == report.total_success %] +
+ All records have been deleted successfully! +
+ [% ELSIF report.total_success == 0 %] +
+ No record has been deleted. An error occurred. +
+ [% ELSE %] +
+ [% report.total_success | html %] / [% report.total_records | html %] records have been deleted successfully but some errors occurred. +
+ [% END %] + [% END %] +[% END %] + +[% BLOCK detail %] + [% FOR m IN job.messages %] +
+ [% IF m.type == 'success' %] + + [% ELSIF m.type == 'warning' %] + + [% ELSIF m.type == 'error' %] + + [% END %] + [% IF m.code == 'authority_not_exists' %] + The authority id [% m.authid | html %] does not exist in the database. + [% ELSIF m.code == 'authority_not_deleted' %] + Authority record [% m.authid | html %] was not deleted. An error occurred. + [% ELSIF m.code == 'authority_deleted' %] + Authority [% m.authid | html %] has been deleted successfully. + [% END %] +
+ [% END %] +[% END %] + +[% BLOCK js %] +[% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/background_jobs.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/background_jobs.tt @@ -111,6 +111,7 @@ Administration › Koha [% CASE 'batch_biblio_record_modification' %]Batch bibliographic record modification [% CASE 'batch_biblio_record_deletion' %]Batch bibliographic record record deletion [% CASE 'batch_authority_record_modification' %]Batch authority record modification + [% CASE 'batch_authority_record_deletion' %]Batch authority record deletion [% CASE %][% job.type | html %] [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batch_delete_records.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batch_delete_records.tt @@ -43,13 +43,14 @@ The biblionumber [% message.biblionumber | html %] does not exist in the database. [% ELSIF message.code == 'authority_not_exists' %] The authority id [% message.authid | html %] does not exist in the database. - [% ELSIF message.code == 'authority_not_deleted' %] - Authority record [% message.authid | html %] was not deleted. An error occurred. - [% ELSIF message.code == 'authority_deleted' %] - Authority [% message.authid | html %] has been deleted successfully. [% ELSIF message.code == 'cannot_enqueue_job' %] Cannot enqueue this job. + [% ELSIF message.code == 'biblio_not_exists' %] + Bibliographic record [% message.biblionumber | html %] does not exist in the database. + [% ELSIF message.code == 'authority_not_exists' %] + Authority record [% message.authid | html %] does not exist in the database. [% END %] + [% IF message.error %] (The error was: [% message.error | html %], see the Koha log file for more information). [% END %] @@ -198,15 +199,6 @@ [% ELSE %] There are no record ids defined. [% END %] - [% ELSIF op == 'report' %] - [% IF report.total_records == report.total_success %] - All records have been deleted successfully! - [% ELSIF report.total_success == 0 %] - No record has been deleted. An error occurred. - [% ELSE %] - [% report.total_success | html %] / [% report.total_records | html %] records have been deleted successfully but some errors occurred. - [% END %] -

New batch record deletion

[% ELSIF op == 'enqueued' %]

The job has been enqueued! It will be processed as soon as possible.

--- a/misc/background_jobs_worker.pl +++ a/misc/background_jobs_worker.pl @@ -32,6 +32,7 @@ my @job_types = qw( batch_biblio_record_modification batch_authority_record_modification batch_biblio_record_deletion + batch_authority_record_deletion ); if ( $conn ) { --- a/tools/batch_delete_records.pl +++ a/tools/batch_delete_records.pl @@ -35,6 +35,7 @@ use Koha::Authorities; use Koha::Biblios; use Koha::Items; use Koha::BackgroundJob::BatchDeleteBiblio; +use Koha::BackgroundJob::BatchDeleteAuthority; my $input = CGI->new; my $op = $input->param('op') // q|form|; --