diff options
author | Struan Donald <struan@exo.org.uk> | 2014-06-13 17:12:44 +0100 |
---|---|---|
committer | Struan Donald <struan@exo.org.uk> | 2014-07-01 17:42:22 +0100 |
commit | ad785aefa213856e046802626e58bd2ec7d0756b (patch) | |
tree | 4663b272145bf4cbbc6225941ffe20b1e3799717 | |
parent | 291c66c7700b8e6c90052b6d4eb436909fbe0865 (diff) |
Link through from all reports page to sub categories
Add a type parameter to the /reports/body page to restrict list by
problem category.
Only link to report categories that have entries.
Fixes #798
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Reports.pm | 23 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Body.pm | 4 | ||||
-rw-r--r-- | t/app/controller/reports.t | 118 | ||||
-rwxr-xr-x | templates/web/default/reports/index.html | 10 |
4 files changed, 147 insertions, 8 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Reports.pm b/perllib/FixMyStreet/App/Controller/Reports.pm index 7e0cccc7b..5b3283a2c 100644 --- a/perllib/FixMyStreet/App/Controller/Reports.pm +++ b/perllib/FixMyStreet/App/Controller/Reports.pm @@ -368,11 +368,32 @@ sub load_and_group_problems : Private { my ( $self, $c ) = @_; my $page = $c->req->params->{p} || 1; + my $type = $c->req->params->{t} || 'all'; my $where = { non_public => 0, state => [ FixMyStreet::DB::Result::Problem->visible_states() ] }; + + my $not_open = [ FixMyStreet::DB::Result::Problem::fixed_states(), FixMyStreet::DB::Result::Problem::closed_states() ]; + if ( $type eq 'new' ) { + $where->{confirmed} = { '>', \"ms_current_timestamp() - INTERVAL '4 week'" }; + $where->{state} = { 'IN', [ FixMyStreet::DB::Result::Problem::open_states() ] }; + } elsif ( $type eq 'older' ) { + $where->{confirmed} = { '<', \"ms_current_timestamp() - INTERVAL '4 week'" }; + $where->{lastupdate} = { '>', \"ms_current_timestamp() - INTERVAL '8 week'" }; + $where->{state} = { 'IN', [ FixMyStreet::DB::Result::Problem::open_states() ] }; + } elsif ( $type eq 'unknown' ) { + $where->{lastupdate} = { '<', \"ms_current_timestamp() - INTERVAL '8 week'" }; + $where->{state} = { 'IN', [ FixMyStreet::DB::Result::Problem::open_states() ] }; + } elsif ( $type eq 'fixed' ) { + $where->{lastupdate} = { '>', \"ms_current_timestamp() - INTERVAL '8 week'" }; + $where->{state} = $not_open; + } elsif ( $type eq 'older_fixed' ) { + $where->{lastupdate} = { '<', \"ms_current_timestamp() - INTERVAL '8 week'" }; + $where->{state} = $not_open; + } + if ($c->stash->{ward}) { $where->{areas} = { 'like', '%,' . $c->stash->{ward}->{id} . ',%' }; $where->{bodies_str} = [ @@ -449,7 +470,7 @@ sub redirect_body : Private { $url .= '/' . $c->cobrand->short_name( $c->stash->{body} ); $url .= '/' . $c->cobrand->short_name( $c->stash->{ward} ) if $c->stash->{ward}; - $c->res->redirect( $c->uri_for($url) ); + $c->res->redirect( $c->uri_for($url, $c->req->params ) ); } sub add_row { diff --git a/perllib/FixMyStreet/DB/Result/Body.pm b/perllib/FixMyStreet/DB/Result/Body.pm index be4adeca9..6b529735d 100644 --- a/perllib/FixMyStreet/DB/Result/Body.pm +++ b/perllib/FixMyStreet/DB/Result/Body.pm @@ -98,9 +98,9 @@ __PACKAGE__->has_many( # DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:hTOxxiiHmC8nmQK/p8dXhQ sub url { - my ( $self, $c ) = @_; + my ( $self, $c, $args ) = @_; # XXX $areas_info was used here for Norway parent - needs body parents, I guess - return $c->uri_for( '/reports/' . $c->cobrand->short_name( $self ) ); + return $c->uri_for( '/reports/' . $c->cobrand->short_name( $self ), $args || {} ); } sub areas { diff --git a/t/app/controller/reports.t b/t/app/controller/reports.t index 42e69fd03..36af2f36a 100644 --- a/t/app/controller/reports.t +++ b/t/app/controller/reports.t @@ -11,15 +11,19 @@ ok( my $mech = FixMyStreet::TestMech->new, 'Created mech object' ); $mech->create_body_ok(2514, 'Birmingham City Council'); $mech->create_body_ok(2651, 'City of Edinburgh Council'); $mech->create_body_ok(2504, 'Westminster City Council'); +$mech->create_body_ok(2649, 'Fife Council'); $mech->delete_problems_for_body( 2504 ); $mech->delete_problems_for_body( 2651 ); +$mech->delete_problems_for_body( 2649 ); my @edinburgh_problems = $mech->create_problems_for_body(3, 2651, 'All reports'); my @westminster_problems = $mech->create_problems_for_body(5, 2504, 'All reports'); +my @fife_problems = $mech->create_problems_for_body(15, 2649, 'All reports'); is scalar @westminster_problems, 5, 'correct number of westminster problems created'; is scalar @edinburgh_problems, 3, 'correct number of edinburgh problems created'; +is scalar @fife_problems, 15, 'correct number of fife problems created'; $edinburgh_problems[1]->update( { state => 'in progress', @@ -27,6 +31,59 @@ $edinburgh_problems[1]->update( { lastupdate => DateTime->now()->subtract( weeks => 5 ), } ); +$fife_problems[1]->update( { + state => 'fixed - user', + confirmed => DateTime->now()->subtract( weeks => 6 ), + lastupdate => DateTime->now()->subtract( weeks => 5 ), +}); + +$fife_problems[2]->update( { + state => 'fixed - user', + confirmed => DateTime->now()->subtract( weeks => 2 ), + lastupdate => DateTime->now()->subtract( weeks => 1 ), +}); + +$fife_problems[3]->update( { + state => 'fixed - user', + confirmed => DateTime->now()->subtract( weeks => 10 ), + lastupdate => DateTime->now()->subtract( weeks => 9 ), +}); + +$fife_problems[4]->update( { + confirmed => DateTime->now()->subtract( weeks => 10 ), + lastupdate => DateTime->now()->subtract( weeks => 9 ), +}); + +$fife_problems[5]->update( { + confirmed => DateTime->now()->subtract( weeks => 7 ), + lastupdate => DateTime->now()->subtract( weeks => 5 ), +}); + +$fife_problems[6]->update( { + confirmed => DateTime->now()->subtract( weeks => 7 ), + lastupdate => DateTime->now()->subtract( weeks => 2 ), +}); + +$fife_problems[7]->update( { + confirmed => DateTime->now()->subtract( weeks => 10 ), + lastupdate => DateTime->now()->subtract( weeks => 6 ), +}); + +$fife_problems[8]->update( { + confirmed => DateTime->now()->subtract( weeks => 10 ), + lastupdate => DateTime->now()->subtract( weeks => 2 ), +}); + +$fife_problems[9]->update( { + state => 'fixed - user', + confirmed => DateTime->now()->subtract( weeks => 10 ), + lastupdate => DateTime->now()->subtract( weeks => 7 ), +}); + +$fife_problems[10]->update( { + state => 'hidden', +}); + # Run the cron script that makes the data for /reports so we don't get an error. system( "bin/cron-wrapper update-all-reports" ); @@ -42,6 +99,12 @@ is $stats->{'City of Edinburgh Council'}->[2], 1, 'correct number of older repor is $stats->{'Westminster City Council'}->[1], 5, 'correct number of reports for Westminster'; +is $stats->{'Fife Council'}->[1], 5, 'correct number of new reports for Fife'; +is $stats->{'Fife Council'}->[2], 4, 'correct number of old reports for Fife'; +is $stats->{'Fife Council'}->[3], 1, 'correct number of unknown reports for Fife'; +is $stats->{'Fife Council'}->[4], 3, 'correct number of fixed reports for Fife'; +is $stats->{'Fife Council'}->[5], 1, 'correct number of older fixed reports for Fife'; + FixMyStreet::override_config { MAPIT_URL => 'http://mapit.mysociety.org/', }, sub { @@ -56,6 +119,61 @@ $mech->content_contains('All reports Test 3 for 2504', 'problem to be marked non my $problems = $mech->extract_problem_list; is scalar @$problems, 5, 'correct number of problems displayed'; +FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.mysociety.org/', +}, sub { + $mech->get_ok('/reports/City+of+Edinburgh?t=new'); +}; +$problems = $mech->extract_problem_list; +is scalar @$problems, 2, 'correct number of new problems displayed'; + +FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.mysociety.org/', +}, sub { + $mech->get_ok('/reports/City+of+Edinburgh?t=older'); +}; +$problems = $mech->extract_problem_list; +is scalar @$problems, 1, 'correct number of older problems displayed'; + +for my $test ( + { + desc => 'new fife problems on report page', + type => 'new', + expected => 5 + }, + { + desc => 'older fife problems on report page', + type => 'older', + expected => 4 + }, + { + desc => 'unknown fife problems on report page', + type => 'unknown', + expected => 1 + }, + { + desc => 'fixed fife problems on report page', + type => 'fixed', + expected => 3 + }, + { + desc => 'older_fixed fife problems on report page', + type => 'older_fixed', + expected => 1 + }, +) { + subtest $test->{desc} => sub { + FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.mysociety.org/', + }, sub { + $mech->get_ok('/reports/Fife+Council?t=' . $test->{type}); + }; + + $problems = $mech->extract_problem_list; + is scalar @$problems, $test->{expected}, 'correct number of ' . $test->{type} . ' problems displayed'; + }; +} + my $private = $westminster_problems[2]; ok $private->update( { non_public => 1 } ), 'problem marked non public'; diff --git a/templates/web/default/reports/index.html b/templates/web/default/reports/index.html index e4b4c3033..1e4130a37 100755 --- a/templates/web/default/reports/index.html +++ b/templates/web/default/reports/index.html @@ -28,11 +28,11 @@ [%- ELSIF ! (loop.count % 2) %] class="a" [%- END %]> <td class="title"><a href="[% body.url(c) %]">[% body.name %]</a></td> -<td class="data">[% open.${body.id}.new or 0 %]</td> -<td class="data">[% open.${body.id}.older or 0 %]</td> -<td class="data">[% open.${body.id}.unknown or 0 %]</td> -<td class="data">[% fixed.${body.id}.new or 0 %]</td> -<td class="data">[% fixed.${body.id}.old or 0 %]</td> +<td class="data">[% IF open.${body.id}.new %]<a href="[% body.url(c, { t => 'new' }) %]">[% open.${body.id}.new %]</a>[% ELSE %]0[% END %]</td> +<td class="data">[% IF open.${body.id}.older %]<a href="[% body.url(c, { t => 'older' }) %]">[% open.${body.id}.older %]</a>[% ELSE %]0[% END %]</td> +<td class="data">[% IF open.${body.id}.unknown %]<a href="[% body.url(c, { t => 'unknown' }) %]">[% open.${body.id}.unknown %]</a>[% ELSE %]0[% END %]</td> +<td class="data">[% IF fixed.${body.id}.new %]<a href="[% body.url(c, { t => 'fixed' }) %]">[% fixed.${body.id}.new %]</a>[% ELSE %]0[% END %]</td> +<td class="data">[% IF fixed.${body.id}.old %]<a href="[% body.url(c, { t => 'older_fixed' }) %]">[% fixed.${body.id}.old %]</a>[% ELSE %]0[% END %]</td> </tr> [% TRY %][% PROCESS "reports/_extras.html" %][% CATCH file %][% END %] [% END %] |