diff options
-rw-r--r-- | CHANGELOG.md | 2 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 42 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Moderate.pm | 3 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/Comment.pm | 25 | ||||
-rw-r--r-- | t/app/controller/admin.t | 15 | ||||
-rw-r--r-- | templates/web/base/admin/user-form.html | 7 |
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> |