aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Open311/GetUpdates.pm
diff options
context:
space:
mode:
authorJon Kristensen <info@jonkri.com>2014-02-01 12:13:32 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2014-03-11 16:54:08 +0000
commit82cc874848f8d0a184a7f624a6212d3a568efa6d (patch)
tree65116841348320527b94f877834ca68389238169 /perllib/Open311/GetUpdates.pm
parent968ec2ef16b0be28d3ade38264dc57d253e73663 (diff)
Bring back open311-update-reports, GetUpdates.pm and getupdates.t
This commit reverses the "Remove unused Open311 GetUpdates code." commit. FixaMinGata, the Swedish FixMyStreet cobrand, is still using open311-update-reports.
Diffstat (limited to 'perllib/Open311/GetUpdates.pm')
-rw-r--r--perllib/Open311/GetUpdates.pm82
1 files changed, 82 insertions, 0 deletions
diff --git a/perllib/Open311/GetUpdates.pm b/perllib/Open311/GetUpdates.pm
new file mode 100644
index 000000000..5d5291d47
--- /dev/null
+++ b/perllib/Open311/GetUpdates.pm
@@ -0,0 +1,82 @@
+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) {
+ $p->update_from_open311_service_request( $request, $council_details, $self->system_user );
+ }
+ }
+
+ return 1;
+}
+
+1;