aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDave Arter <davea@mysociety.org>2016-08-22 11:34:02 +0100
committerDave Arter <davea@mysociety.org>2016-08-22 11:34:02 +0100
commitec5e2c47f736c075e6dafd1ed63860287f596077 (patch)
treea1cacec534da24c011c0c204b0b03c014e272eff
parent618b9a32cec0c045a8e3e910fd38f89f4aa9203a (diff)
parent05f04f40aa2c4fef44474f7057a92f6685387e7e (diff)
Merge branch 'issues/forcouncils/37-user-area-management'
-rwxr-xr-xbin/update-schema1
-rw-r--r--db/downgrade_0043---0042.sql3
-rw-r--r--db/schema.sql3
-rw-r--r--db/schema_0043-add-user-area-field.sql4
-rw-r--r--perllib/FixMyStreet/App/Controller/Admin.pm39
-rw-r--r--perllib/FixMyStreet/DB/Result/User.pm6
-rw-r--r--t/Mock/MapIt.pm23
-rw-r--r--t/app/controller/admin.t492
-rw-r--r--t/app/controller/admin_permissions.t8
-rw-r--r--templates/web/base/admin/user-form.html25
-rw-r--r--web/js/fixmystreet-admin.js6
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);
+ });
});