X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FBackgroundJob.pm;h=27a1c69a62f45d0c7d0d7e93ef36838a2af63755;hb=53593baa211863fbf66540cf1bcc36c8fb37257f;hp=797797782fc421460e13d19b026ce29daa063ef9;hpb=d00e1b28dc8b03abfebf5c7be9305f01dc968ebc;p=kivitendo-erp.git diff --git a/SL/Controller/BackgroundJob.pm b/SL/Controller/BackgroundJob.pm index 797797782..27a1c69a6 100644 --- a/SL/Controller/BackgroundJob.pm +++ b/SL/Controller/BackgroundJob.pm @@ -6,35 +6,19 @@ use parent qw(SL::Controller::Base); use SL::BackgroundJob::Base; use SL::Controller::Helper::GetModels; -use SL::Controller::Helper::Paginated; -use SL::Controller::Helper::Sorted; use SL::DB::BackgroundJob; use SL::Helper::Flash; +use SL::JSON; use SL::Locale::String; use SL::System::TaskServer; use Rose::Object::MakeMethods::Generic ( - scalar => [ qw(background_job) ], - 'scalar --get_set_init' => [ qw(task_server back_to) ], + 'scalar --get_set_init' => [ qw(task_server back_to models background_job) ], ); __PACKAGE__->run_before('check_auth'); __PACKAGE__->run_before('check_task_server'); -__PACKAGE__->run_before('load_background_job', only => [ qw(edit update destroy execute) ]); - -__PACKAGE__->make_paginated(ONLY => [ qw(list) ]); - -__PACKAGE__->make_sorted( - ONLY => [ qw(list) ], - - package_name => t8('Package name'), - type => t8('Execution type'), - active => t8('Active'), - cron_spec => t8('Execution schedule'), - last_run_at => t8('Last run at'), - next_run_at => t8('Next run at'), -); # # actions @@ -43,15 +27,18 @@ __PACKAGE__->make_sorted( sub action_list { my ($self) = @_; + $self->setup_list_action_bar; $self->render('background_job/list', title => $::locale->text('Background jobs'), - BACKGROUND_JOBS => $self->get_models); + BACKGROUND_JOBS => $self->models->get, + MODELS => $self->models); } sub action_new { my ($self) = @_; - $self->background_job(SL::DB::BackgroundJob->new(cron_spec => '* * * * *', package_name => 'Test')); + $self->background_job(SL::DB::BackgroundJob->new(cron_spec => '* * * * *', package_name => 'Test')) unless $self->background_job; + $self->setup_form_action_bar; $self->render('background_job/form', title => $::locale->text('Create a new background job'), JOB_CLASSES => [ SL::BackgroundJob::Base->get_known_job_classes ]); @@ -60,11 +47,30 @@ sub action_new { sub action_edit { my ($self) = @_; + $self->setup_form_action_bar; $self->render('background_job/form', title => $::locale->text('Edit background job'), JOB_CLASSES => [ SL::BackgroundJob::Base->get_known_job_classes ]); } +sub action_edit_as_new { + my ($self) = @_; + + delete $::form->{background_job}->{id}; + $self->background_job(SL::DB::BackgroundJob->new(%{ $::form->{background_job} })); + $self->action_new; +} + +sub action_show { + my ($self) = @_; + + if ($::request->type eq 'json') { + $self->render(\ SL::JSON::to_json($self->background_job->as_tree), { type => 'json' }); + } else { + $self->action_edit; + } +} + sub action_create { my ($self) = @_; @@ -92,6 +98,7 @@ sub action_destroy { sub action_save_and_execute { my ($self) = @_; + $self->background_job(SL::DB::BackgroundJob->new) if !$self->background_job; return unless $self->create_or_update; $self->action_execute; } @@ -112,6 +119,33 @@ sub action_execute { back_to => $self->url_for(action => 'edit', id => $self->background_job->id)); } +sub action_execute_class { + my ($self) = @_; + + my $result; + + my $ok = eval { + die "no class name given in parameter 'class'" if !$::form->{class} || ($::form->{class} =~ m{[^a-z0-9]}i); + die "invalid class" if ! -f "SL/BackgroundJob/" . $::form->{class} . ".pm"; + + my $package = "SL::BackgroundJob::" . $::form->{class}; + + eval "require $package" or die $@; + my $job = SL::DB::BackgroundJob->new(data => $::form->{data}); + $job->data(decode_json($::form->{json_data})) if $::form->{json_data}; + $result = $package->new->run($job); + + 1; + }; + + my $reply = { + status => $ok ? 'succeeded' : 'failed', + result => $ok ? $result : $@, + }; + + $self->render(\to_json($reply), { type => 'json' }); +} + # # filters # @@ -149,9 +183,8 @@ sub create_or_update { $self->redirect_to($self->back_to); } -sub load_background_job { - my ($self) = @_; - $self->background_job(SL::DB::BackgroundJob->new(id => $::form->{id})->load); +sub init_background_job { + return $::form->{id} ? SL::DB::BackgroundJob->new(id => $::form->{id})->load : undef; } sub init_task_server { @@ -168,4 +201,89 @@ sub init_back_to { return $::form->{back_to} || $self->url_for(action => 'list'); } +sub init_models { + SL::Controller::Helper::GetModels->new( + controller => $_[0], + filtered => 0, + sorted => { + package_name => t8('Package name'), + type => t8('Execution type'), + active => t8('Active'), + cron_spec => t8('Execution schedule'), + last_run_at => t8('Last run at'), + next_run_at => t8('Next run at'), + }, + query => [ + package_name => [ SL::BackgroundJob::Base->get_known_job_classes ], + ], + ); +} + +sub setup_list_action_bar { + my ($self) = @_; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + link => [ + t8('Add'), + link => $self->url_for(action => 'new'), + accesskey => 'enter', + ], + link => [ + t8('Server control'), + link => $self->url_for(controller => 'TaskServer', action => 'show'), + ], + link => [ + t8('Job history'), + link => $self->url_for(controller => 'BackgroundJobHistory', action => 'list'), + ], + ); + } +} + +sub setup_form_action_bar { + my ($self) = @_; + + my $is_new = !$self->background_job->id; + + for my $bar ($::request->layout->get('actionbar')) { + $bar->add( + combobox => [ + action => [ + t8('Save'), + submit => [ '#form', { action => 'BackgroundJob/' . ($is_new ? 'create' : 'update') } ], + accesskey => 'enter', + ], + action => [ + t8('Save and execute'), + submit => [ '#form', { action => 'BackgroundJob/save_and_execute' } ], + ], + action => [ + t8('Use as new'), + submit => [ '#form', { action => 'BackgroundJob/edit_as_new' } ], + disabled => $is_new ? t8('The object has not been saved yet.') : undef, + ], + ], # end of combobox "Save" + + action => [ + t8('Delete'), + submit => [ '#form', { action => 'BackgroundJob/destroy' } ], + confirm => t8('Do you really want to delete this object?'), + disabled => $is_new ? t8('This object has not been saved yet.') : undef, + ], + + link => [ + t8('Abort'), + link => $self->url_for(action => 'list'), + ], + + link => [ + t8('Job history'), + link => $self->url_for(controller => 'BackgroundJobHistory', action => 'list', 'filter.package_name:substr::ilike' => $self->background_job->package_name), + disabled => $is_new ? t8('This object has not been saved yet.') : undef, + ], + ); + } +} + 1;