diff options
Diffstat (limited to 'perllib/FixMyStreet')
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin/Triage.pm | 1 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Dashboard.pm | 120 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Reports.pm | 123 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/Bromley.pm | 87 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/FixMyStreet.pm | 6 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/IsleOfWight.pm | 6 | ||||
-rw-r--r-- | perllib/FixMyStreet/Cobrand/Zurich.pm | 1 |
7 files changed, 190 insertions, 154 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin/Triage.pm b/perllib/FixMyStreet/App/Controller/Admin/Triage.pm index 385248cd1..50d1b1437 100644 --- a/perllib/FixMyStreet/App/Controller/Admin/Triage.pm +++ b/perllib/FixMyStreet/App/Controller/Admin/Triage.pm @@ -45,6 +45,7 @@ sub index : Path : Args(0) { } $c->stash->{body} = $c->forward('/reports/body_find', [ $c->cobrand->council_area ]); $c->forward( 'stash_report_filter_status' ); + $c->forward('/reports/stash_report_sort', [ $c->cobrand->reports_ordering ]); $c->forward( '/reports/load_and_group_problems' ); $c->stash->{page} = 'reports'; # So the map knows to make clickable pins diff --git a/perllib/FixMyStreet/App/Controller/Dashboard.pm b/perllib/FixMyStreet/App/Controller/Dashboard.pm index 495e47c2a..f226e08de 100644 --- a/perllib/FixMyStreet/App/Controller/Dashboard.pm +++ b/perllib/FixMyStreet/App/Controller/Dashboard.pm @@ -70,15 +70,20 @@ sub check_page_allowed : Private { $c->detach( '/auth/redirect' ) unless $c->user_exists; - $c->detach( '/page_error_404_not_found' ) - unless $c->user->from_body || $c->user->is_superuser; + my $cobrand_body = $c->cobrand->can('council_area_id') ? $c->cobrand->body : undef; - my $body = $c->user->from_body; - if (!$body && $c->get_param('body')) { - # Must be a superuser, so allow query parameter if given - $body = $c->model('DB::Body')->find({ id => $c->get_param('body') }); + my $body; + if ($c->user->is_superuser) { + if ($c->get_param('body')) { + $body = $c->model('DB::Body')->find({ id => $c->get_param('body') }); + } else { + $body = $cobrand_body; + } + } elsif ($c->user->from_body && (!$cobrand_body || $cobrand_body->id == $c->user->from_body->id)) { + $body = $c->user->from_body; + } else { + $c->detach( '/page_error_404_not_found' ) } - return $body; } @@ -494,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 741cbb60f..85e647f65 100644 --- a/perllib/FixMyStreet/App/Controller/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Reports.pm @@ -151,6 +151,7 @@ sub ward : Path : Args(2) { if @wards; $c->forward( 'check_canonical_url', [ $body ] ); $c->forward( 'stash_report_filter_status' ); + $c->forward('stash_report_sort', [ $c->cobrand->reports_ordering ]); $c->forward( 'load_and_group_problems' ); if ($c->get_param('ajax')) { @@ -164,6 +165,25 @@ sub ward : Path : Args(2) { $c->stash->{stats} = $c->cobrand->get_report_stats(); + $c->forward('setup_categories_and_map'); + + # List of wards + if ( !$c->stash->{wards} && $c->stash->{body}->id && $c->stash->{body}->body_areas->first ) { + my $children = $c->stash->{body}->first_area_children; + unless ($children->{error}) { + foreach (values %$children) { + $_->{url} = $c->uri_for( $c->stash->{body_url} + . '/' . $c->cobrand->short_name( $_ ) + ); + } + $c->stash->{children} = $children; + } + } +} + +sub setup_categories_and_map :Private { + my ($self, $c) = @_; + my @categories = $c->stash->{body}->contacts->not_deleted->search( undef, { columns => [ 'id', 'category', 'extra', 'body_id', 'send_method' ], distinct => 1, @@ -188,19 +208,6 @@ sub ward : Path : Args(2) { ); $c->cobrand->tweak_all_reports_map( $c ); - - # List of wards - if ( !$c->stash->{wards} && $c->stash->{body}->id && $c->stash->{body}->body_areas->first ) { - my $children = $c->stash->{body}->first_area_children; - unless ($children->{error}) { - foreach (values %$children) { - $_->{url} = $c->uri_for( $c->stash->{body_url} - . '/' . $c->cobrand->short_name( $_ ) - ); - } - $c->stash->{children} = $children; - } - } } sub rss_area : Path('/rss/area') : Args(1) { @@ -551,9 +558,51 @@ sub load_dashboard_data : Private { sub load_and_group_problems : Private { my ( $self, $c ) = @_; - $c->forward('stash_report_sort', [ $c->cobrand->reports_ordering ]); + my $parameters = $c->forward('load_problems_parameters'); + my $body = $c->stash->{body}; # Might be undef my $page = $c->get_param('p') || 1; + + my $problems = $c->cobrand->problems; + my $where = $parameters->{where}; + my $filter = $parameters->{filter}; + + if ($where->{areas} || $body) { + $problems = $problems->to_body($body); + } + + $problems = $problems->search( + $where, + $filter + )->include_comment_counts->page( $page ); + + $c->stash->{pager} = $problems->pager; + + my ( %problems, @pins ); + while ( my $problem = $problems->next ) { + if ( !$body ) { + add_row( $c, $problem, 0, \%problems, \@pins ); + next; + } + # Add to bodies it was sent to + my $bodies = $problem->bodies_str_ids; + foreach ( @$bodies ) { + next if $_ != $body->id; + add_row( $c, $problem, $_, \%problems, \@pins ); + } + } + + $c->stash( + problems => \%problems, + pins => \@pins, + ); + + return 1; +} + +sub load_problems_parameters : Private { + my ($self, $c) = @_; + my $category = [ $c->get_param_list('filter_category', 1) ]; my $states = $c->stash->{filter_problem_states}; @@ -600,15 +649,10 @@ sub load_and_group_problems : Private { $where->{category} = $category; } - my $problems = $c->cobrand->problems; - if ($c->stash->{wards}) { $where->{areas} = [ map { { 'like', '%,' . $_->{id} . ',%' } } @{$c->stash->{wards}} ]; - $problems = $problems->to_body($body); - } elsif ($body) { - $problems = $problems->to_body($body); } if (my $bbox = $c->get_param('bbox')) { @@ -617,45 +661,14 @@ sub load_and_group_problems : Private { $where->{longitude} = { '>=', $min_lon, '<', $max_lon }; } - my $cobrand_problems = $c->cobrand->call_hook('munge_load_and_group_problems', $where, $filter); - - # JS will request the same (or more) data client side - return if $c->get_param('js'); - - if ($cobrand_problems) { - $problems = $cobrand_problems; - } else { - $problems = $problems->search( - $where, - $filter - )->include_comment_counts->page( $page ); - - $c->stash->{pager} = $problems->pager; - } - - my ( %problems, @pins ); - while ( my $problem = $problems->next ) { - if ( !$body ) { - add_row( $c, $problem, 0, \%problems, \@pins ); - next; - } - # Add to bodies it was sent to - my $bodies = $problem->bodies_str_ids; - foreach ( @$bodies ) { - next if $_ != $body->id; - add_row( $c, $problem, $_, \%problems, \@pins ); - } - } - - $c->stash( - problems => \%problems, - pins => \@pins, - ); + $c->cobrand->call_hook('munge_load_and_group_problems', $where, $filter); - return 1; + return { + where => $where, + filter => $filter, + }; } - sub check_non_public_reports_permission : Private { my ($self, $c, $where) = @_; diff --git a/perllib/FixMyStreet/Cobrand/Bromley.pm b/perllib/FixMyStreet/Cobrand/Bromley.pm index 391106346..29ff4393f 100644 --- a/perllib/FixMyStreet/Cobrand/Bromley.pm +++ b/perllib/FixMyStreet/Cobrand/Bromley.pm @@ -127,16 +127,9 @@ sub tweak_all_reports_map { } # A place where this can happen - return unless $c->stash->{template} && $c->stash->{template} eq 'about/heatmap.html'; - - my $children = $c->stash->{body}->first_area_children; - foreach (values %$children) { - $_->{url} = $c->uri_for( $c->stash->{body_url} - . '/' . $c->cobrand->short_name( $_ ) - ); - } - $c->stash->{children} = $children; + return unless $c->action eq 'dashboard/heatmap'; + # Bromley only subcategory stuff my %subcats = $self->subcategories; my $filter = $c->stash->{filter_categories}; my @new_contacts; @@ -156,8 +149,6 @@ sub tweak_all_reports_map { my $subcats = $c->user->get_extra_metadata('subcategories') || []; $c->stash->{filter_category} = { map { $_ => 1 } @$cats, @$subcats } if @$cats || @$subcats; } - - $c->stash->{ward_hash} = { map { $_->{id} => 1 } @{$c->stash->{wards}} } if $c->stash->{wards}; } sub title_list { @@ -331,27 +322,14 @@ sub add_admin_subcategories { return \@new_contacts; } -sub about_hook { - my $self = shift; - my $c = $self->{c}; - - # Display a special custom dashboard page, with heatmap - if ($c->stash->{template} eq 'about/heatmap.html') { - $c->forward('/dashboard/check_page_allowed'); - # We want a special sidebar - $c->stash->{ajax_template} = "about/heatmap-list.html"; - $c->set_param('js', 1) unless $c->get_param('ajax'); # Want to load pins client-side - $c->forward('/reports/body', [ 'Bromley' ]); - } -} - -# On heatmap page, include querying on subcategories, wards, dates, provided +# On heatmap page, include querying on subcategories sub munge_load_and_group_problems { my ($self, $where, $filter) = @_; my $c = $self->{c}; - return unless $c->stash->{template} && $c->stash->{template} eq 'about/heatmap.html'; + return unless $c->action eq 'dashboard/heatmap'; + # Bromley subcategory stuff if (!$where->{category}) { my $cats = $c->user->categories; my $subcats = $c->user->get_extra_metadata('subcategories') || []; @@ -370,61 +348,6 @@ sub munge_load_and_group_problems { }; delete $where->{category}; } - - # 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; - - delete $filter->{rows}; - - # Load the relevant stuff for the sidebar as well - my $problems = $self->problems->search($where, $filter); - - $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 @c = $c->model('DB::Comment')->to_body($self->body)->search({ - %$params, - 'me.user_id' => { -not_in => [ $c->user->id, $self->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 ]; - - return $problems; } 1; diff --git a/perllib/FixMyStreet/Cobrand/FixMyStreet.pm b/perllib/FixMyStreet/Cobrand/FixMyStreet.pm index 72ba51dd8..e830b10b2 100644 --- a/perllib/FixMyStreet/Cobrand/FixMyStreet.pm +++ b/perllib/FixMyStreet/Cobrand/FixMyStreet.pm @@ -99,11 +99,7 @@ sub munge_load_and_group_problems { return unless $where->{category} && $self->{c}->stash->{body}->name eq 'Isle of Wight Council'; - my $cat_names = $self->expand_triage_cat_list($where->{category}); - - $where->{category} = $cat_names; - my $problems = $self->problems->search($where, $filter); - return $problems; + $where->{category} = $self->expand_triage_cat_list($where->{category}); } sub expand_triage_cat_list { diff --git a/perllib/FixMyStreet/Cobrand/IsleOfWight.pm b/perllib/FixMyStreet/Cobrand/IsleOfWight.pm index 6a719604d..26e3ba474 100644 --- a/perllib/FixMyStreet/Cobrand/IsleOfWight.pm +++ b/perllib/FixMyStreet/Cobrand/IsleOfWight.pm @@ -173,11 +173,7 @@ sub munge_load_and_group_problems { return unless $where->{category}; - my $cat_names = $self->expand_triage_cat_list($where->{category}); - - $where->{category} = $cat_names; - my $problems = $self->problems->search($where, $filter); - return $problems; + $where->{category} = $self->expand_triage_cat_list($where->{category}); } sub munge_around_filter_category_list { diff --git a/perllib/FixMyStreet/Cobrand/Zurich.pm b/perllib/FixMyStreet/Cobrand/Zurich.pm index 9cf1030f0..6cbaa285b 100644 --- a/perllib/FixMyStreet/Cobrand/Zurich.pm +++ b/perllib/FixMyStreet/Cobrand/Zurich.pm @@ -324,6 +324,7 @@ sub report_page_data { $c->stash->{page} = 'reports'; $c->forward( 'stash_report_filter_status' ); + $c->forward('stash_report_sort', [ $c->cobrand->reports_ordering ]); $c->forward( 'load_and_group_problems' ); $c->stash->{body} = { id => 0 }; # So template can fetch the list |