diff options
author | Matthew Somerville <matthew@mysociety.org> | 2014-03-11 17:34:38 +0000 |
---|---|---|
committer | Matthew Somerville <matthew@mysociety.org> | 2014-03-11 17:34:38 +0000 |
commit | 4df8d9979a4325bf2b47f401b4095654dd43d3a9 (patch) | |
tree | 64984c71916683830a1b1eef4deee8a04307cd80 /perllib/Open311 | |
parent | eee9a69a1959f060fdbe7d346d594a76a3b39909 (diff) | |
parent | de47a7fad977156c67748deed6b3f154fc849035 (diff) |
Merge remote branch 'origin/sweden-rebase'
Conflicts:
bin/update-schema
locale/sv_SE.UTF-8/LC_MESSAGES/FixMyStreet.po
perllib/FixMyStreet/DB/Result/Body.pm
Diffstat (limited to 'perllib/Open311')
-rw-r--r-- | perllib/Open311/GetUpdates.pm | 84 |
1 files changed, 84 insertions, 0 deletions
diff --git a/perllib/Open311/GetUpdates.pm b/perllib/Open311/GetUpdates.pm new file mode 100644 index 000000000..db5d8ef35 --- /dev/null +++ b/perllib/Open311/GetUpdates.pm @@ -0,0 +1,84 @@ +package Open311::GetUpdates; + +use Moose; +use Open311; +use FixMyStreet::App; + +has council_list => ( is => 'ro' ); +has system_user => ( is => 'ro' ); + +sub get_updates { + my $self = shift; + + while ( my $council = $self->council_list->next ) { + my $open311 = Open311->new( + endpoint => $council->endpoint, + jurisdiction => $council->jurisdiction, + api_key => $council->api_key + ); + + my $area_id = $council->area_id; + + my $council_details = mySociety::MaPit::call( 'area', $area_id ); + + my $reports = FixMyStreet::App->model('DB::Problem')->search( + { + council => { like => "\%$area_id\%" }, + state => { 'IN', [qw/confirmed fixed/] }, + -and => [ + external_id => { '!=', undef }, + external_id => { '!=', '' }, + ], + } + ); + + my @report_ids = (); + while ( my $report = $reports->next ) { + push @report_ids, $report->external_id; + } + + next unless @report_ids; + + $self->update_reports( \@report_ids, $open311, $council_details ); + } +} + +sub update_reports { + my ( $self, $report_ids, $open311, $council_details ) = @_; + + my $service_requests = $open311->get_service_requests( $report_ids ); + + my $requests; + + # XML::Simple is a bit inconsistent in how it structures + # things depending on the number of children an element has :( + if ( ref $service_requests->{request} eq 'ARRAY' ) { + $requests = $service_requests->{request}; + } + else { + $requests = [ $service_requests->{request} ]; + } + + for my $request (@$requests) { + # if it's a ref that means it's an empty element + # however, if there's no updated date then we can't + # tell if it's newer that what we have so we should skip it + next if ref $request->{updated_datetime} || ! exists $request->{updated_datetime}; + + my $request_id = $request->{service_request_id}; + + my $problem = + FixMyStreet::App->model('DB::Problem') + ->search( { external_id => $request_id, } ); + + if (my $p = $problem->first) { + my $cobrand = FixMyStreet::Cobrand->get_class_for_moniker($p->cobrand)->new(); + $cobrand->set_lang_and_domain($p->lang, 1); + $p->update_from_open311_service_request( $request, $council_details, $self->system_user ); + } + } + + return 1; +} + +1; |