aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md2
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm42
-rw-r--r--perllib/FixMyStreet/App/Controller/Moderate.pm3
-rw-r--r--perllib/FixMyStreet/DB/Result/Comment.pm25
-rw-r--r--t/app/controller/admin.t15
-rw-r--r--templates/web/base/admin/user-form.html7
6 files changed, 72 insertions, 22 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6ae7b2852..a731eaba2 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -16,7 +16,7 @@
- Ensure all reports graph can't dip downward. #1956
- Fix error sending `requires_inspection` reports. #1961
- Admin improvements:
- - Admin can anonymize all a user's reports. #1942
+ - Admin can anonymize/hide all a user's reports. #1942 #1943
- UK:
- Lazy load images in the footer.
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index 25fdd2db5..a1d301249 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -892,7 +892,7 @@ sub report_edit : Path('report_edit') : Args(1) {
$self->remove_photo($c, $problem, $remove_photo_param);
}
- if ( $remove_photo_param || $problem->state eq 'hidden' ) {
+ if ($problem->state eq 'hidden') {
$problem->get_photoset->delete_cached;
}
@@ -1274,8 +1274,14 @@ sub update_edit : Path('update_edit') : Args(1) {
$self->remove_photo($c, $update, $remove_photo_param);
}
- if ( $remove_photo_param || $new_state eq 'hidden' ) {
- $update->get_photoset->delete_cached;
+ $c->stash->{status_message} = '<p><em>' . _('Updated!') . '</em></p>';
+
+ # Must call update->hide while it's not hidden (so is_latest works)
+ if ($new_state eq 'hidden') {
+ my $outcome = $update->hide;
+ $c->stash->{status_message} .=
+ '<p><em>' . _('Problem marked as open.') . '</em></p>'
+ if $outcome->{reopened};
}
$update->name( $c->get_param('name') || '' );
@@ -1296,19 +1302,6 @@ sub update_edit : Path('update_edit') : Args(1) {
$update->update;
- $c->stash->{status_message} = '<p><em>' . _('Updated!') . '</em></p>';
-
- # If we're hiding an update, see if it marked as fixed and unfix if so
- if ( $new_state eq 'hidden' && $update->mark_fixed ) {
- if ( $update->problem->state =~ /^fixed/ ) {
- $update->problem->state('confirmed');
- $update->problem->update;
- }
-
- $c->stash->{status_message} .=
- '<p><em>' . _('Problem marked as open.') . '</em></p>';
- }
-
if ( $new_state ne $old_state ) {
$c->forward( 'log_edit',
[ $update->id, 'update', 'state_change' ] );
@@ -1432,6 +1425,8 @@ sub user_edit : Path('user_edit') : Args(1) {
$c->forward('unban_user', [ $user ]);
} elsif ( $c->get_param('submit') and $c->get_param('anon_everywhere') ) {
$c->forward('user_anon_everywhere', [ $user ]);
+ } elsif ( $c->get_param('submit') and $c->get_param('hide_everywhere') ) {
+ $c->forward('user_hide_everywhere', [ $user ]);
} elsif ( $c->get_param('submit') ) {
my $edited = 0;
@@ -1768,6 +1763,20 @@ sub user_anon_everywhere : Private {
$c->stash->{status_message} = _('That user has been made anonymous on all reports and updates.');
}
+sub user_hide_everywhere : Private {
+ my ( $self, $c, $user ) = @_;
+ my $problems = $user->problems->search({ state => { '!=' => 'hidden' } });
+ while (my $problem = $problems->next) {
+ $problem->get_photoset->delete_cached;
+ $problem->update({ state => 'hidden' });
+ }
+ my $updates = $user->comments->search({ state => { '!=' => 'hidden' } });
+ while (my $update = $updates->next) {
+ $update->hide;
+ }
+ $c->stash->{status_message} = _('That user’s reports and updates have been hidden.');
+}
+
sub unban_user : Private {
my ( $self, $c, $user ) = @_;
@@ -1913,6 +1922,7 @@ sub remove_photo : Private {
my ($self, $c, $object, $keys) = @_;
if ($keys eq 'ALL') {
$object->photo(undef);
+ $object->get_photoset->delete_cached;
} else {
my $fileids = $object->get_photoset->remove_images($keys);
$object->photo($fileids);
diff --git a/perllib/FixMyStreet/App/Controller/Moderate.pm b/perllib/FixMyStreet/App/Controller/Moderate.pm
index a8e0b7a3c..86143b5ea 100644
--- a/perllib/FixMyStreet/App/Controller/Moderate.pm
+++ b/perllib/FixMyStreet/App/Controller/Moderate.pm
@@ -128,6 +128,7 @@ sub report_moderate_hide : Private {
if ($c->get_param('problem_hide')) {
$problem->update({ state => 'hidden' });
+ $problem->get_photoset->delete_cached;
$c->res->redirect( '/' ); # Go directly to front-page
$c->detach( 'report_moderate_audit', ['hide'] ); # break chain here.
@@ -267,7 +268,7 @@ sub update_moderate_hide : Private {
my $comment = $c->stash->{comment} or die;
if ($c->get_param('update_hide')) {
- $comment->update({ state => 'hidden' });
+ $comment->hide;
$c->detach( 'update_moderate_audit', ['hide'] ); # break chain here.
}
return;
diff --git a/perllib/FixMyStreet/DB/Result/Comment.pm b/perllib/FixMyStreet/DB/Result/Comment.pm
index 60fd31510..ce4fc216a 100644
--- a/perllib/FixMyStreet/DB/Result/Comment.pm
+++ b/perllib/FixMyStreet/DB/Result/Comment.pm
@@ -293,4 +293,29 @@ sub problem_state_display {
return $update_state;
}
+sub is_latest {
+ my $self = shift;
+ my $latest_update = $self->result_source->resultset->search(
+ { problem_id => $self->problem_id, state => 'confirmed' },
+ { order_by => [ { -desc => 'confirmed' }, { -desc => 'id' } ] }
+ )->first;
+ return $latest_update->id == $self->id;
+}
+
+sub hide {
+ my $self = shift;
+
+ my $ret = {};
+
+ # If we're hiding an update, see if it marked as fixed and unfix if so
+ if ($self->mark_fixed && $self->is_latest && $self->problem->state =~ /^fixed/) {
+ $self->problem->state('confirmed');
+ $self->problem->update;
+ $ret->{reopened} = 1;
+ }
+ $self->get_photoset->delete_cached;
+ $self->update({ state => 'hidden' });
+ return $ret;
+}
+
1;
diff --git a/t/app/controller/admin.t b/t/app/controller/admin.t
index bebbb7806..91a28a5fc 100644
--- a/t/app/controller/admin.t
+++ b/t/app/controller/admin.t
@@ -1051,7 +1051,7 @@ subtest 'editing update email creates new user if required' => sub {
my $fields = {
text => 'this is a changed update',
- state => 'hidden',
+ state => 'confirmed',
name => 'A User',
anonymous => 0,
username => 'test4@example.com',
@@ -1153,6 +1153,7 @@ subtest 'hiding comment marked as fixed reopens report' => sub {
$log_entries->delete;
subtest 'report search' => sub {
+ $update->discard_changes;
$update->state('confirmed');
$update->user($report->user);
$update->update;
@@ -1568,6 +1569,18 @@ subtest "Anonymizing user from admin" => sub {
is $c, $count_u;
};
+subtest "Hiding user's reports from admin" => sub {
+ my $user = $mech->create_user_ok('existing@example.com', name => 'Existing User');
+ my $count_p = FixMyStreet::DB->resultset('Problem')->search({ user_id => $user->id })->count;
+ my $count_u = FixMyStreet::DB->resultset('Comment')->search({ user_id => $user->id })->count;
+ $mech->get_ok( '/admin/user_edit/' . $user->id );
+ $mech->submit_form_ok({ button => 'hide_everywhere' });
+ my $c = FixMyStreet::DB->resultset('Problem')->search({ user_id => $user->id, state => 'hidden' })->count;
+ is $c, $count_p;
+ $c = FixMyStreet::DB->resultset('Comment')->search({ user_id => $user->id, state => 'hidden' })->count;
+ is $c, $count_u;
+};
+
subtest "Test setting a report from unconfirmed to something else doesn't cause a front end error" => sub {
$report->update( { confirmed => undef, state => 'unconfirmed', non_public => 0 } );
$mech->get_ok("/admin/report_edit/$report_id");
diff --git a/templates/web/base/admin/user-form.html b/templates/web/base/admin/user-form.html
index 5a5077e40..63d4858ab 100644
--- a/templates/web/base/admin/user-form.html
+++ b/templates/web/base/admin/user-form.html
@@ -199,9 +199,10 @@
<input type="submit" class="btn" name="Submit changes" value="[% loc('Submit changes') %]" >
</p>
[% IF user AND NOT user.from_body %]
- <p class="danger-zone">
- <input class="btn-danger" type="submit" name="anon_everywhere" value="[% loc('Make anonymous on all reports and updates') %]">
- </p>
+ <ul class="no-bullets danger-zone">
+ <li><input class="btn-danger" type="submit" name="anon_everywhere" value="[% loc('Make anonymous on all reports and updates') %]">
+ <li><input class="btn-danger" type="submit" name="hide_everywhere" value="[% loc('Hide all reports and updates') %]">
+ </ul>
[% END %]
</form>