Fetching contributors…
Cannot retrieve contributors at this time
executable file 113 lines (91 sloc) 3.14 KB
#!/usr/bin/env perl
# send-reports:
# Send new problem reports to councils
#
# Copyright (c) 2011 UK Citizens Online Democracy. All rights reserved.
# Email: matthew@mysociety.org. WWW: http://www.mysociety.org
use strict;
use warnings;
require 5.8.0;
use Digest::MD5;
use Encode;
use Error qw(:try);
use CronFns;
use FixMyStreet::App;
use Utils;
use mySociety::Config;
use mySociety::EmailUtil;
use Open311;
# maximum number of webservice attempts to send before not trying any more (XXX may be better in config?)
use constant SEND_FAIL_RETRIES_CUTOFF => 3;
# send_method config values found in by-area config data, for selecting to appropriate method
use constant SEND_METHOD_EMAIL => 'email';
use constant SEND_METHOD_OPEN311 => 'Open311';
# Set up site, language etc.
my ($verbose, $nomail) = CronFns::options();
my $base_url = mySociety::Config::get('BASE_URL');
my $site = CronFns::site($base_url);
my $councils = FixMyStreet::App->model('DB::Open311Conf')->search( {
send_method => SEND_METHOD_OPEN311,
send_comments => 1,
} );
while ( my $council = $councils->next ) {
my $comments = FixMyStreet::App->model('DB::Comment')->search( {
'me.whensent' => undef,
'me.external_id' => undef,
'me.state' => 'confirmed',
'me.confirmed' => { '!=' => undef },
'problem.whensent' => { '!=' => undef },
'problem.external_id' => { '!=' => undef },
'problem.council' => { -like => '%' . $council->area_id .'%' },
'problem.send_method_used' => 'Open311',
},
{
join => 'problem',
}
);
my $o = Open311->new(
endpoint => $council->endpoint,
jurisdiction => $council->jurisdiction,
api_key => $council->api_key,
);
while ( my $comment = $comments->next ) {
my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($comment->cobrand)->new();
if ( $comment->send_fail_count ) {
next if bromley_retry_timeout( $comment );
}
if ( $council->area_id == 2482 ) {
my $extra = $comment->extra;
if ( !$extra ) {
$extra = {};
}
unless ( $extra->{title} ) {
$extra->{title} = $comment->user->title;
$comment->extra( $extra );
}
}
my $id = $o->post_service_request_update( $comment );
if ( $id ) {
$comment->update( {
external_id => $id,
whensent => \'ms_current_timestamp()',
} );
} else {
$comment->update( {
send_fail_count => $comment->send_fail_count + 1,
send_fail_timestamp => \'ms_current_timestamp()',
send_fail_reason => 'Failed to post over Open311',
} );
}
}
}
sub bromley_retry_timeout {
my $row = shift;
my $tz = DateTime::TimeZone->new( name => 'local' );
my $now = DateTime->now( time_zone => $tz );
my $diff = $now - $row->send_fail_timestamp;
if ( $diff->in_units( 'minutes' ) < 30 ) {
return 1;
}
return 0;
}