aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/Open311.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/Open311.pm')
-rw-r--r--perllib/Open311.pm104
1 files changed, 92 insertions, 12 deletions
diff --git a/perllib/Open311.pm b/perllib/Open311.pm
index 90b593256..a91de0a7c 100644
--- a/perllib/Open311.pm
+++ b/perllib/Open311.pm
@@ -31,6 +31,8 @@ has extended_description => ( is => 'ro', isa => Str, default => 1 );
has use_service_as_deviceid => ( is => 'ro', isa => Bool, default => 0 );
has use_extended_updates => ( is => 'ro', isa => Bool, default => 0 );
has extended_statuses => ( is => 'ro', isa => Bool, default => 0 );
+has always_send_email => ( is => 'ro', isa => Bool, default => 0 );
+has multi_photos => ( is => 'ro', isa => Bool, default => 0 );
before [
qw/get_service_list get_service_meta_info get_service_requests get_service_request_updates
@@ -124,18 +126,24 @@ sub _populate_service_request_params {
$description = $problem->detail;
}
- my ( $firstname, $lastname ) = ( $problem->name =~ /(\w+)\.?\s+(.+)/ );
+ my ( $firstname, $lastname ) = $self->split_name( $problem->name );
my $params = {
description => $description,
service_code => $service_code,
first_name => $firstname,
- last_name => $lastname || '',
+ last_name => $lastname,
};
$params->{phone} = $problem->user->phone if $problem->user->phone;
$params->{email} = $problem->user->email if $problem->user->email;
+ # Some endpoints don't follow the Open311 spec correctly and require an
+ # email address for service requests.
+ if ($self->always_send_email && !$params->{email}) {
+ $params->{email} = FixMyStreet->config('DO_NOT_REPLY_EMAIL');
+ }
+
# if you click nearby reports > skip map then it's possible
# to end up with used_map = f and nothing in postcode
if ( $problem->used_map || $self->always_send_latlong
@@ -156,7 +164,11 @@ sub _populate_service_request_params {
}
if ( $extra->{image_url} ) {
- $params->{media_url} = $extra->{image_url};
+ if ( $self->multi_photos ) {
+ $params->{media_url} = $extra->{all_image_urls};
+ } else {
+ $params->{media_url} = $extra->{image_url};
+ }
}
if ( $self->use_service_as_deviceid && $problem->service ) {
@@ -206,14 +218,20 @@ sub _generate_service_request_description {
sub get_service_requests {
my $self = shift;
- my $report_ids = shift;
+ my $args = shift;
my $params = {};
- if ( $report_ids ) {
- $params->{service_request_id} = join ',', @$report_ids;
+ if ( $args->{report_ids} ) {
+ $params->{service_request_id} = join ',', @{$args->{report_ids}};
+ delete $args->{report_ids};
}
+ $params = {
+ %$params,
+ %$args
+ };
+
my $service_request_xml = $self->_get( $self->endpoints->{requests}, $params || undef );
return $self->_get_xml_object( $service_request_xml );
}
@@ -239,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 ) {
@@ -284,12 +302,43 @@ sub post_service_request_update {
return 0;
}
+sub add_media {
+ my ($self, $url, $object) = @_;
+
+ my $ua = LWP::UserAgent->new;
+ my $res = $ua->get($url);
+ if ( $res->is_success && $res->content_type eq 'image/jpeg' ) {
+ my $photoset = FixMyStreet::App::Model::PhotoSet->new({
+ data_items => [ $res->decoded_content ],
+ });
+ $object->photo($photoset->data);
+ }
+}
+
+sub map_state {
+ my $self = shift;
+ my $incoming_state = shift;
+
+ $incoming_state = lc($incoming_state);
+ $incoming_state =~ s/_/ /g;
+
+ my %state_map = (
+ fixed => 'fixed - council',
+ 'not councils responsibility' => 'not responsible',
+ 'no further action' => 'unable to fix',
+ open => 'confirmed',
+ closed => 'fixed - council',
+ );
+
+ return $state_map{$incoming_state} || $incoming_state;
+}
+
sub _populate_service_request_update_params {
my $self = shift;
my $comment = shift;
my $name = $comment->name || $comment->user->name;
- my ( $firstname, $lastname ) = ( $name =~ /(\w+)\.?\s+(.+)/ );
+ my ( $firstname, $lastname ) = $self->split_name( $name );
$lastname ||= '-';
# fall back to problem state as it's probably correct
@@ -348,7 +397,8 @@ sub _populate_service_request_update_params {
$params->{media_url} = $url;
}
- if ( $comment->extra ) {
+ # The following will only set by UK in Bromley/Bromley cobrands
+ if ( $comment->extra && $comment->extra->{title} ) {
$params->{'email_alerts_requested'}
= $comment->extra->{email_alerts_requested} ? 'TRUE' : 'FALSE';
$params->{'title'} = $comment->extra->{title};
@@ -360,6 +410,31 @@ sub _populate_service_request_update_params {
return $params;
}
+sub split_name {
+ my ( $self, $name ) = @_;
+
+ return ('', '') unless $name;
+
+ my ( $first, $last ) = ( $name =~ /(\w+)(?:\.?\s+(.+))?/ );
+
+ return ( $first || '', $last || '');
+}
+
+sub _params_to_string {
+ my( $self, $params, $request_string ) = @_;
+
+ my $undefined;
+
+ my $string = join("\n", map {
+ $undefined .= "$_ undefined\n" unless defined $params->{$_};
+ "$_: " . ( $params->{$_} // '' );
+ } keys %$params);
+
+ warn "$request_string $undefined $string" if $undefined;
+
+ return $string;
+}
+
sub _get {
my $self = shift;
my $path = shift;
@@ -370,9 +445,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 .= $self->_params_to_string($params, $debug_request);
+ $self->debug_details( $self->debug_details . $debug_request );
my $content;
if ( $self->test_mode ) {
@@ -414,11 +492,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 .= $self->_params_to_string($params, $debug_request);
+ $self->debug_details( $self->debug_details . $debug_request );
my $ua = LWP::UserAgent->new();
my $res;