aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMatthew Somerville <matthew-github@dracos.co.uk>2019-05-17 13:26:17 +0100
committerMatthew Somerville <matthew-github@dracos.co.uk>2019-05-28 17:19:27 +0100
commite06e3debd37f8d10a9d2ef5aacfa5dbc7696574b (patch)
treee5754c4aa6d2f3f47f884aa25cb6ba67afe733a2
parent8d4b1ee659a08c83715f8b59803ccbb50432761e (diff)
Add role search to users page.
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin/Users.pm64
-rw-r--r--t/app/controller/admin/users.t24
-rw-r--r--templates/web/base/admin/roles/index.html3
-rw-r--r--templates/web/base/admin/users/index.html21
4 files changed, 87 insertions, 25 deletions
diff --git a/perllib/FixMyStreet/App/Controller/Admin/Users.pm b/perllib/FixMyStreet/App/Controller/Admin/Users.pm
index 26f81992a..29c8f805c 100644
--- a/perllib/FixMyStreet/App/Controller/Admin/Users.pm
+++ b/perllib/FixMyStreet/App/Controller/Admin/Users.pm
@@ -28,35 +28,51 @@ sub index :Path : Args(0) {
my ( $self, $c ) = @_;
- if (my $search = $c->get_param('search')) {
- $search = $self->trim($search);
- $search =~ s/^<(.*)>$/$1/; # In case email wrapped in <...>
- $c->stash->{searched} = $search;
-
- my $isearch = '%' . $search . '%';
- my $search_n = 0;
- $search_n = int($search) if $search =~ /^\d+$/;
+ my $search = $c->get_param('search');
+ my $role = $c->get_param('role');
+ if ($search || $role) {
+ my $users = $c->cobrand->users;
+ my $isearch;
+ if ($search) {
+ $search = $self->trim($search);
+ $search =~ s/^<(.*)>$/$1/; # In case email wrapped in <...>
+ $c->stash->{searched} = $search;
+
+ $isearch = '%' . $search . '%';
+ my $search_n = 0;
+ $search_n = int($search) if $search =~ /^\d+$/;
+
+ $users = $users->search(
+ {
+ -or => [
+ email => { ilike => $isearch },
+ phone => { ilike => $isearch },
+ name => { ilike => $isearch },
+ from_body => $search_n,
+ ]
+ }
+ );
+ }
+ if ($role) {
+ $c->stash->{role_selected} = $role;
+ $users = $users->search({
+ role_id => $role,
+ }, {
+ join => 'user_roles',
+ });
+ }
- my $users = $c->cobrand->users->search(
- {
- -or => [
- email => { ilike => $isearch },
- phone => { ilike => $isearch },
- name => { ilike => $isearch },
- from_body => $search_n,
- ]
- }
- );
my @users = $users->all;
$c->stash->{users} = [ @users ];
- $c->forward('/admin/add_flags', [ { email => { ilike => $isearch } } ]);
+ if ($search) {
+ $c->forward('/admin/add_flags', [ { email => { ilike => $isearch } } ]);
+ }
} else {
$c->forward('/auth/get_csrf_token');
$c->forward('/admin/fetch_all_bodies');
$c->cobrand->call_hook('admin_user_edit_extra_data');
-
# Admin users by default
my $users = $c->cobrand->users->search(
{ from_body => { '!=', undef } },
@@ -66,6 +82,14 @@ sub index :Path : Args(0) {
$c->stash->{users} = \@users;
}
+ my $rs;
+ if ($c->user->is_superuser) {
+ $rs = $c->model('DB::Role')->search_rs({}, { join => 'body', order_by => ['body.name', 'me.name'] });
+ } elsif ($c->user->from_body) {
+ $rs = $c->user->from_body->roles->search_rs({}, { order_by => 'name' });
+ }
+ $c->stash->{roles} = [ $rs->all ];
+
return 1;
}
diff --git a/t/app/controller/admin/users.t b/t/app/controller/admin/users.t
index 767c8ef4c..534034f1d 100644
--- a/t/app/controller/admin/users.t
+++ b/t/app/controller/admin/users.t
@@ -60,6 +60,7 @@ subtest 'show flagged entries' => sub {
$user->update;
};
+my $role;
subtest 'user search' => sub {
$mech->get_ok('/admin/users');
$mech->get_ok('/admin/users?search=' . $user->name);
@@ -74,8 +75,17 @@ subtest 'user search' => sub {
$user->from_body($haringey->id);
$user->update;
+ $role = $user->roles->create({
+ body => $haringey,
+ name => 'Role A',
+ permissions => ['moderate', 'user_edit'],
+ });
+ $user->add_to_roles($role);
$mech->get_ok('/admin/users?search=' . $haringey->id );
- $mech->content_contains('Haringey');
+ $mech->content_contains('test@example.com');
+ $mech->get_ok('/admin/users?role=' . $role->id);
+ $mech->content_contains('selected>Role A');
+ $mech->content_contains('test@example.com');
};
subtest 'search does not show user from another council' => sub {
@@ -167,7 +177,7 @@ for my $test (
}
my %default_perms = (
- "permissions[moderate]" => undef,
+ "permissions[moderate]" => 'on',
"permissions[planned_reports]" => undef,
"permissions[report_mark_private]" => undef,
"permissions[report_edit]" => undef,
@@ -181,7 +191,7 @@ my %default_perms = (
"permissions[contribute_as_body]" => undef,
"permissions[default_to_body]" => undef,
"permissions[view_body_contribute_details]" => undef,
- "permissions[user_edit]" => undef,
+ "permissions[user_edit]" => 'on',
"permissions[user_manage_permissions]" => undef,
"permissions[user_assign_body]" => undef,
"permissions[user_assign_areas]" => undef,
@@ -212,6 +222,7 @@ FixMyStreet::override_config {
is_superuser => undef,
area_ids => undef,
%default_perms,
+ roles => $role->id,
},
changes => {
name => 'Changed User',
@@ -232,6 +243,7 @@ FixMyStreet::override_config {
is_superuser => undef,
area_ids => undef,
%default_perms,
+ roles => $role->id,
},
changes => {
email => 'changed@example.com',
@@ -252,10 +264,14 @@ FixMyStreet::override_config {
is_superuser => undef,
area_ids => undef,
%default_perms,
+ roles => $role->id,
},
changes => {
body => $southend->id,
},
+ removed => [
+ 'roles',
+ ],
log_count => 3,
log_entries => [qw/edit edit edit/],
},
@@ -340,6 +356,8 @@ FixMyStreet::override_config {
},
added => {
%default_perms,
+ 'permissions[moderate]' => undef,
+ 'permissions[user_edit]' => undef,
},
log_count => 5,
log_entries => [qw/edit edit edit edit edit/],
diff --git a/templates/web/base/admin/roles/index.html b/templates/web/base/admin/roles/index.html
index 54a4b6ace..ba3fd434b 100644
--- a/templates/web/base/admin/roles/index.html
+++ b/templates/web/base/admin/roles/index.html
@@ -21,7 +21,8 @@
[% END %]
</ul></td>
<td>
- <a href="[% c.uri_for(c.controller.action_for('edit'), [role.id]) %]">Edit</a>
+ <a href="[% c.uri_for(c.controller.action_for('edit'), [role.id]) %]">[% loc('Edit') %]</a>
+ &middot; <a href="[% c.uri_for_action('admin/users/index', role = role.id) %]">[% loc('Users') %]</a>
</td>
</tr>
[% END -%]
diff --git a/templates/web/base/admin/users/index.html b/templates/web/base/admin/users/index.html
index e939f008b..fc4abdfb8 100644
--- a/templates/web/base/admin/users/index.html
+++ b/templates/web/base/admin/users/index.html
@@ -4,9 +4,28 @@
<div class="fms-admin-info">
[% loc("User search finds matches in users' names and email addresses.") %]
</div>
+
<form method="get" action="[% c.uri_for_action('admin/users/index') %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8">
+<div class="filters">
+
<p><label for="search">[% loc('Search:') %]</label>
<input class="form-control" type="text" name="search" size="30" id="search" value="[% searched | html %]">
+ [% IF roles %]
+ <p><label for="role">[% loc('Role:') %]</label>
+ <select name="role" id="role" class="form-control">
+ <option value="">---</option>
+ [% FOR role IN roles %]
+ [% IF c.user.is_superuser AND last_name != role.body.name %]
+ <optgroup label="[% role.body.name %]">
+ [% SET last_name = role.body.name %]
+ [% END %]
+ <option value="[% role.id %]"[% ' selected' IF role.id == role_selected %]>[% role.name | html %]</option>
+ [% END %]
+ </select>
+ [% END %]
+ <p class="no-label"><input type="submit" value="[% loc('Go') %]" class="btn">
+
+</div>
</form>
[% IF users.size %]
@@ -36,7 +55,7 @@
[%- END -%]
</table>
-[% ELSIF searched %]
+[% ELSIF searched || role_selected %]
<div class="fms-admin-warning">
[% loc("Searching found no users.") %]