diff options
author | Dave Arter <davea@mysociety.org> | 2016-08-22 11:34:02 +0100 |
---|---|---|
committer | Dave Arter <davea@mysociety.org> | 2016-08-22 11:34:02 +0100 |
commit | ec5e2c47f736c075e6dafd1ed63860287f596077 (patch) | |
tree | a1cacec534da24c011c0c204b0b03c014e272eff | |
parent | 618b9a32cec0c045a8e3e910fd38f89f4aa9203a (diff) | |
parent | 05f04f40aa2c4fef44474f7057a92f6685387e7e (diff) |
Merge branch 'issues/forcouncils/37-user-area-management'
-rwxr-xr-x | bin/update-schema | 1 | ||||
-rw-r--r-- | db/downgrade_0043---0042.sql | 3 | ||||
-rw-r--r-- | db/schema.sql | 3 | ||||
-rw-r--r-- | db/schema_0043-add-user-area-field.sql | 4 | ||||
-rw-r--r-- | perllib/FixMyStreet/App/Controller/Admin.pm | 39 | ||||
-rw-r--r-- | perllib/FixMyStreet/DB/Result/User.pm | 6 | ||||
-rw-r--r-- | t/Mock/MapIt.pm | 23 | ||||
-rw-r--r-- | t/app/controller/admin.t | 492 | ||||
-rw-r--r-- | t/app/controller/admin_permissions.t | 8 | ||||
-rw-r--r-- | templates/web/base/admin/user-form.html | 25 | ||||
-rw-r--r-- | web/js/fixmystreet-admin.js | 6 |
11 files changed, 364 insertions, 246 deletions
diff --git a/bin/update-schema b/bin/update-schema index 09155fa03..e8f2e2cbd 100755 --- a/bin/update-schema +++ b/bin/update-schema @@ -194,6 +194,7 @@ else { # By querying the database schema, we can see where we're currently at # (assuming schema change files are never half-applied, which should be the case) sub get_db_version { + return '0043' if column_exists('users', 'area_id'); return '0042' if table_exists('user_planned_reports'); return '0041' if column_exists('users', 'is_superuser') && ! constraint_exists('user_body_permissions_permission_type_check'); return '0040' if column_exists('users', 'is_superuser'); diff --git a/db/downgrade_0043---0042.sql b/db/downgrade_0043---0042.sql new file mode 100644 index 000000000..5f32650aa --- /dev/null +++ b/db/downgrade_0043---0042.sql @@ -0,0 +1,3 @@ +begin; +alter table users drop column area_id; +commit; diff --git a/db/schema.sql b/db/schema.sql index 48f0fd07e..b11bb30b7 100644 --- a/db/schema.sql +++ b/db/schema.sql @@ -30,7 +30,8 @@ create table users ( is_superuser boolean not null default 'f', title text, twitter_id bigint unique, - facebook_id bigint unique + facebook_id bigint unique, + area_id integer ); -- Record details of reporting bodies, including open311 configuration details diff --git a/db/schema_0043-add-user-area-field.sql b/db/schema_0043-add-user-area-field.sql new file mode 100644 index 000000000..9b4b044d1 --- /dev/null +++ b/db/schema_0043-add-user-area-field.sql @@ -0,0 +1,4 @@ +BEGIN; +ALTER TABLE users +ADD COLUMN area_id integer; +COMMIT; diff --git a/perllib/FixMyStreet/App/Controller/Admin.pm b/perllib/FixMyStreet/App/Controller/Admin.pm index 17425ad77..63414b555 100644 --- a/perllib/FixMyStreet/App/Controller/Admin.pm +++ b/perllib/FixMyStreet/App/Controller/Admin.pm @@ -1134,6 +1134,7 @@ 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; if ( $c->get_param('submit') ) { $c->forward('/auth/check_csrf_token'); @@ -1166,9 +1167,18 @@ sub user_edit : Path('user_edit') : Args(1) { $user->from_body( undef ); } + # Has the user's from_body changed since we fetched areas (if we ever did)? + # If so, we need to re-fetch areas so the UI is up to date. + if ( $user->from_body && $user->from_body->id ne $c->stash->{fetched_areas_body_id} ) { + $c->forward('fetch_body_areas', [ $user->from_body ]); + } + if (!$user->from_body) { - # Non-staff users aren't allowed any permissions + # Non-staff users aren't allowed any permissions or to be in an area $user->user_body_permissions->delete_all; + $user->area_id(undef); + delete $c->stash->{areas}; + delete $c->stash->{fetched_areas_body_id}; } elsif ($c->stash->{available_permissions}) { my @all_permissions = map { keys %$_ } values %{ $c->stash->{available_permissions} }; my @user_permissions = grep { $c->get_param("permissions[$_]") ? 1 : undef } @all_permissions; @@ -1184,6 +1194,12 @@ sub user_edit : Path('user_edit') : Args(1) { } } + if ( $user->from_body && $c->user->has_permission_to('user_assign_areas', $user->from_body->id) ) { + my %valid_areas = map { $_->{id} => 1 } @{ $c->stash->{areas} }; + my $new_area = $c->get_param('area_id'); + $user->area_id( $valid_areas{$new_area} ? $new_area : undef ); + } + unless ($user->email) { $c->stash->{field_errors}->{email} = _('Please enter a valid email'); return; @@ -1614,6 +1630,27 @@ sub fetch_all_bodies : Private { return 1; } +sub fetch_body_areas : Private { + my ($self, $c, $body ) = @_; + + my $body_area = $body->body_areas->first; + + unless ( $body_area ) { + # Body doesn't have any areas defined. + delete $c->stash->{areas}; + delete $c->stash->{fetched_areas_body_id}; + return; + } + + my $areas = mySociety::MaPit::call('area/children', [ $body_area->area_id ], + type => $c->cobrand->area_types_children, + ); + + $c->stash->{areas} = [ sort { strcoll($a->{name}, $b->{name}) } values %$areas ]; + # Keep track of the areas we've fetched to prevent a duplicate fetch later on + $c->stash->{fetched_areas_body_id} = $body->id; +} + sub trim { my $self = shift; my $e = shift; diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm index cc8e050da..697cfedf6 100644 --- a/perllib/FixMyStreet/DB/Result/User.pm +++ b/perllib/FixMyStreet/DB/Result/User.pm @@ -38,6 +38,8 @@ __PACKAGE__->add_columns( { data_type => "bigint", is_nullable => 1 }, "is_superuser", { data_type => "boolean", default_value => \"false", is_nullable => 0 }, + "area_id", + { data_type => "integer", is_nullable => 1 }, ); __PACKAGE__->set_primary_key("id"); __PACKAGE__->add_unique_constraint("users_email_key", ["email"]); @@ -98,8 +100,8 @@ __PACKAGE__->has_many( ); -# Created by DBIx::Class::Schema::Loader v0.07035 @ 2016-07-20 15:00:41 -# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:+pEOZ8GM14D4gqkp+fr+ZA +# Created by DBIx::Class::Schema::Loader v0.07035 @ 2016-08-03 13:52:28 +# DO NOT MODIFY THIS OR ANYTHING ABOVE! md5sum:SX8BS91mWHoOm2oWdNth1w use Moo; use mySociety::EmailUtil; diff --git a/t/Mock/MapIt.pm b/t/Mock/MapIt.pm index 754cc327e..9aa8b7e40 100644 --- a/t/Mock/MapIt.pm +++ b/t/Mock/MapIt.pm @@ -39,6 +39,29 @@ sub dispatch_request { $self->json->encode($response) }; return [ 200, [ 'Content-Type' => 'application/json' ], [ $json ] ]; }, + + sub (GET + /area/*) { + my ($self, $area) = @_; + my $response = {"parent_area" => undef, "generation_high" => 25, "all_names" => {}, "id" => 2245, "codes" => {"ons" => "00HY", "gss" => "E06000054", "unit_id" => "43925"}, "name" => "Wiltshire Council", "country" => "E", "type_name" => "Unitary Authority", "generation_low" => 11, "country_name" => "England", "type" => "UTA"}; + # We must make sure we output correctly for testing purposes, we might + # be within a different locale here... + my $json = mySociety::Locale::in_gb_locale { + $self->json->encode($response) }; + return [ 200, [ 'Content-Type' => 'application/json' ], [ $json ] ]; + }, + + sub (GET + /area/*/children) { + my ($self, $area) = @_; + my $response = { + "60705" => { "parent_area" => 2245, "generation_high" => 25, "all_names" => { }, "id" => 60705, "codes" => { "ons" => "00HY226", "gss" => "E04011842", "unit_id" => "17101" }, "name" => "Trowbridge", "country" => "E", "type_name" => "Civil parish/community", "generation_low" => 12, "country_name" => "England", "type" => "CPC" }, + "62883" => { "parent_area" => 2245, "generation_high" => 25, "all_names" => { }, "id" => 62883, "codes" => { "ons" => "00HY026", "gss" => "E04011642", "unit_id" => "17205" }, "name" => "Bradford-on-Avon", "country" => "E", "type_name" => "Civil parish/community", "generation_low" => 12, "country_name" => "England", "type" => "CPC" }, + }; + # We must make sure we output correctly for testing purposes, we might + # be within a different locale here... + my $json = mySociety::Locale::in_gb_locale { + $self->json->encode($response) }; + return [ 200, [ 'Content-Type' => 'application/json' ], [ $json ] ]; + }, } sub postcode { diff --git a/t/app/controller/admin.t b/t/app/controller/admin.t index df4a72c4b..94a8d28f2 100644 --- a/t/app/controller/admin.t +++ b/t/app/controller/admin.t @@ -1,7 +1,9 @@ use strict; use warnings; use Test::More; +use LWP::Protocol::PSGI; +use t::Mock::MapIt; use FixMyStreet::TestMech; my $mech = FixMyStreet::TestMech->new; @@ -1145,258 +1147,270 @@ $user->update; my $southend = $mech->create_body_ok(2607, 'Southend-on-Sea Borough Council'); -for my $test ( - { - desc => 'edit user name', - fields => { - name => 'Test User', - email => 'test@example.com', - body => $haringey->id, - phone => '', - flagged => undef, - is_superuser => undef, - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, - }, - changes => { - name => 'Changed User', - }, - log_count => 1, - log_entries => [qw/edit/], - }, - { - desc => 'edit user email', - fields => { - name => 'Changed User', - email => 'test@example.com', - body => $haringey->id, - phone => '', - flagged => undef, - is_superuser => undef, - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, - }, - changes => { - email => 'changed@example.com', - }, - log_count => 2, - log_entries => [qw/edit edit/], - }, - { - desc => 'edit user body', - fields => { - name => 'Changed User', - email => 'changed@example.com', - body => $haringey->id, - phone => '', - flagged => undef, - is_superuser => undef, - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, - }, - changes => { - body => $southend->id, - }, - log_count => 3, - log_entries => [qw/edit edit edit/], - }, - { - desc => 'edit user flagged', - fields => { - name => 'Changed User', - email => 'changed@example.com', - body => $southend->id, - phone => '', - flagged => undef, - is_superuser => undef, - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, - }, - changes => { - flagged => 'on', - }, - log_count => 4, - log_entries => [qw/edit edit edit edit/], - }, - { - desc => 'edit user remove flagged', - fields => { - name => 'Changed User', - email => 'changed@example.com', - body => $southend->id, - phone => '', - flagged => 'on', - is_superuser => undef, - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, +FixMyStreet::override_config { + MAPIT_URL => 'http://mapit.uk/', +}, sub { + LWP::Protocol::PSGI->register(t::Mock::MapIt->run_if_script, host => 'mapit.uk'); + for my $test ( + { + desc => 'edit user name', + fields => { + name => 'Test User', + email => 'test@example.com', + body => $haringey->id, + phone => '', + flagged => undef, + is_superuser => undef, + area_id => '', + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + changes => { + name => 'Changed User', + }, + log_count => 1, + log_entries => [qw/edit/], }, - changes => { - flagged => undef, + { + desc => 'edit user email', + fields => { + name => 'Changed User', + email => 'test@example.com', + body => $haringey->id, + phone => '', + flagged => undef, + is_superuser => undef, + area_id => '', + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + changes => { + email => 'changed@example.com', + }, + log_count => 2, + log_entries => [qw/edit edit/], }, - log_count => 4, - log_entries => [qw/edit edit edit edit/], - }, - { - desc => 'edit user add is_superuser', - fields => { - name => 'Changed User', - email => 'changed@example.com', - body => $southend->id, - phone => '', - flagged => undef, - is_superuser => undef, - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, + { + desc => 'edit user body', + fields => { + name => 'Changed User', + email => 'changed@example.com', + body => $haringey->id, + phone => '', + flagged => undef, + is_superuser => undef, + area_id => '', + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + changes => { + body => $southend->id, + }, + log_count => 3, + log_entries => [qw/edit edit edit/], }, - changes => { - is_superuser => 'on', + { + desc => 'edit user flagged', + fields => { + name => 'Changed User', + email => 'changed@example.com', + body => $southend->id, + phone => '', + flagged => undef, + is_superuser => undef, + area_id => '', + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + changes => { + flagged => 'on', + }, + log_count => 4, + log_entries => [qw/edit edit edit edit/], }, - removed => [ - "permissions[moderate]", - "permissions[planned_reports]", - "permissions[report_edit]", - "permissions[report_edit_category]", - "permissions[report_edit_priority]", - "permissions[report_inspect]", - "permissions[report_instruct]", - "permissions[contribute_as_another_user]", - "permissions[contribute_as_body]", - "permissions[user_edit]", - "permissions[user_manage_permissions]", - "permissions[user_assign_body]", - "permissions[user_assign_areas]", - ], - log_count => 5, - log_entries => [qw/edit edit edit edit edit/], - }, - { - desc => 'edit user remove is_superuser', - fields => { - name => 'Changed User', - email => 'changed@example.com', - body => $southend->id, - phone => '', - flagged => undef, - is_superuser => 'on', + { + desc => 'edit user remove flagged', + fields => { + name => 'Changed User', + email => 'changed@example.com', + body => $southend->id, + phone => '', + flagged => 'on', + is_superuser => undef, + area_id => '', + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + changes => { + flagged => undef, + }, + log_count => 4, + log_entries => [qw/edit edit edit edit/], }, - changes => { - is_superuser => undef, + { + desc => 'edit user add is_superuser', + fields => { + name => 'Changed User', + email => 'changed@example.com', + body => $southend->id, + phone => '', + flagged => undef, + is_superuser => undef, + area_id => '', + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + changes => { + is_superuser => 'on', + }, + removed => [ + "permissions[moderate]", + "permissions[planned_reports]", + "permissions[report_edit]", + "permissions[report_edit_category]", + "permissions[report_edit_priority]", + "permissions[report_inspect]", + "permissions[report_instruct]", + "permissions[contribute_as_another_user]", + "permissions[contribute_as_body]", + "permissions[user_edit]", + "permissions[user_manage_permissions]", + "permissions[user_assign_body]", + "permissions[user_assign_areas]", + ], + log_count => 5, + log_entries => [qw/edit edit edit edit edit/], }, - added => { - "permissions[moderate]" => undef, - "permissions[planned_reports]" => undef, - "permissions[report_edit]" => undef, - "permissions[report_edit_category]" => undef, - "permissions[report_edit_priority]" => undef, - "permissions[report_inspect]" => undef, - "permissions[report_instruct]" => undef, - "permissions[contribute_as_another_user]" => undef, - "permissions[contribute_as_body]" => undef, - "permissions[user_edit]" => undef, - "permissions[user_manage_permissions]" => undef, - "permissions[user_assign_body]" => undef, - "permissions[user_assign_areas]" => undef, + { + desc => 'edit user remove is_superuser', + fields => { + name => 'Changed User', + email => 'changed@example.com', + body => $southend->id, + phone => '', + flagged => undef, + is_superuser => 'on', + area_id => '', + }, + changes => { + is_superuser => undef, + }, + added => { + "permissions[moderate]" => undef, + "permissions[planned_reports]" => undef, + "permissions[report_edit]" => undef, + "permissions[report_edit_category]" => undef, + "permissions[report_edit_priority]" => undef, + "permissions[report_inspect]" => undef, + "permissions[report_instruct]" => undef, + "permissions[contribute_as_another_user]" => undef, + "permissions[contribute_as_body]" => undef, + "permissions[user_edit]" => undef, + "permissions[user_manage_permissions]" => undef, + "permissions[user_assign_body]" => undef, + "permissions[user_assign_areas]" => undef, + }, + log_count => 5, + log_entries => [qw/edit edit edit edit edit/], }, - log_count => 5, - log_entries => [qw/edit edit edit edit edit/], - }, -) { - subtest $test->{desc} => sub { - $mech->get_ok( '/admin/user_edit/' . $user->id ); + ) { + subtest $test->{desc} => sub { + $mech->get_ok( '/admin/user_edit/' . $user->id ); - my $visible = $mech->visible_form_values; - is_deeply $visible, $test->{fields}, 'expected user'; + my $visible = $mech->visible_form_values; + is_deeply $visible, $test->{fields}, 'expected user'; - my $expected = { - %{ $test->{fields} }, - %{ $test->{changes} } - }; + my $expected = { + %{ $test->{fields} }, + %{ $test->{changes} } + }; - $mech->submit_form_ok( { with_fields => $expected } ); + $mech->submit_form_ok( { with_fields => $expected } ); - # Some actions cause visible fields to be added/removed - foreach my $x (@{ $test->{removed} }) { - delete $expected->{$x}; - } - if ( $test->{added} ) { - $expected = { - %$expected, - %{ $test->{added} } - }; - } + # Some actions cause visible fields to be added/removed + foreach my $x (@{ $test->{removed} }) { + delete $expected->{$x}; + } + if ( $test->{added} ) { + $expected = { + %$expected, + %{ $test->{added} } + }; + } - $visible = $mech->visible_form_values; - is_deeply $visible, $expected, 'user updated'; + $visible = $mech->visible_form_values; + is_deeply $visible, $expected, 'user updated'; - $mech->content_contains( 'Updated!' ); - }; -} + $mech->content_contains( 'Updated!' ); + }; + } +}; 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 } ); diff --git a/t/app/controller/admin_permissions.t b/t/app/controller/admin_permissions.t index 63b753ff3..bb4a95718 100644 --- a/t/app/controller/admin_permissions.t +++ b/t/app/controller/admin_permissions.t @@ -168,7 +168,12 @@ FixMyStreet::override_config { ok $user2->has_permission_to("moderate", $user2->from_body->id), "user2 has been granted moderate permission"; }; - subtest "Unsetting user from_body removes all permissions " => sub { + $oxfordshireuser->user_body_permissions->create({ + body => $oxfordshire, + permission_type => 'user_assign_areas', + }); + + subtest "Unsetting user from_body removes all permissions and area " => sub { is $user2->user_body_permissions->count, 1, 'user2 has 1 permission'; $mech->get_ok("/admin/user_edit/$user2_id"); @@ -193,6 +198,7 @@ FixMyStreet::override_config { } } ); is $user2->user_body_permissions->count, 0, 'user2 has had permissions removed'; + is $user2->area_id, undef, 'user2 has had area removed'; }; }; diff --git a/templates/web/base/admin/user-form.html b/templates/web/base/admin/user-form.html index 5bca4171a..c22480011 100644 --- a/templates/web/base/admin/user-form.html +++ b/templates/web/base/admin/user-form.html @@ -1,4 +1,4 @@ -<form method="post" action="[% c.uri_for( 'user_edit', user.id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8"> +<form method="post" id="user_edit" action="[% c.uri_for( 'user_edit', user.id ) %]" enctype="application/x-www-form-urlencoded" accept-charset="utf-8"> <input type="hidden" name="token" value="[% csrf_token %]" > <input type="hidden" name="submit" value="1" > @@ -38,7 +38,7 @@ [% loc('Body:') %] <select id='body' name='body'> <option value=''>[% loc('No body') %]</option> [% FOR body IN bodies %] - <option value="[% body.id %]"[% ' selected' IF body.id == user.from_body.id %]>[% body.name %]</option> + <option value="[% body.id %]"[% ' selected data-originally-selected' IF body.id == user.from_body.id %]>[% body.name %]</option> [% END %] </select> </li> @@ -53,6 +53,27 @@ </li> [% END %] + [% IF areas %] + <li> + <div class="admin-hint"> + <p> + [% loc( + "Normal (public) users should not be associated with any <strong>area</strong>.<br> + Authorised staff users can be associated with the area in which they operate.") + %] + </p> + </div> + [% loc('Area:') %] + <select id='area_id' name='area_id' [% 'disabled' UNLESS c.user.has_permission_to('user_assign_areas', user.from_body.id) %]> + <option value=''>[% loc('No area') %]</option> + [% FOREACH area IN areas %] + <option value="[% area.id %]"[% ' selected' IF area.id == user.area_id %]>[% area.name | html %]</option> + [% END %] + </select> + </li> + [% END %] + + [% IF c.cobrand.moniker != 'zurich' %] <li> <div class="admin-hint"> diff --git a/web/js/fixmystreet-admin.js b/web/js/fixmystreet-admin.js index 1b6624b9b..aa79a9b46 100644 --- a/web/js/fixmystreet-admin.js +++ b/web/js/fixmystreet-admin.js @@ -73,5 +73,11 @@ $(function(){ $( "#start_date" ).datepicker( "option", "maxDate", selectedDate ); } }); + + // On user edit page, hide the area select field if body changes + $("form#user_edit select#body").change(function() { + var show_area = $(this).val() == $(this).find("[data-originally-selected]").val(); + $("form#user_edit select#area_id").closest("li").toggle(show_area); + }); }); |