aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin/Bodies.pm6
-rw-r--r--perllib/FixMyStreet/App/Controller/Reports.pm3
-rw-r--r--perllib/FixMyStreet/Cobrand/Zurich.pm72
-rw-r--r--perllib/FixMyStreet/Geocode/Zurich.pm30
-rw-r--r--perllib/FixMyStreet/SendReport/Email.pm13
-rw-r--r--perllib/FixMyStreet/TestMech.pm11
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) {