aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rwxr-xr-xbin/one-off-update-duplicates20
-rw-r--r--perllib/FixMyStreet/App/Controller/Report.pm5
-rw-r--r--perllib/FixMyStreet/DB/Result/Problem.pm15
-rw-r--r--t/app/controller/report_inspect.t7
-rw-r--r--t/app/model/problem.t2
6 files changed, 47 insertions, 3 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index cea9e8782..186a66a5b 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -13,6 +13,7 @@
- Stop errors from JS validator due to form in form.
- Stop update form toggle causing report submission.
- Update map size if an extra column has appeared.
+ - Improve performance of duplicate display.
- Development improvements:
- `switch-site` script to automate switching config.yml files. #1741
diff --git a/bin/one-off-update-duplicates b/bin/one-off-update-duplicates
new file mode 100755
index 000000000..7bbf0251f
--- /dev/null
+++ b/bin/one-off-update-duplicates
@@ -0,0 +1,20 @@
+#!/usr/bin/env perl
+
+use strict;
+use warnings;
+
+BEGIN {
+ use File::Basename qw(dirname);
+ use File::Spec;
+ my $d = dirname(File::Spec->rel2abs($0));
+ require "$d/../setenv.pl";
+}
+
+use FixMyStreet::DB;
+
+my $rs = FixMyStreet::DB->resultset("Problem")->search({ extra => => { like => "%duplicate_of%" } });
+while (my $row = $rs->next) {
+ my $duplicate_of = $row->get_extra_metadata('duplicate_of');
+ next unless $duplicate_of;
+ $row->set_duplicate_of($duplicate_of);
+}
diff --git a/perllib/FixMyStreet/App/Controller/Report.pm b/perllib/FixMyStreet/App/Controller/Report.pm
index 5c64bd9e5..acc6f9a09 100644
--- a/perllib/FixMyStreet/App/Controller/Report.pm
+++ b/perllib/FixMyStreet/App/Controller/Report.pm
@@ -325,7 +325,7 @@ sub inspect : Private {
my %update_params = ();
if ($permissions->{report_inspect}) {
- foreach (qw/detailed_information traffic_information duplicate_of/) {
+ foreach (qw/detailed_information traffic_information/) {
$problem->set_extra_metadata( $_ => $c->get_param($_) );
}
@@ -360,7 +360,10 @@ sub inspect : Private {
}
if ( $problem->state ne 'duplicate' ) {
$problem->unset_extra_metadata('duplicate_of');
+ } elsif (my $duplicate_of = $c->get_param('duplicate_of')) {
+ $problem->set_duplicate_of($duplicate_of);
}
+
if ( $problem->state ne $old_state ) {
$c->forward( '/admin/log_edit', [ $problem->id, 'problem', 'state_change' ] );
diff --git a/perllib/FixMyStreet/DB/Result/Problem.pm b/perllib/FixMyStreet/DB/Result/Problem.pm
index a12f8c20d..720e8cc93 100644
--- a/perllib/FixMyStreet/DB/Result/Problem.pm
+++ b/perllib/FixMyStreet/DB/Result/Problem.pm
@@ -1115,6 +1115,16 @@ has shortlisted_user => (
},
);
+sub set_duplicate_of {
+ my ($self, $other_id) = @_;
+ $self->set_extra_metadata( duplicate_of => $other_id );
+ my $dupe = $self->result_source->schema->resultset("Problem")->find($other_id);
+ my $dupes_duplicates = $dupe->get_extra_metadata('duplicates') || [];
+ push @$dupes_duplicates, $self->id;
+ $dupe->set_extra_metadata( duplicates => $dupes_duplicates );
+ $dupe->update;
+}
+
has duplicate_of => (
is => 'ro',
lazy => 1,
@@ -1132,8 +1142,9 @@ has duplicates => (
lazy => 1,
default => sub {
my $self = shift;
- my $rabx_id = RABX::serialise( $self->id );
- my @duplicates = $self->result_source->schema->resultset('Problem')->search({ extra => { like => "\%duplicate_of,$rabx_id%" } })->all;
+ my $duplicates = $self->get_extra_metadata("duplicates") || [];
+ return [] unless $duplicates && @$duplicates;
+ my @duplicates = $self->result_source->schema->resultset('Problem')->search({ id => $duplicates })->all;
return \@duplicates;
},
);
diff --git a/t/app/controller/report_inspect.t b/t/app/controller/report_inspect.t
index 447e28028..e668fddbf 100644
--- a/t/app/controller/report_inspect.t
+++ b/t/app/controller/report_inspect.t
@@ -114,6 +114,8 @@ FixMyStreet::override_config {
$report->set_extra_metadata('duplicate_of' => $report2->id);
$report->state('duplicate');
$report->update;
+ $report2->set_extra_metadata('duplicates' => [ $report->id ]);
+ $report2->update;
$mech->get_ok("/report/$report_id");
$mech->content_contains($report2->title);
@@ -124,6 +126,8 @@ FixMyStreet::override_config {
$report->unset_extra_metadata('duplicate_of');
$report->state($old_state);
$report->update;
+ $report2->unset_extra_metadata('duplicates');
+ $report2->update;
};
subtest "marking a report as a duplicate with update correctly sets update status" => sub {
@@ -133,10 +137,13 @@ FixMyStreet::override_config {
$mech->get_ok("/report/$report_id");
$mech->submit_form_ok({ button => 'save', with_fields => { state => 'Duplicate', duplicate_of => $report2->id, public_update => "This is a duplicate.", include_update => "1" } });
$report->discard_changes;
+ $report2->discard_changes;
is $report->state, 'duplicate', 'report marked as duplicate';
is $report->comments->search({ problem_state => 'duplicate' })->count, 1, 'update marking report as duplicate was left';
+ is $report->get_extra_metadata('duplicate_of'), $report2->id;
+ is_deeply $report2->get_extra_metadata('duplicates'), [ $report->id ];
$report->update({ state => $old_state });
};
diff --git a/t/app/model/problem.t b/t/app/model/problem.t
index 718b980b0..b0719d6a6 100644
--- a/t/app/model/problem.t
+++ b/t/app/model/problem.t
@@ -776,6 +776,8 @@ subtest 'check duplicate reports' => sub {
$problem1->set_extra_metadata(duplicate_of => $problem2->id);
$problem1->state('duplicate');
$problem1->update;
+ $problem2->set_extra_metadata(duplicates => [ $problem1->id ]);
+ $problem2->update;
is $problem1->duplicate_of->title, $problem2->title, 'problem1 returns correct problem from duplicate_of';
is scalar @{ $problem2->duplicates }, 1, 'problem2 has correct number of duplicates';