aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--CHANGELOG.md2
-rw-r--r--perllib/FixMyStreet/DB/Result/User.pm19
-rw-r--r--t/app/controller/admin/roles.t9
3 files changed, 25 insertions, 5 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 38aeb4ad9..48d866c13 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,6 +1,8 @@
## Releases
* Unreleased
+ - Admin improvements:
+ - Add new roles system, to group permissions and apply to users.
- Bugfixes:
- Prevent creation of two templates with same title.
- Fix bug going between report/new pages client side
diff --git a/perllib/FixMyStreet/DB/Result/User.pm b/perllib/FixMyStreet/DB/Result/User.pm
index 9dc5df856..fc651b4d1 100644
--- a/perllib/FixMyStreet/DB/Result/User.pm
+++ b/perllib/FixMyStreet/DB/Result/User.pm
@@ -382,7 +382,18 @@ has body_permissions => (
lazy => 1,
default => sub {
my $self = shift;
- return [ $self->user_body_permissions->all ];
+ my $perms = [];
+ foreach my $role ($self->roles->all) {
+ push @$perms, map { {
+ body_id => $role->body_id,
+ permission => $_,
+ } } @{$role->permissions};
+ }
+ push @$perms, map { {
+ body_id => $_->body_id,
+ permission => $_->permission_type,
+ } } $self->user_body_permissions->all;
+ return $perms;
},
);
@@ -399,8 +410,8 @@ sub permissions {
return unless $self->belongs_to_body($body_id);
- my @permissions = grep { $_->body_id == $self->from_body->id } @{$self->body_permissions};
- return { map { $_->permission_type => 1 } @permissions };
+ my @permissions = grep { $_->{body_id} == $self->from_body->id } @{$self->body_permissions};
+ return { map { $_->{permission} => 1 } @permissions };
}
sub has_permission_to {
@@ -422,7 +433,7 @@ sub has_permission_to {
my %body_ids = map { $_ => 1 } @$body_ids;
foreach (@{$self->body_permissions}) {
- return 1 if $_->permission_type eq $permission_type && $body_ids{$_->body_id};
+ return 1 if $_->{permission} eq $permission_type && $body_ids{$_->{body_id}};
}
return 0;
}
diff --git a/t/app/controller/admin/roles.t b/t/app/controller/admin/roles.t
index 77c5b0033..6dd40cbb6 100644
--- a/t/app/controller/admin/roles.t
+++ b/t/app/controller/admin/roles.t
@@ -87,16 +87,23 @@ FixMyStreet::override_config {
roles => 'Role B',
}});
$mech->content_like(qr/<option[^>]*selected>Role B/);
+ $mech->content_like(qr/<input[^>]*checkbox[^>]*template_edit[^>]*checked/);
is $user->roles->count, 1, 'in one role';
is $user->user_body_permissions->count, 0, 'permissions removed';
};
+ subtest 'check user has the permissions of the role' => sub {
+ $mech->log_in_ok($user->email);
+ $mech->get_ok('/admin/templates');
+ };
+
subtest 'remove user from role' => sub {
+ $mech->log_in_ok( $editor->email );
+ $mech->get_ok('/admin/users/' . $user->id);
$mech->submit_form_ok({ with_fields => {
roles => undef,
}}, 'remove role');
};
-
};
subtest 'superuser can see all bodies' => sub {