1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
|
package FixMyStreet::App::Controller::Admin::Roles;
use Moose;
use namespace::autoclean;
BEGIN { extends 'Catalyst::Controller'; }
use FixMyStreet::App::Form::Role;
sub auto :Private {
my ($self, $c) = @_;
my $user = $c->user;
if ($user->is_superuser) {
$c->stash(rs => $c->model('DB::Role')->search_rs({}, {
prefetch => 'body',
order_by => ['body.name', 'me.name']
}));
} elsif ($user->from_body) {
$c->stash(rs => $user->from_body->roles->search_rs({}, { order_by => 'name' }));
}
}
sub index :Path :Args(0) {
my ($self, $c) = @_;
my $p = $c->cobrand->available_permissions;
my %labels;
foreach my $group (sort keys %$p) {
my $group_vals = $p->{$group};
foreach (sort keys %$group_vals) {
$labels{$_} = $group_vals->{$_};
}
}
$c->stash(
roles => [ $c->stash->{rs}->all ],
labels => \%labels,
);
}
sub create :Local :Args(0) {
my ($self, $c) = @_;
my $role = $c->stash->{rs}->new_result({});
return $self->form($c, $role);
}
sub item :PathPart('admin/roles') :Chained :CaptureArgs(1) {
my ($self, $c, $id) = @_;
my $obj = $c->stash->{rs}->find($id)
or $c->detach('/page_error_404_not_found', []);
$c->stash(obj => $obj);
}
sub edit :PathPart('') :Chained('item') :Args(0) {
my ($self, $c) = @_;
return $self->form($c, $c->stash->{obj});
}
sub form {
my ($self, $c, $role) = @_;
if ($c->get_param('delete_role')) {
$role->delete;
$c->forward('/admin/log_edit', [ $role->id, 'role', 'delete' ]);
$c->response->redirect($c->uri_for($self->action_for('index')));
$c->detach;
}
my $perms = [];
my $p = $c->cobrand->available_permissions;
foreach my $group (sort keys %$p) {
my $group_vals = $p->{$group};
my @foo;
foreach (sort keys %$group_vals) {
push @foo, { value => $_, label => $group_vals->{$_} };
}
push @$perms, { group => $group, options => \@foo };
}
my $opts = {
field_list => [
'+permissions' => { options => $perms },
],
};
if (!$c->user->is_superuser && $c->user->from_body) {
push @{$opts->{field_list}}, '+body', { inactive => 1 };
$opts->{body_id} = $c->user->from_body->id;
}
my $action = $role->in_storage ? 'edit' : 'add';
my $form = FixMyStreet::App::Form::Role->new(%$opts);
$c->stash(template => 'admin/roles/form.html', form => $form);
$form->process(item => $role, params => $c->req->params);
return unless $form->validated;
$c->forward('/admin/log_edit', [ $role->id, 'role', $action ]);
$c->response->redirect($c->uri_for($self->action_for('index')));
}
1;
|