From add1a30687d873ab674578b3fb13dff802043611 Mon Sep 17 00:00:00 2001 From: erickson Date: Mon, 9 Nov 2009 01:07:19 +0000 Subject: [PATCH] Back-porting: support for min-passive-delay-age validation more detailed error logging fix to max_delay between filter no longer validate batch passive events during the grouping phase git-svn-id: svn://svn.open-ils.org/ILS/branches/rel_1_6@14827 dcc99617-32d9-48b4-a31d-7c20da2025e4 --- .../src/perlmods/OpenILS/Application/Trigger.pm | 92 ++++++++++++++-------- .../perlmods/OpenILS/Application/Trigger/Event.pm | 8 +- .../OpenILS/Application/Trigger/EventGroup.pm | 6 +- .../OpenILS/Application/Trigger/Validator.pm | 26 +++--- 4 files changed, 81 insertions(+), 51 deletions(-) diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm index 81fe005619..bdf9eec794 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger.pm @@ -391,8 +391,8 @@ sub create_batch_events { my @times = sort {$a <=> $b} interval_to_seconds($def->delay), interval_to_seconds($def->max_delay); $filter->{ $def->delay_field } = { 'between' => [ - DateTime->now->subtract( seconds => $times[0] )->strftime( '%F %T%z' ), - DateTime->now->subtract( seconds => $times[1] )->strftime( '%F %T%z' ) + DateTime->now->subtract( seconds => $times[1] )->strftime( '%F %T%z' ), + DateTime->now->subtract( seconds => $times[0] )->strftime( '%F %T%z' ) ] }; } else { @@ -460,7 +460,6 @@ __PACKAGE__->register_method( argc => 2 ); - sub fire_single_event { my $self = shift; my $client = shift; @@ -469,6 +468,7 @@ sub fire_single_event { my $e = OpenILS::Application::Trigger::Event->new($event_id); if ($e->validate->valid) { + $logger->info("Event is valid, reacting..."); $e->react->cleanup; } @@ -496,6 +496,7 @@ sub fire_event_group { my $e = OpenILS::Application::Trigger::EventGroup->new(@$events); if ($e->validate->valid) { + $logger->info("Event group is valid, reacting..."); $e->react->cleanup; } @@ -532,7 +533,6 @@ __PACKAGE__->register_method( api_level=> 1 ); - sub grouped_events { my $self = shift; my $client = shift; @@ -542,29 +542,47 @@ sub grouped_events { my %groups = ( '*' => [] ); for my $e_id ( @$events ) { - my $e = OpenILS::Application::Trigger::Event->new($e_id); - if ($e->validate->valid) { - if (my $group = $e->event->event_def->group_field) { + $logger->info("trigger: processing event $e_id"); - # split the grouping link steps - my @steps = split /\./, $group; + # let the client know we're still chugging along TODO add osrf support for method_lookup $client's + $client->status( new OpenSRF::DomainObject::oilsContinueStatus ); - # find the grouping object - my $node = $e->target; - $node = $node->$_() for ( @steps ); + my $e; + try { + $e = OpenILS::Application::Trigger::Event->new($e_id); + } catch Error with { + $logger->error("Event creation failed with ".shift()); + }; - # get the pkey value for the grouping object on this event - my $node_ident = $node->Identity; - my $ident_value = $node->$node_ident(); + next unless $e; - # push this event onto the event+grouping_pkey_value stack - $groups{$e->event->event_def->id}{$ident_value} ||= []; - push @{ $groups{$e->event->event_def->id}{$ident_value} }, $e; - } else { - # it's a non-grouped event - push @{ $groups{'*'} }, $e; - } + try { + $e->build_environment; + } catch Error with { + $logger->error("Event environment building failed with ".shift()); + }; + + if (my $group = $e->event->event_def->group_field) { + + # split the grouping link steps + my @steps = split /\./, $group; + + # find the grouping object + my $node = $e->target; + $node = $node->$_() for ( @steps ); + + # get the pkey value for the grouping object on this event + my $node_ident = $node->Identity; + my $ident_value = $node->$node_ident(); + + # push this event onto the event+grouping_pkey_value stack + $groups{$e->event->event_def->id}{$ident_value} ||= []; + push @{ $groups{$e->event->event_def->id}{$ident_value} }, $e; + } else { + # it's a non-grouped event + push @{ $groups{'*'} }, $e; } + $e->editor->disconnect; } @@ -582,23 +600,31 @@ sub run_all_events { my ($groups) = $self->method_lookup('open-ils.trigger.event.find_pending_by_group')->run(); - for my $def ( %$groups ) { + for my $def ( keys %$groups ) { if ($def eq '*') { for my $event ( @{ $$groups{'*'} } ) { - $client->respond( - $self - ->method_lookup('open-ils.trigger.event.fire') - ->run($event) - ); + try { + $client->respond( + $self + ->method_lookup('open-ils.trigger.event.fire') + ->run($event) + ); + } catch Error with { + $logger->error("event firing failed with ".shift()); + }; } } else { my $defgroup = $$groups{$def}; for my $ident ( keys %$defgroup ) { - $client->respond( - $self - ->method_lookup('open-ils.trigger.event_group.fire') - ->run($$defgroup{$ident}) - ); + try { + $client->respond( + $self + ->method_lookup('open-ils.trigger.event_group.fire') + ->run($$defgroup{$ident}) + ); + } catch Error with { + $logger->error("event firing failed with ".shift()); + }; } } } diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm index 0d696277f5..2f17d2554d 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Event.pm @@ -2,7 +2,7 @@ package OpenILS::Application::Trigger::Event; use strict; use warnings; use OpenSRF::EX qw/:try/; -use OpenSRF::Utils::Logger qw/:logger/; +use OpenSRF::Utils::Logger qw/$logger/; use OpenILS::Utils::Fieldmapper; use OpenILS::Utils::CStoreEditor q/:funcs/; @@ -113,7 +113,7 @@ sub cleanup { $self->cleanedup(1); } } otherwise { - $log->error( shift() ); + $log->error("Event cleanup failed with ". shift() ); $self->update_state( 'error' ) || die 'Unable to update event state'; }; @@ -148,7 +148,7 @@ sub react { ->final_result ); } otherwise { - $log->error( shift() ); + $log->error("Event reacting failed with ". shift() ); $self->update_state( 'error' ) || die 'Unable to update event state'; }; @@ -179,7 +179,7 @@ sub validate { ->final_result ); } otherwise { - $log->error( shift() ); + $log->error("Event validation failed with ". shift() ); $self->update_state( 'error' ) || die 'Unable to update event state'; }; diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm index 41ce3b98cf..4cd10e1c27 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/EventGroup.pm @@ -4,7 +4,7 @@ use OpenILS::Application::Trigger::Event; use base 'OpenILS::Application::Trigger::Event'; use OpenSRF::EX qw/:try/; -use OpenSRF::Utils::Logger qw/:level/; +use OpenSRF::Utils::Logger qw/$logger/; use OpenILS::Utils::Fieldmapper; use OpenILS::Utils::CStoreEditor q/:funcs/; @@ -56,7 +56,7 @@ sub react { ->final_result ); } otherwise { - $log->error( shift() ); + $log->error("Event reacting failed with ". shift() ); $self->update_state( 'error' ) || die 'Unable to update event group state'; }; @@ -90,7 +90,7 @@ sub validate { $self->{ids} = [ map { $_->id } @valid_events ]; $self->editor->xact_commit; } otherwise { - $log->error( shift() ); + $log->error("Event group validation failed with ". shift() ); $self->editor->xact_rollback; $self->update_state( 'error' ) || die 'Unable to update event group state'; }; diff --git a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator.pm b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator.pm index f0906b8f30..6c94702b4c 100644 --- a/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator.pm +++ b/Open-ILS/src/perlmods/OpenILS/Application/Trigger/Validator.pm @@ -14,27 +14,27 @@ sub CircIsOpen { my $env = shift; return 0 if (defined($env->{target}->checkin_time)); - return 0 if ($env->{params}->{max_delay_age} && !$self->MaxPassiveDelayAge($env)); + + if ($env->{params}->{min_target_age}) { + $env->{params}->{target_age_field} = 'xact_start'; + return 0 if (!$self->MinPassiveTargetAge($env)); + } return 1; } -sub MaxPassiveDelayAge { +sub MinPassiveTargetAge { my $self = shift; my $env = shift; my $target = $env->{target}; - my $delay_field = $env->{event}->event_def->delay_field; + my $delay_field = $env->{params}->{target_age_field} || $env->{event}->event_def->delay_field; my $delay_field_ts = DateTime::Format::ISO8601->new->parse_datetime(clense_ISO8601($target->$delay_field())); - # the cutoff date is the target timestamp + the delay + the max_delay_age - # This is also true for negative delays. For example: - # due_date + "-3 days" + "1 day" == -2 days old. - $delay_field_ts - ->add( seconds => interval_to_seconds( $env->{event}->event_def->delay ) ) - ->add( seconds => interval_to_seconds( $env->{params}->{max_delay_age} ) ); + # to get the minimum time that the target must have aged to, add the min age to the delay field + $delay_field_ts->add( seconds => interval_to_seconds( $env->{params}->{min_target_age} ) ); - return 1 if $delay_field_ts > DateTime->now; + return 1 if $delay_field_ts <= DateTime->now; return 0; } @@ -45,7 +45,11 @@ sub CircIsOverdue { return 0 if $circ->checkin_time; return 0 if $circ->stop_fines and not $circ->stop_fines =~ /MAXFINES|LONGOVERDUE/; - return 0 if ($env->{params}->{max_delay_age} && !$self->MaxPassiveDelayAge($env)); + + if ($env->{params}->{min_target_age}) { + $env->{params}->{target_age_field} = 'xact_start'; + return 0 if (!$self->MinPassiveTargetAge($env)); + } my $due_date = DateTime::Format::ISO8601->new->parse_datetime(clense_ISO8601($circ->due_date)); return 0 if $due_date > DateTime->now; -- 2.11.0