aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Somerville <matthew@mysociety.org>2019-11-01 14:03:03 +0000
committerDave Arter <davea@mysociety.org>2019-12-09 12:50:07 +0000
commite4a1090545dd80a8dd36d63747e001ee0f3e87ab (patch)
tree2a275f3927c7b5e608910b003ac62912bba67f5c
parent4fa8d26c9d2a598b832c7787caefa0c8b00614e8 (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.pm70
-rw-r--r--t/cobrand/tfl.t31
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;