diff options
author | Matthew Somerville <matthew-github@dracos.co.uk> | 2019-05-17 13:26:17 +0100 |
---|---|---|
committer | Matthew Somerville <matthew-github@dracos.co.uk> | 2019-05-28 17:19:27 +0100 |
commit | e06e3debd37f8d10a9d2ef5aacfa5dbc7696574b (patch) | |
tree | e5754c4aa6d2f3f47f884aa25cb6ba67afe733a2 | |
parent | 8d4b1ee659a08c83715f8b59803ccbb50432761e (diff) |
Add role search to users page.
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin/Users.pm | 64 | ||||
-rw-r--r-- | t/app/controller/admin/users.t | 24 | ||||
-rw-r--r-- | templates/web/base/admin/roles/index.html | 3 | ||||
-rw-r--r-- | templates/web/base/admin/users/index.html | 21 |
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> + · <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.") %] |