diff options
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin/Bodies.pm | 6 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Reports.pm | 3 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/Zurich.pm | 72 | ||||
-rw-r--r-- | perllib/FixMyStreet/Geocode/Zurich.pm | 30 | ||||
-rw-r--r-- | perllib/FixMyStreet/SendReport/Email.pm | 13 | ||||
-rw-r--r-- | perllib/FixMyStreet/TestMech.pm | 11 |
6 files changed, 117 insertions, 18 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm index 67177fcbd..8ca6bbc22 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Bodies.pm @@ -380,9 +380,13 @@ sub body_params : Private { ); my %params = map { $_ => $c->get_param($_) || $defaults{$_} } keys %defaults; $c->forward('check_body_params', [ \%params ]); + my @extras = qw/fetch_all_problems/; + my $cobrand_extras = $c->cobrand->call_hook('body_extra_fields'); + push @extras, @$cobrand_extras if $cobrand_extras; + %defaults = map { $_ => '' } @extras; - my %extras = map { $_ => $c->get_param($_) || $defaults{$_} } @extras; + my %extras = map { $_ => $c->get_param("extra[$_]") || $defaults{$_} } @extras; return { params => \%params, extras => \%extras }; } diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm index 8e167a70d..741cbb60f 100644 --- a/perllib/FixMyStreet/App/Controller/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Reports.pm @@ -705,8 +705,9 @@ sub stash_report_filter_status : Private { my @status = $c->get_param_list('status', 1); @status = ($c->stash->{page} eq 'my' ? 'all' : $c->cobrand->on_map_default_status) unless @status; - my %status = map { $_ => 1 } @status; + $c->cobrand->call_hook(hook_report_filter_status => \@status); + my %status = map { $_ => 1 } @status; my %filter_problem_states; my %filter_status; diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm index 5fea9a03f..9cf1030f0 100644 --- a/perllib/FixMyStreet/Cobrand/Zurich.pm +++ b/perllib/FixMyStreet/Cobrand/Zurich.pm @@ -9,6 +9,8 @@ use Scalar::Util 'blessed'; use DateTime::Format::Pg; use Try::Tiny; +use FixMyStreet::Geocode::Zurich; + use strict; use warnings; use utf8; @@ -141,7 +143,7 @@ sub problem_as_hashref { $hashref->{title} = _('This report is awaiting moderation.'); $hashref->{banner_id} = 'closed'; } else { - if ( $problem->state eq 'confirmed' || $problem->state eq 'external' ) { + if ( $problem->state eq 'confirmed' ) { $hashref->{banner_id} = 'closed'; } elsif ( $problem->is_fixed || $problem->is_closed ) { $hashref->{banner_id} = 'fixed'; @@ -152,7 +154,7 @@ sub problem_as_hashref { if ( $problem->state eq 'confirmed' ) { $hashref->{state} = 'open'; $hashref->{state_t} = _('Open'); - } elsif ( $problem->state eq 'wish' ) { + } elsif ( $problem->state eq 'wish' || $problem->state eq 'external' ) { $hashref->{state_t} = _('Closed'); } elsif ( $problem->is_fixed ) { $hashref->{state} = 'closed'; @@ -329,6 +331,14 @@ sub report_page_data { $c->detach('ajax', [ 'reports/_problem-list.html' ]); } + my @categories = $c->model('DB::Contact')->not_deleted->search(undef, { + columns => [ 'category', 'extra' ], + order_by => [ 'category' ], + distinct => 1 + })->all; + $c->stash->{filter_categories} = \@categories; + $c->stash->{filter_category} = { map { $_ => 1 } $c->get_param_list('filter_category', 1) }; + my $pins = $c->stash->{pins}; FixMyStreet::Map::display_map( $c, @@ -522,12 +532,16 @@ sub admin { } sub category_options { - my ($self, $c) = @_; + my $self = shift; + my $c = $self->{c}; my @categories = $c->model('DB::Contact')->not_deleted->all; - $c->stash->{category_options} = [ map { { - category => $_->category, category_display => $_->category, + @categories = map { { + category => $_->category, + category_display => $_->get_extra_metadata('admin_label') || $_->category, abbreviation => $_->get_extra_metadata('abbreviation'), - } } @categories ]; + } } @categories; + @categories = sort { $a->{category_display} cmp $b->{category_display} } @categories; + $c->stash->{category_options} = \@categories; } sub admin_report_edit { @@ -553,21 +567,39 @@ sub admin_report_edit { $c->stash->{bodies} = \@bodies; # Can change category to any other - $self->category_options($c); + $self->category_options; } elsif ($type eq 'dm') { # Can assign to: my @bodies = $c->model('DB::Body')->search( [ - { 'me.parent' => $body->parent->id }, # Other DMs on the same level { 'me.parent' => $body->id }, # Their subdivisions { 'me.parent' => undef, 'bodies.id' => undef }, # External bodies - ], { join => 'bodies', distinct => 1 } ); - @bodies = sort { strcoll($a->name, $b->name) } @bodies; + ], { join => 'bodies', distinct => 1 } )->all; + @bodies = grep { + my $cat = $_->get_extra_metadata('category'); + if ($cat) { + $cat = $c->model('DB::Contact')->not_deleted->search({ category => $cat })->first; + } + !$cat || $cat->body_id == $body->id; + } @bodies; + @bodies = sort { + my $a_cat = $a->get_extra_metadata('category'); + my $b_cat = $b->get_extra_metadata('category'); + if ($a_cat && $b_cat) { + strcoll($a->name, $b->name) + } elsif ($a_cat) { + -1; + } elsif ($b_cat) { + 1; + } else { + strcoll($a->name, $b->name) + } + } @bodies; $c->stash->{bodies} = \@bodies; # Can change category to any other - $self->category_options($c); + $self->category_options; } @@ -927,6 +959,11 @@ sub admin_report_edit { } +sub admin_district_lookup { + my ($self, $row) = @_; + FixMyStreet::Geocode::Zurich::admin_district($row->local_coords); +} + sub stash_states { my ($self, $problem) = @_; my $c = $self->{c}; @@ -1135,7 +1172,7 @@ sub admin_stats { } # Can change category to any other - $self->category_options($c); + $self->category_options; # Total reports (non-hidden) my $total = $c->model('DB::Problem')->search( \%params )->count; @@ -1305,7 +1342,9 @@ sub reports_per_page { return 20; } sub singleton_bodies_str { 1 } -sub contact_extra_fields { [ 'abbreviation' ] }; +sub body_extra_fields { [ 'category' ] }; + +sub contact_extra_fields { [ 'abbreviation', 'admin_label' ] }; sub default_problem_state { 'submitted' } @@ -1343,4 +1382,11 @@ sub db_state_migration { } } +sub hook_report_filter_status { + my ($self, $status) = @_; + @$status = map { + $_ eq 'closed' ? ('closed', 'fixed') : $_ + } @$status; +} + 1; diff --git a/perllib/FixMyStreet/Geocode/Zurich.pm b/perllib/FixMyStreet/Geocode/Zurich.pm index 38df431c9..0b85ab7b2 100644 --- a/perllib/FixMyStreet/Geocode/Zurich.pm +++ b/perllib/FixMyStreet/Geocode/Zurich.pm @@ -24,6 +24,8 @@ sub setup_soap { # Variables for the SOAP web service my $geocoder = FixMyStreet->config('GEOCODER'); + return unless ref $geocoder eq 'HASH'; + my $url = $geocoder->{url}; my $username = $geocoder->{username}; my $password = $geocoder->{password}; @@ -49,6 +51,34 @@ sub setup_soap { $method = SOAP::Data->name('getLocation95')->attr({ xmlns => $attr }); } +sub admin_district { + my ($e, $n) = @_; + + setup_soap(); + return unless $soap; + + my $attr = 'http://ch/geoz/fixmyzuerich/service'; + my $bo = 'http://ch/geoz/fixmyzuerich/bo'; + my $method = SOAP::Data->name('getInfoByLocation')->attr({ xmlns => $attr }); + my $location = SOAP::Data->name( + 'location' => \SOAP::Data->value( + SOAP::Data->name('bo:easting', $e), + SOAP::Data->name('bo:northing', $n), + ) + )->attr({ 'xmlns:bo' => $bo }); + my $search = SOAP::Data->value($location); + my $result; + eval { + $result = $soap->call($method, $security, $search); + }; + if ($@) { + warn $@ if FixMyStreet->config('STAGING_SITE'); + return 'The geocoder appears to be down.'; + } + $result = $result->result; + return $result; +} + # string STRING CONTEXT # Looks up on Zurich web service a user-inputted location. # Returns array of (LAT, LON, ERROR), where ERROR is either undef, a string, or diff --git a/perllib/FixMyStreet/SendReport/Email.pm b/perllib/FixMyStreet/SendReport/Email.pm index 6cd9afccd..09847cf5f 100644 --- a/perllib/FixMyStreet/SendReport/Email.pm +++ b/perllib/FixMyStreet/SendReport/Email.pm @@ -53,6 +53,15 @@ sub send_from { return [ $row->user->email, $row->name ]; } +sub envelope_sender { + my ($self, $row) = @_; + + if ($row->user->email && $row->user->email_verified) { + return FixMyStreet::Email::unique_verp_id('report', $row->id); + } + return FixMyStreet->config('DO_NOT_REPLY_EMAIL'); +} + sub send { my $self = shift; my ( $row, $h ) = @_; @@ -82,12 +91,10 @@ sub send { $params->{Bcc} = $self->bcc if @{$self->bcc}; - my $sender; + my $sender = $self->envelope_sender($row); if ($row->user->email && $row->user->email_verified) { - $sender = FixMyStreet::Email::unique_verp_id('report', $row->id); $params->{From} = $self->send_from( $row ); } else { - $sender = FixMyStreet->config('DO_NOT_REPLY_EMAIL'); my $name = sprintf(_("On behalf of %s"), @{ $self->send_from($row) }[1]); $params->{From} = [ $sender, $name ]; } diff --git a/perllib/FixMyStreet/TestMech.pm b/perllib/FixMyStreet/TestMech.pm index 16871d0f2..927e4556c 100644 --- a/perllib/FixMyStreet/TestMech.pm +++ b/perllib/FixMyStreet/TestMech.pm @@ -229,6 +229,17 @@ sub get_email { return $emails[0]; } +sub get_email_envelope { + my $mech = shift; + my @emails = FixMyStreet::Email::Sender->default_transport->deliveries; + @emails = map { $_->{envelope} } @emails; + + return @emails if wantarray; + + $mech->email_count_is(1) || return undef; + return $emails[0]; +} + sub get_text_body_from_email { my ($mech, $email, $obj) = @_; unless ($email) { |