diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/Script/ArchiveOldEnquiries.pm | 17 | ||||
-rw-r--r-- | perllib/Open311.pm | 13 | ||||
-rw-r--r-- | perllib/Open311/GetServiceRequestUpdates.pm | 32 | ||||
-rw-r--r-- | t/app/script/archive_old_enquiries.t | 35 | ||||
-rw-r--r-- | t/open311/getservicerequestupdates.t | 2 |
6 files changed, 79 insertions, 22 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md index 7b8c484f9..563c491db 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -34,6 +34,7 @@ - Set a session timezone in case database server is set differently. - Fix SQL error on update edit admin page in cobrands. #2049 - Improve chart display in old IE versions. #2005 + - Improve handling of Open311 state changes. #2069 - Admin improvements: - Inspectors can set non_public status of reports. #1992 - Default start date is shown on the dashboard. @@ -42,6 +43,7 @@ - Show Open311 service code as tooltip on admin category checkboxes. #2049 - Bulk user import admin page. #2057 - Add link to admin edit page for reports. #2071 + - Nicer Open311 errors. #2078 - Development improvements: - Add HTML email previewer. - Add CORS header to Open311 output. #2022 diff --git a/perllib/FixMyStreet/Script/ArchiveOldEnquiries.pm b/perllib/FixMyStreet/Script/ArchiveOldEnquiries.pm index 31876d83d..03bc511a0 100644 --- a/perllib/FixMyStreet/Script/ArchiveOldEnquiries.pm +++ b/perllib/FixMyStreet/Script/ArchiveOldEnquiries.pm @@ -137,7 +137,7 @@ sub close_problems { my $problems = shift; while (my $problem = $problems->next) { my $timestamp = \'current_timestamp'; - $problem->add_to_comments( { + my $comment = $problem->add_to_comments( { text => '', created => $timestamp, confirmed => $timestamp, @@ -150,5 +150,20 @@ sub close_problems { extra => { is_superuser => 1 }, } ); $problem->update({ state => 'closed', send_questionnaire => 0 }); + + # Stop any alerts being sent out about this closure. + my @alerts = FixMyStreet::DB->resultset('Alert')->search( { + alert_type => 'new_updates', + parameter => $problem->id, + confirmed => 1, + } ); + + for my $alert (@alerts) { + my $alerts_sent = FixMyStreet::DB->resultset('AlertSent')->find_or_create( { + alert_id => $alert->id, + parameter => $comment->id, + } ); + } + } } diff --git a/perllib/Open311.pm b/perllib/Open311.pm index 577de31ea..a65e19fa6 100644 --- a/perllib/Open311.pm +++ b/perllib/Open311.pm @@ -257,7 +257,7 @@ sub get_service_request_updates { my $end_date = shift; my $params = { - api_key => $self->api_key, + api_key => $self->api_key || '', }; if ( $start_date || $end_date ) { @@ -420,9 +420,12 @@ sub _get { $params->{ jurisdiction_id } = $self->jurisdiction if $self->jurisdiction; $uri->path( $uri->path . $path ); + my $base_uri = $uri->clone; $uri->query_form( $params ); - $self->debug_details( $self->debug_details . "\nrequest:" . $uri->as_string ); + my $debug_request = "GET " . $base_uri->as_string . "\n\n"; + $debug_request .= join("\n", map { "$_: $params->{$_}" } keys %$params); + $self->debug_details( $self->debug_details . $debug_request ); my $content; if ( $self->test_mode ) { @@ -464,11 +467,13 @@ sub _post { $params->{jurisdiction_id} = $self->jurisdiction if $self->jurisdiction; - $params->{api_key} = $self->api_key + $params->{api_key} = ($self->api_key || '') if $self->api_key; my $req = POST $uri->as_string, $params; - $self->debug_details( $self->debug_details . "\nrequest:" . $req->as_string ); + my $debug_request = $req->method . ' ' . $uri->as_string . "\n\n"; + $debug_request .= join("\n", map { "$_: $params->{$_}" } keys %$params); + $self->debug_details( $self->debug_details . $debug_request ); my $ua = LWP::UserAgent->new(); my $res; diff --git a/perllib/Open311/GetServiceRequestUpdates.pm b/perllib/Open311/GetServiceRequestUpdates.pm index cee1a629f..b3b165d27 100644 --- a/perllib/Open311/GetServiceRequestUpdates.pm +++ b/perllib/Open311/GetServiceRequestUpdates.pm @@ -138,22 +138,22 @@ sub update_comments { $open311->add_media($request->{media_url}, $comment) if $request->{media_url}; - # if the comment is older than the last update - # do not change the status of the problem as it's - # tricky to determine the right thing to do. - # Allow the same time in case report/update created at same time (in external system) - if ( $comment->created >= $p->lastupdate ) { - # don't update state unless it's an allowed state and it's - # actually changing the state of the problem - if ( FixMyStreet::DB::Result::Problem->visible_states()->{$state} && $p->state ne $state && - # For Oxfordshire, don't allow changes back to Open from other open states - !( $body->areas->{$AREA_ID_OXFORDSHIRE} && $state eq 'confirmed' && $p->is_open ) && - # Don't let it change between the (same in the front end) fixed states - !( $p->is_fixed && FixMyStreet::DB::Result::Problem->fixed_states()->{$state} ) ) { - if ($p->is_visible) { - $p->state($state); - } - $comment->problem_state($state); + # don't update state unless it's an allowed state + if ( FixMyStreet::DB::Result::Problem->visible_states()->{$state} && + # For Oxfordshire, don't allow changes back to Open from other open states + !( $body->areas->{$AREA_ID_OXFORDSHIRE} && $state eq 'confirmed' && $p->is_open ) && + # Don't let it change between the (same in the front end) fixed states + !( $p->is_fixed && FixMyStreet::DB::Result::Problem->fixed_states()->{$state} ) ) { + + $comment->problem_state($state); + + # if the comment is older than the last update do not + # change the status of the problem as it's tricky to + # determine the right thing to do. Allow the same time in + # case report/update created at same time (in external + # system). Only do this if the report is currently visible. + if ( $comment->created >= $p->lastupdate && $p->state ne $state && $p->is_visible ) { + $p->state($state); } } diff --git a/t/app/script/archive_old_enquiries.t b/t/app/script/archive_old_enquiries.t index 0475cb9ea..9774d3fc3 100644 --- a/t/app/script/archive_old_enquiries.t +++ b/t/app/script/archive_old_enquiries.t @@ -75,6 +75,41 @@ subtest 'sets reports to the correct status' => sub { }; }; +subtest 'marks alerts as sent' => sub { + FixMyStreet::override_config { + ALLOWED_COBRANDS => [ 'oxfordshire' ], + }, sub { + my ($report) = $mech->create_problems_for_body(1, $oxfordshire->id, 'Test', { + areas => ',2237,', + lastupdate => '2015-12-01 07:00:00', + user_id => $user->id, + }); + my $alert = FixMyStreet::DB->resultset('Alert')->find_or_create( + { + user => $user, + parameter => $report->id, + alert_type => 'new_updates', + whensubscribed => '2015-12-01 07:00:00', + confirmed => 1, + cobrand => 'default', + } + ); + is $alert->alerts_sent->count, 0, 'Nothing has been sent for this alert'; + + FixMyStreet::Script::ArchiveOldEnquiries::archive($opts); + + $report->discard_changes; + + is $report->state, 'closed', 'Report has been set to closed'; + + is $alert->alerts_sent->count, 1, 'Alert marked as sent for this report'; + + my $alert_sent = $alert->alerts_sent->first; + my $comment = $report->comments->first; + is $alert_sent->parameter, $comment->id, 'AlertSent created for new comment'; + }; +}; + subtest 'sends emails to a user' => sub { FixMyStreet::override_config { ALLOWED_COBRANDS => [ 'oxfordshire' ], diff --git a/t/open311/getservicerequestupdates.t b/t/open311/getservicerequestupdates.t index ec2ffb593..cc319cbdc 100644 --- a/t/open311/getservicerequestupdates.t +++ b/t/open311/getservicerequestupdates.t @@ -150,7 +150,7 @@ for my $test ( comment_status => 'OPEN', mark_fixed=> 0, mark_open => 0, - problem_state => undef, + problem_state => 'confirmed', end_state => 'confirmed', }, { |