diff options
author | Matthew Somerville <matthew@mysociety.org> | 2019-11-01 14:03:03 +0000 |
---|---|---|
committer | Dave Arter <davea@mysociety.org> | 2019-12-09 12:50:07 +0000 |
commit | e4a1090545dd80a8dd36d63747e001ee0f3e87ab (patch) | |
tree | 2a275f3927c7b5e608910b003ac62912bba67f5c | |
parent | 4fa8d26c9d2a598b832c7787caefa0c8b00614e8 (diff) |
[TfL] Include extra columns in CSV export.
Borough, safety critical, whensent, shortlisted user, delivered to,
closure email at, reassigned at/by, category/subcategory.
The ward column will contain the borough; the default 'acknowledged'
is the timestamp of the first update to change the problem state.
We also need to give each anonymous CSV row a unique ID.
-rw-r--r-- | perllib/FixMyStreet/Cobrand/TfL.pm | 70 | ||||
-rw-r--r-- | t/cobrand/tfl.t | 31 |
2 files changed, 101 insertions, 0 deletions
diff --git a/perllib/FixMyStreet/Cobrand/TfL.pm b/perllib/FixMyStreet/Cobrand/TfL.pm index 846e1e776..6afa4b363 100644 --- a/perllib/FixMyStreet/Cobrand/TfL.pm +++ b/perllib/FixMyStreet/Cobrand/TfL.pm @@ -127,6 +127,76 @@ sub available_permissions { return $perms; } +sub dashboard_export_problems_add_columns { + my $self = shift; + my $c = $self->{c}; + + my %groups; + if ($c->stash->{body}) { + %groups = FixMyStreet::DB->resultset('Contact')->active->search({ + body_id => $c->stash->{body}->id, + })->group_lookup; + } + + splice @{$c->stash->{csv}->{headers}}, 5, 0, 'Subcategory'; + splice @{$c->stash->{csv}->{columns}}, 5, 0, 'subcategory'; + + $c->stash->{csv}->{headers} = [ + map { $_ eq 'Ward' ? 'Borough' : $_ } @{ $c->stash->{csv}->{headers} }, + "Agent responsible", + "Safety critical", + "Delivered to", + "Closure email at", + "Reassigned at", + "Reassigned by", + ]; + + $c->stash->{csv}->{columns} = [ + @{ $c->stash->{csv}->{columns} }, + "agent_responsible", + "safety_critical", + "delivered_to", + "closure_email_at", + "reassigned_at", + "reassigned_by", + ]; + + $c->stash->{csv}->{extra_data} = sub { + my $report = shift; + + my $agent = $report->shortlisted_user; + + my $change = $report->admin_log_entries->search( + { action => 'category_change' }, + { prefetch => 'user', rows => 1, order_by => { -desc => 'me.id' } } + )->single; + my $reassigned_at = $change ? $change->whenedited : ''; + my $reassigned_by = $change ? $change->user->name : ''; + + my $user_name_display = $report->anonymous + ? '(anonymous ' . $report->id . ')' : $report->name; + + my $safety_critical = $report->get_extra_field_value('safety_critical') || 'no'; + my $delivered_to = $report->get_extra_metadata('sent_to') || []; + my $closure_email_at = $report->get_extra_metadata('closure_alert_sent_at') || ''; + $closure_email_at = DateTime->from_epoch( + epoch => $closure_email_at, time_zone => FixMyStreet->local_time_zone + ) if $closure_email_at; + return { + acknowledged => $report->whensent, + agent_responsible => $agent ? $agent->name : '', + category => $groups{$report->category}, + subcategory => $report->category, + user_name_display => $user_name_display, + safety_critical => $safety_critical, + delivered_to => join(',', @$delivered_to), + closure_email_at => $closure_email_at, + reassigned_at => $reassigned_at, + reassigned_by => $reassigned_by, + }; + }; +} + sub must_have_2fa { my ($self, $user) = @_; diff --git a/t/cobrand/tfl.t b/t/cobrand/tfl.t index 24305727b..0346ee2b7 100644 --- a/t/cobrand/tfl.t +++ b/t/cobrand/tfl.t @@ -30,6 +30,8 @@ my $contact1 = $mech->create_contact_ok( category => 'Bus stops', email => 'busstops@example.com', ); +$contact1->set_extra_metadata(group => [ 'Bus things' ]); +$contact1->update; my $contact2 = $mech->create_contact_ok( body_id => $body->id, category => 'Traffic lights', @@ -177,6 +179,35 @@ subtest "reference number included in email" => sub { $mech->content_contains('FMS' . $report->id) or diag $mech->content; }; +subtest 'Dashboard extra columns' => sub { + $mech->log_in_ok( $staffuser->email ); + $mech->get_ok('/dashboard?export=1'); + $mech->content_contains('Category,Subcategory'); + $mech->content_contains('Query,Borough'); + $mech->content_contains(',"Safety critical","Delivered to","Closure email at","Reassigned at","Reassigned by"'); + $mech->content_contains('"Bus things","Bus stops"'); + $mech->content_contains('"BR1 3UH",Bromley,'); + $mech->content_contains(',,,no'); + my $report = FixMyStreet::DB->resultset("Problem")->find({ title => 'Test Report 1'}); + $report->set_extra_fields({ name => 'safety_critical', value => 'yes' }); + $report->anonymous(1); + $report->update; + my $dt = DateTime->now(); + FixMyStreet::DB->resultset("AdminLog")->create({ + action => 'category_change', + whenedited => $dt, + object_id => $report->id, + object_type => 'problem', + admin_user => $staffuser->name, + user => $staffuser, + }); + $mech->get_ok('/dashboard?export=1'); + $mech->content_contains('Query,Borough'); + $mech->content_contains(',"Safety critical","Delivered to","Closure email at","Reassigned at","Reassigned by"'); + $mech->content_contains('(anonymous ' . $report->id . ')'); + $mech->content_contains(',,,yes,busstops@example.com,,' . $dt . ',"Council User"'); +}; + subtest 'check lookup by reference' => sub { my $id = FixMyStreet::DB->resultset("Problem")->first->id; |