diff options
author | Matthew Somerville <matthew@mysociety.org> | 2019-10-08 09:34:49 +0100 |
---|---|---|
committer | Matthew Somerville <matthew@mysociety.org> | 2019-10-15 09:06:43 +0100 |
commit | 448a603594f598bd692fa402139357d945c60d15 (patch) | |
tree | dabb16d5687a5977d6e03fc7b4e0d2decc9a2336 /perllib/FixMyStreet/App/Controller | |
parent | faeb8244d9281c064c832366257ac46d5143a9f1 (diff) |
Generalise heatmap code to be under /dashboard.
Diffstat (limited to 'perllib/FixMyStreet/App/Controller')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Dashboard.pm | 101 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Reports.pm | 31 |
2 files changed, 113 insertions, 19 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Dashboard.pm b/perllib/FixMyStreet/App/Controller/Dashboard.pm index 60c9b0823..f226e08de 100644 --- a/perllib/FixMyStreet/App/Controller/Dashboard.pm +++ b/perllib/FixMyStreet/App/Controller/Dashboard.pm @@ -499,6 +499,107 @@ sub generate_csv : Private { } } +sub heatmap : Local : Args(0) { + my ($self, $c) = @_; + + my $body = $c->stash->{body} = $c->forward('check_page_allowed'); + $c->detach( '/page_error_404_not_found' ) + unless $body && $c->cobrand->feature('heatmap'); + + $c->stash->{page} = 'reports'; # So the map knows to make clickable pins + + my @wards = $c->get_param_list('wards', 1); + $c->forward('/reports/ward_check', [ @wards ]) if @wards; + $c->forward('/reports/stash_report_filter_status'); + $c->forward('/reports/stash_report_sort', [ $c->cobrand->reports_ordering ]); # Not actually used + my $parameters = $c->forward( '/reports/load_problems_parameters'); + + my $where = $parameters->{where}; + my $filter = $parameters->{filter}; + delete $filter->{rows}; + + $c->forward('heatmap_filters', [ $where ]); + + # Load the relevant stuff for the sidebar as well + my $problems = $c->cobrand->problems; + $problems = $problems->to_body($body); + $problems = $problems->search($where, $filter); + + $c->forward('heatmap_sidebar', [ $problems, $where ]); + + if ($c->get_param('ajax')) { + my @pins; + while ( my $problem = $problems->next ) { + push @pins, $problem->pin_data($c, 'reports'); + } + $c->stash->{pins} = \@pins; + $c->detach('/reports/ajax', [ 'dashboard/heatmap-list.html' ]); + } + + my $children = $c->stash->{body}->first_area_children; + $c->stash->{children} = $children; + $c->stash->{ward_hash} = { map { $_->{id} => 1 } @{$c->stash->{wards}} } if $c->stash->{wards}; + + $c->forward('/reports/setup_categories_and_map'); +} + +sub heatmap_filters :Private { + my ($self, $c, $where) = @_; + + # Wards + my @areas = @{$c->user->area_ids || []}; + # Want to get everything if nothing given in an ajax call + if (!$c->stash->{wards} && @areas) { + $c->stash->{wards} = [ map { { id => $_ } } @areas ]; + $where->{areas} = [ + map { { 'like', '%,' . $_ . ',%' } } @areas + ]; + } + + # Date range + my $start_default = DateTime->today(time_zone => FixMyStreet->time_zone || FixMyStreet->local_time_zone)->subtract(months => 1); + $c->stash->{start_date} = $c->get_param('start_date') || $start_default->strftime('%Y-%m-%d'); + $c->stash->{end_date} = $c->get_param('end_date'); + + my $range = FixMyStreet::DateRange->new( + start_date => $c->stash->{start_date}, + start_default => $start_default, + end_date => $c->stash->{end_date}, + formatter => $c->model('DB')->storage->datetime_parser, + ); + $where->{'me.confirmed'} = $range->sql; +} + +sub heatmap_sidebar :Private { + my ($self, $c, $problems, $where) = @_; + + $c->stash->{five_newest} = [ $problems->search(undef, { + rows => 5, + order_by => { -desc => 'confirmed' }, + })->all ]; + + $c->stash->{ten_oldest} = [ $problems->search({ + 'me.state' => [ FixMyStreet::DB::Result::Problem->open_states() ], + }, { + rows => 10, + order_by => 'lastupdate', + })->all ]; + + my $params = { map { my $n = $_; s/me\./problem\./; $_ => $where->{$n} } keys %$where }; + my $body = $c->stash->{body}; + my @c = $c->model('DB::Comment')->to_body($body)->search({ + %$params, + 'me.user_id' => { -not_in => [ $c->user->id, $body->comment_user_id || () ] }, + 'me.state' => 'confirmed', + }, { + columns => 'problem_id', + group_by => 'problem_id', + order_by => { -desc => \'max(me.confirmed)' }, + rows => 5, + })->all; + $c->stash->{five_commented} = [ map { $_->problem } @c ]; +} + =head1 AUTHOR Matthew Somerville diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm index 771d829f0..85e647f65 100644 --- a/perllib/FixMyStreet/App/Controller/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Reports.pm @@ -560,29 +560,23 @@ sub load_and_group_problems : Private { my $parameters = $c->forward('load_problems_parameters'); - # JS will request the same (or more) data client side - return if $c->get_param('js'); - my $body = $c->stash->{body}; # Might be undef my $page = $c->get_param('p') || 1; - my $problems = $parameters->{problems}; - unless ($problems) { - my $where = $parameters->{where}; - my $filter = $parameters->{filter}; + my $problems = $c->cobrand->problems; + my $where = $parameters->{where}; + my $filter = $parameters->{filter}; - $problems = $c->cobrand->problems; - if ($where->{areas} || $body) { - $problems = $problems->to_body($body); - } + if ($where->{areas} || $body) { + $problems = $problems->to_body($body); + } - $problems = $problems->search( - $where, - $filter - )->include_comment_counts->page( $page ); + $problems = $problems->search( + $where, + $filter + )->include_comment_counts->page( $page ); - $c->stash->{pager} = $problems->pager; - } + $c->stash->{pager} = $problems->pager; my ( %problems, @pins ); while ( my $problem = $problems->next ) { @@ -667,10 +661,9 @@ sub load_problems_parameters : Private { $where->{longitude} = { '>=', $min_lon, '<', $max_lon }; } - my $cobrand_problems = $c->cobrand->call_hook('munge_load_and_group_problems', $where, $filter); + $c->cobrand->call_hook('munge_load_and_group_problems', $where, $filter); return { - problems => $cobrand_problems, where => $where, filter => $filter, }; |