aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md1
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm30
-rw-r--r--t/app/controller/admin/users.t58
-rw-r--r--templates/web/base/admin/user-alerts.html11
4 files changed, 96 insertions, 4 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 54851de5d..3b7342f92 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -9,6 +9,7 @@
- Clearer relocation options while you’re reporting a problem #2238
- Admin improvements
- List number of alerts on report page #669
+ - viewing and managing of user alerts in admin #676
- Bugfixes:
- Add perl 5.26/5.28 support.
- Fix subcategory issues when visiting /report/new directly #2276
diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm
index e13a4b7ca..d757cec9a 100644
--- a/perllib/FixMyStreet/App/Controller/Admin.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin.pm
@@ -1512,10 +1512,6 @@ sub user_edit : Path('user_edit') : Args(1) {
$c->forward('fetch_all_bodies');
$c->forward('fetch_body_areas', [ $user->from_body ]) if $user->from_body;
- unless ( $c->cobrand->moniker eq 'zurich' ) {
- $c->forward('user_alert_details');
- }
-
if ( defined $c->flash->{status_message} ) {
$c->stash->{status_message} =
'<p><em>' . $c->flash->{status_message} . '</em></p>';
@@ -1538,6 +1534,8 @@ sub user_edit : Path('user_edit') : Args(1) {
my %args = ( email => $email );
$args{user_id} = $id if $user->email ne $email || !$user->email_verified;
$c->forward('send_login_email', [ \%args ]);
+ } elsif ( $c->get_param('update_alerts') ) {
+ $c->forward('update_alerts');
} elsif ( $c->get_param('submit') ) {
my $edited = 0;
@@ -1717,6 +1715,11 @@ sub user_edit : Path('user_edit') : Args(1) {
$c->stash->{contacts} = \@all_contacts;
}
+ # this goes after in case we've delete any alerts
+ unless ( $c->cobrand->moniker eq 'zurich' ) {
+ $c->forward('user_alert_details');
+ }
+
return 1;
}
@@ -1945,6 +1948,25 @@ sub ban_user : Private {
return 1;
}
+sub update_alerts : Private {
+ my ($self, $c) = @_;
+
+ my $changes;
+ for my $alert ( $c->stash->{user}->alerts ) {
+ my $edit_option = $c->get_param('edit_alert[' . $alert->id . ']');
+ next unless $edit_option;
+ $changes = 1;
+ if ( $edit_option eq 'delete' ) {
+ $alert->delete;
+ } elsif ( $edit_option eq 'disable' ) {
+ $alert->disable;
+ } elsif ( $edit_option eq 'enable' ) {
+ $alert->confirm;
+ }
+ }
+ $c->flash->{status_message} = _("Updated!") if $changes;
+}
+
sub user_logout_everywhere : Private {
my ( $self, $c, $user ) = @_;
my $sessions = $user->get_extra_metadata('sessions');
diff --git a/t/app/controller/admin/users.t b/t/app/controller/admin/users.t
index 37d95feed..d9e984454 100644
--- a/t/app/controller/admin/users.t
+++ b/t/app/controller/admin/users.t
@@ -515,6 +515,64 @@ subtest "Removing account from admin" => sub {
is $user->email, 'removed-' . $user->id . '@example.org', 'Email gone'
};
+subtest "can view list of user's alerts" => sub {
+ $mech->get_ok( '/admin/user_edit/' . $user->id );
+ $mech->content_lacks("User's alerts", 'no list of alerts');
+
+ $mech->create_problems_for_body(1, 2514, 'Title', { user => $user });
+ my $p = FixMyStreet::DB->resultset('Problem')->search({ user_id => $user->id })->first;
+
+ my $alert = FixMyStreet::DB->resultset('Alert')->find_or_create({
+ user_id => $user->id,
+ alert_type => 'new_updates',
+ parameter => $p->id
+ });
+
+
+ $mech->get_ok( '/admin/user_edit/' . $user->id );
+ $mech->content_contains("User's alerts", 'has list of alerts');
+ $mech->content_contains($alert->id, 'lists alert');
+};
+
+subtest "can edit list of user's alerts" => sub {
+ $mech->get_ok( '/admin/user_edit/' . $user->id );
+
+ my $alert = FixMyStreet::DB->resultset('Alert')->search({
+ user_id => $user->id,
+ alert_type => 'new_updates',
+ })->first;
+
+ $mech->content_like(qr[<td>${\$alert->id}</td>\s*<td>new_updates</td>]m, 'alert on page');
+
+ $mech->submit_form_ok( {
+ with_fields => {
+ 'edit_alert[' . $alert->id . ']' => 'disable'
+ }
+ }, 'disabling alert');
+
+ $alert->discard_changes;
+ ok $alert->whendisabled, 'alert disabled';
+
+ $mech->submit_form_ok( {
+ with_fields => {
+ 'edit_alert[' . $alert->id . ']' => 'enable'
+ }
+ }, 'enabling alert');
+
+ $alert->discard_changes;
+ is $alert->whendisabled, undef, 'alert enabled';
+
+ $mech->submit_form_ok( {
+ with_fields => {
+ 'edit_alert[' . $alert->id . ']' => 'delete',
+ }
+ }, 'deleting alert');
+
+ $mech->content_unlike(qr[<td>${\$alert->id}</td>\s*<td>new_updates</td>]m, 'alert not on page');
+
+ is $user->alerts->count, 0, 'alert deleted';
+};
+
subtest "View timeline" => sub {
$mech->get_ok('/admin/timeline');
};
diff --git a/templates/web/base/admin/user-alerts.html b/templates/web/base/admin/user-alerts.html
index 1da9729d7..6058e595b 100644
--- a/templates/web/base/admin/user-alerts.html
+++ b/templates/web/base/admin/user-alerts.html
@@ -1,5 +1,8 @@
[% IF alerts.size %]
<h3>[% loc("User's alerts") %]</h3>
+<form method="POST">
+<input type="hidden" name="token" value="[% csrf_token %]" >
+<input type="hidden" name="update_alerts" value="1" >
<table>
<tr>
<th>[% loc('ID') %]</th>
@@ -7,6 +10,9 @@
<th>[% loc('Confirmed') %]</th>
<th>[% loc('State') %]</th>
<th>[% loc('Details') %]</th>
+ <th>[% loc('Enable') %]</th>
+ <th>[% loc('Disable') %]</th>
+ <th>[% loc('Delete') %]</th>
</tr>
[% FOREACH alert IN alerts %]
<tr>
@@ -43,7 +49,12 @@
[% alert.parameter %] [% alert.parameter2 %]
[% END %]
</td>
+ <td><input type="radio" name="edit_alert[[% alert.id %]]" value="enable"[% ' disabled' UNLESS alert.whendisabled %]></td>
+ <td><input type="radio" name="edit_alert[[% alert.id %]]" value="disable"[% ' disabled' IF alert.whendisabled %]></td>
+ <td><input type="radio" name="edit_alert[[% alert.id %]]" value="delete"></td>
</tr>
[% END %]
</table>
+<input type="submit" value="[% loc('Update') %]">
+</form>
[% END %]