aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStruan Donald <struan@exo.org.uk>2014-06-13 17:12:44 +0100
committerStruan Donald <struan@exo.org.uk>2014-07-01 17:42:22 +0100
commitad785aefa213856e046802626e58bd2ec7d0756b (patch)
tree4663b272145bf4cbbc6225941ffe20b1e3799717
parent291c66c7700b8e6c90052b6d4eb436909fbe0865 (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.pm23
-rw-r--r--perllib/FixMyStreet/DB/Result/Body.pm4
-rw-r--r--t/app/controller/reports.t118
-rwxr-xr-xtemplates/web/default/reports/index.html10
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 %]