aboutsummaryrefslogtreecommitdiffstats
path: root/perllib/FixMyStreet/App/Controller/Dashboard.pm
diff options
context:
space:
mode:
Diffstat (limited to 'perllib/FixMyStreet/App/Controller/Dashboard.pm')
-rw-r--r--perllib/FixMyStreet/App/Controller/Dashboard.pm158
1 files changed, 135 insertions, 23 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Dashboard.pm b/perllib/FixMyStreet/App/Controller/Dashboard.pm
index a5ba8ff07..25c6e1923 100644
--- a/perllib/FixMyStreet/App/Controller/Dashboard.pm
+++ b/perllib/FixMyStreet/App/Controller/Dashboard.pm
@@ -29,7 +29,7 @@ sub example : Local : Args(0) {
}
# TODO Set up manual version of what the below would do
- #$c->forward( '/report/new/setup_categories_and_councils' );
+ #$c->forward( '/report/new/setup_categories_and_bodies' );
# See if we've had anything from the dropdowns - perhaps vary results if so
$c->stash->{ward} = $c->req->param('ward');
@@ -74,9 +74,9 @@ sub check_page_allowed : Private {
$c->detach( '/auth/redirect' ) unless $c->user_exists;
$c->detach( '/page_error_404_not_found' )
- unless $c->user_exists && $c->user->from_council;
+ unless $c->user_exists && $c->user->from_body;
- return $c->user->from_council;
+ return $c->user->from_body;
}
=head2 index
@@ -88,20 +88,23 @@ Show the dashboard table.
sub index : Path : Args(0) {
my ( $self, $c ) = @_;
- my $council = $c->forward('check_page_allowed');
+ my $body = $c->forward('check_page_allowed');
# Set up the data for the dropdowns
- my $council_detail = mySociety::MaPit::call('area', $council );
+ # Just take the first area ID we find
+ my $area_id = $body->body_areas->first->area_id;
+
+ my $council_detail = mySociety::MaPit::call('area', $area_id );
$c->stash->{council} = $council_detail;
- my $children = mySociety::MaPit::call('area/children', $council,
+ my $children = mySociety::MaPit::call('area/children', $area_id,
type => $c->cobrand->area_types_children,
);
$c->stash->{children} = $children;
- $c->stash->{all_councils} = { $council => $council_detail };
- $c->forward( '/report/new/setup_categories_and_councils' );
+ $c->stash->{all_areas} = { $area_id => $council_detail };
+ $c->forward( '/report/new/setup_categories_and_bodies' );
# See if we've had anything from the dropdowns
@@ -109,7 +112,7 @@ sub index : Path : Args(0) {
$c->stash->{category} = $c->req->param('category');
my %where = (
- council => $council, # XXX This will break in a two tier council. Restriction needs looking at...
+ bodies_str => $body->id, # XXX Does this break in a two tier council? Restriction needs looking at...
'problem.state' => [ FixMyStreet::DB::Result::Problem->visible_states() ],
);
$where{areas} = { 'like', '%,' . $c->stash->{ward} . ',%' }
@@ -118,16 +121,23 @@ sub index : Path : Args(0) {
if $c->stash->{category};
$c->stash->{where} = \%where;
my $prob_where = { %where };
- $prob_where->{state} = $prob_where->{'problem.state'};
+ $prob_where->{'me.state'} = $prob_where->{'problem.state'};
delete $prob_where->{'problem.state'};
$c->stash->{prob_where} = $prob_where;
+ my $dtf = $c->model('DB')->storage->datetime_parser;
+
my %counts;
- my $t = DateTime->today;
- $counts{wtd} = $c->forward( 'updates_search', [ $t->subtract( days => $t->dow - 1 ) ] );
- $counts{week} = $c->forward( 'updates_search', [ DateTime->now->subtract( weeks => 1 ) ] );
- $counts{weeks} = $c->forward( 'updates_search', [ DateTime->now->subtract( weeks => 4 ) ] );
- $counts{ytd} = $c->forward( 'updates_search', [ DateTime->today->set( day => 1, month => 1 ) ] );
+ my $now = DateTime->now( time_zone => 'local' );
+ my $t = $now->clone->truncate( to => 'day' );
+ $counts{wtd} = $c->forward( 'updates_search',
+ [ $dtf->format_datetime( $t->clone->subtract( days => $t->dow - 1 ) ) ] );
+ $counts{week} = $c->forward( 'updates_search',
+ [ $dtf->format_datetime( $now->clone->subtract( weeks => 1 ) ) ] );
+ $counts{weeks} = $c->forward( 'updates_search',
+ [ $dtf->format_datetime( $now->clone->subtract( weeks => 4 ) ) ] );
+ $counts{ytd} = $c->forward( 'updates_search',
+ [ $dtf->format_datetime( $t->clone->set( day => 1, month => 1 ) ) ] );
$c->stash->{problems} = \%counts;
@@ -135,26 +145,126 @@ sub index : Path : Args(0) {
$c->stash->{q_state} = $c->req->param('state') || '';
if ( $c->stash->{q_state} eq 'fixed' ) {
- $prob_where->{state} = [ FixMyStreet::DB::Result::Problem->fixed_states() ];
+ $prob_where->{'me.state'} = [ FixMyStreet::DB::Result::Problem->fixed_states() ];
} elsif ( $c->stash->{q_state} ) {
- $prob_where->{state} = $c->stash->{q_state};
+ $prob_where->{'me.state'} = $c->stash->{q_state};
+ $prob_where->{'me.state'} = { IN => [ 'planned', 'action scheduled' ] }
+ if $prob_where->{'me.state'} eq 'action scheduled';
}
my $params = {
%$prob_where,
- 'me.confirmed' => { '>=', DateTime->now->subtract( days => 30 ) },
+ 'me.confirmed' => { '>=', $dtf->format_datetime( $now->clone->subtract( days => 30 ) ) },
};
- my @problems = $c->cobrand->problems->search( $params )->all;
+ my $problems_rs = $c->cobrand->problems->search( $params );
+ my @problems = $problems_rs->all;
+
my %problems;
foreach (@problems) {
- if ($_->confirmed >= DateTime->now->subtract(days => 7)) {
+ if ($_->confirmed >= $now->clone->subtract(days => 7)) {
push @{$problems{1}}, $_;
- } elsif ($_->confirmed >= DateTime->now->subtract(days => 14)) {
+ } elsif ($_->confirmed >= $now->clone->subtract(days => 14)) {
push @{$problems{2}}, $_;
} else {
push @{$problems{3}}, $_;
}
}
$c->stash->{lists} = \%problems;
+
+ if ( $c->req->params->{export} ) {
+ $self->export_as_csv($c, $problems_rs, $body);
+ }
+}
+
+sub export_as_csv {
+ my ($self, $c, $problems_rs, $body) = @_;
+ require Text::CSV;
+ my $problems = $problems_rs->search(
+ {}, { prefetch => 'comments' });
+
+ my $filename = do {
+ my %where = (
+ body => $body->id,
+ category => $c->stash->{category},
+ state => $c->stash->{q_state},
+ ward => $c->stash->{ward},
+ );
+ join '-',
+ $c->req->uri->host,
+ map {
+ my $value = $where{$_};
+ (defined $value and length $value) ? ($_, $value) : ()
+ } sort keys %where };
+
+ my $csv = Text::CSV->new({ binary => 1, eol => "\n" });
+ $csv->combine(
+ 'Report ID',
+ 'Title',
+ 'Detail',
+ 'User Name',
+ 'Category',
+ 'Created',
+ 'Confirmed',
+ 'Acknowledged',
+ 'Fixed',
+ 'Closed',
+ 'Status',
+ 'Latitude', 'Longitude',
+ 'Nearest Postcode',
+ 'Report URL',
+ );
+ my @body = ($csv->string);
+
+ my $fixed_states = FixMyStreet::DB::Result::Problem->fixed_states;
+ my $closed_states = FixMyStreet::DB::Result::Problem->closed_states;
+
+ while ( my $report = $problems->next ) {
+ my $external_body;
+ my $body_name = "";
+ if ( $external_body = $report->body($c) ) {
+ # seems to be a zurich specific thing
+ $body_name = $external_body->name if ref $external_body;
+ }
+ my $hashref = $report->as_hashref($c);
+
+ $hashref->{user_name_display} = $report->anonymous?
+ '(anonymous)' : $report->user->name;
+
+ for my $comment ($report->comments) {
+ my $problem_state = $comment->problem_state or next;
+ next if $problem_state eq 'confirmed';
+ $hashref->{acknowledged_pp} //= $c->cobrand->prettify_dt( $comment->created );
+ $hashref->{fixed_pp} //= $fixed_states->{ $problem_state } ?
+ $c->cobrand->prettify_dt( $comment->created ): undef;
+ if ($closed_states->{ $problem_state }) {
+ $hashref->{closed_pp} = $c->cobrand->prettify_dt( $comment->created );
+ last;
+ }
+ }
+
+ $csv->combine(
+ @{$hashref}{
+ 'id',
+ 'title',
+ 'detail',
+ 'user_name_display',
+ 'category',
+ 'created_pp',
+ 'confirmed_pp',
+ 'acknowledged_pp',
+ 'fixed_pp',
+ 'closed_pp',
+ 'state',
+ 'latitude', 'longitude',
+ 'postcode',
+ },
+ (join '', $c->cobrand->base_url_for_report($report), $report->url),
+ );
+
+ push @body, $csv->string;
+ }
+ $c->res->content_type('text/csv; charset=utf-8');
+ $c->res->header('content-disposition' => "attachment; filename=${filename}.csv");
+ $c->res->body( join "", @body );
}
sub updates_search : Private {
@@ -181,11 +291,13 @@ sub updates_search : Private {
map { $_ => $counts{$_} || 0 }
('confirmed', 'investigating', 'in progress', 'closed', 'fixed - council',
'fixed - user', 'fixed', 'unconfirmed', 'hidden',
- 'partial', 'planned');
+ 'partial', 'action scheduled', 'planned');
+
+ $counts{'action scheduled'} += $counts{planned} || 0;
for my $vars (
[ 'time_to_fix', 'fixed - council' ],
- [ 'time_to_mark', 'in progress', 'planned', 'investigating', 'closed' ],
+ [ 'time_to_mark', 'in progress', 'action scheduled', 'investigating', 'closed' ],
) {
my $col = shift @$vars;
my $substmt = "select min(id) from comment where me.problem_id=comment.problem_id and problem_state in ('"