d84e2e5413e814127a123090f13d3e0fd5b27a93
[kivitendo-erp.git] / bin / mozilla / admin_groups.pl
1 #=====================================================================
2 # LX-Office ERP
3 # Copyright (C) 2004
4 # Based on SQL-Ledger Version 2.1.9
5 # Web http://www.lx-office.org
6 #
7 #=====================================================================
8 # SQL-Ledger Accounting
9 # Copyright (c) 2002
10 #
11 #  Author: Moritz Bunkus
12 #   Email: mbunkus@linet-services.de
13 #     Web: www.linet-services.de
14 #
15 #
16 # This program is free software; you can redistribute it and/or modify
17 # it under the terms of the GNU General Public License as published by
18 # the Free Software Foundation; either version 2 of the License, or
19 # (at your option) any later version.
20 #
21 # This program is distributed in the hope that it will be useful,
22 # but WITHOUT ANY WARRANTY; without even the implied warranty of
23 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24 # GNU General Public License for more details.
25 # You should have received a copy of the GNU General Public License
26 # along with this program; if not, write to the Free Software
27 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
28 #======================================================================
29 #
30 # group administration module
31 # add/edit/delete user groups
32 #
33 #======================================================================
34
35 use List::MoreUtils qw(uniq);
36
37 sub edit_groups {
38   $lxdebug->enter_sub();
39
40   my @groups = sort { lc $a->{name} cmp lc $b->{name} } values %{ $auth->read_groups() };
41
42   $form->header();
43   print $form->parse_html_template("admin/edit_groups", { 'GROUPS'     => \@groups,
44                                                           'num_groups' => scalar @groups });
45
46   $lxdebug->leave_sub();
47 }
48
49 sub add_group {
50   $lxdebug->enter_sub();
51
52   delete $form->{group_id};
53   $form->{message} = $locale->text("The group has been added.");
54
55   save_group();
56
57   $lxdebug->leave_sub();
58 }
59
60 sub save_group {
61   $lxdebug->enter_sub();
62
63   $form->isblank('name', $locale->text('The group name is missing.'));
64
65   my $groups = $auth->read_groups();
66
67   foreach my $group (values %{$groups}) {
68     if (($form->{group_id} != $group->{id})
69         && ($form->{name} eq $group->{name})) {
70       $form->show_generic_error($locale->text("A group with that name does already exist."));
71     }
72   }
73
74   my $group;
75
76   if ($form->{group_id} && $groups->{$form->{group_id}}) {
77     $group = $groups->{$form->{group_id}};
78
79   } else {
80     $group = { };
81   }
82
83   $group->{name}        = $form->{name};
84   $group->{description} = $form->{description};
85   $group->{rights}      = {};
86
87   map { $group->{rights}->{$_} = $form->{"${_}_granted"} ? 1 : 0 } SL::Auth::all_rights();
88
89   my $is_new = !$form->{group_id};
90
91   $auth->save_group($group);
92
93   $form->{message} ||= $locale->text('The group has been saved.');
94
95   if ($is_new) {
96     edit_groups();
97
98   } else {
99     edit_group();
100   }
101
102   $lxdebug->leave_sub();
103 }
104
105 sub edit_group {
106   $lxdebug->enter_sub();
107
108   my $groups = $auth->read_groups();
109
110   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
111     $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
112   }
113
114   $group = $groups->{$form->{group_id}};
115
116   my %all_users   = $auth->read_all_users();
117   my %users_by_id = map { $_->{id} => $_ } values %all_users;
118
119   my @members     = uniq sort { lc $a->{login} cmp lc $b->{login} } @users_by_id{ @{ $group->{members} } };
120
121   my %grouped     = map { $_ => 1 } uniq @{ $group->{members} };
122   my @non_members = sort { lc $a->{login} cmp lc $b->{login} } grep { !$grouped{$_->{id}} } values %all_users;
123
124   my @rights = map {
125     { "right"       => $_->[0],
126       "description" => $_->[1],
127       "is_section"  => '--' eq substr($_->[0], 0, 2),
128       "granted"     => defined $group->{rights}->{$_->[0]} ? $group->{rights}->{$_->[0]} : 0,
129     }
130   } SL::Auth::all_rights_full();
131
132   $form->header();
133   print $form->parse_html_template("admin/edit_group", { "USERS_IN_GROUP"     => \@members,
134                                                          "USERS_NOT_IN_GROUP" => \@non_members,
135                                                          "RIGHTS"             => \@rights,
136                                                          "name"               => $group->{name},
137                                                          "description"        => $group->{description} });
138
139   $lxdebug->leave_sub();
140 }
141
142 sub delete_group {
143   $lxdebug->enter_sub();
144
145   my $groups = $auth->read_groups();
146
147   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
148     $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
149   }
150
151   if ($form->{confirmed}) {
152     $auth->delete_group($form->{"group_id"});
153
154     $form->{message} = $locale->text("The group has been deleted.");
155     edit_groups();
156
157   } else {
158
159     $form->header();
160     print $form->parse_html_template("admin/delete_group_confirm", $groups->{$form->{group_id}});
161   }
162
163   $lxdebug->leave_sub();
164 }
165
166 sub add_to_group {
167   $lxdebug->enter_sub();
168
169   $form->isblank('user_id_not_in_group', $locale->text('No user has been selected.'));
170
171   my $groups = $auth->read_groups();
172
173   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
174     $form->show_generic_error($locale->text('No group has been selected, or the group does not exist anymore.'));
175   }
176
177   $group = $groups->{$form->{group_id}};
178   $group->{members} = [ uniq @{ $group->{members} }, $form->{user_id_not_in_group} ];
179
180   $auth->save_group($group);
181
182   $form->{message} = $locale->text('The user has been added to this group.');
183   edit_group();
184
185   $lxdebug->leave_sub();
186 }
187
188 sub remove_from_group {
189   $lxdebug->enter_sub();
190
191   $form->isblank('user_id_in_group', $locale->text('No user has been selected.'));
192
193   my $groups = $auth->read_groups();
194
195   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
196     $form->show_generic_error($locale->text('No group has been selected, or the group does not exist anymore.'));
197   }
198
199   $group            = $groups->{$form->{group_id}};
200   $group->{members} = [ uniq grep { $_ ne $form->{user_id_in_group} } @{ $group->{members} } ];
201
202   $auth->save_group($group);
203
204   $form->{message} = $locale->text('The user has been removed from this group.');
205   edit_group();
206
207   $lxdebug->leave_sub();
208 }
209
210 sub edit_group_membership {
211   $lxdebug->enter_sub();
212
213   my %users  = $auth->read_all_users();
214   my $groups = $auth->read_groups();
215   $groups    = [ sort { lc $a->{name} cmp lc $b->{name} } values %{ $groups } ];
216
217   my @headings = map { { 'title' => $_ } } map { $_->{name} } @{ $groups };
218
219   foreach my $group (@{ $groups }) {
220     $group->{members_h} = { map { $_ => 1 } @{ $group->{members} } };
221   }
222
223   my @rows;
224
225   foreach my $user (sort { lc $a->{login} cmp lc $b->{login} } values %users) {
226     my $row = {
227       'id'              => $user->{id},
228       'login'           => $user->{login},
229       'name'            => $user->{name},
230       'repeat_headings' => (scalar(@rows) % 20) == 0,
231       'GROUPS'          => [],
232     };
233
234     foreach my $group (@{ $groups }) {
235       push @{ $row->{GROUPS} }, {
236         'id'        => $group->{id},
237         'is_member' => $group->{members_h}->{$user->{id}},
238       };
239     }
240
241     push @rows, $row;
242   }
243
244   $form->{title} = $locale->text('Edit group membership');
245   $form->header();
246   print $form->parse_html_template('admin/edit_group_membership', { 'HEADINGS' => \@headings, 'USERS' => \@rows });
247
248   $lxdebug->leave_sub();
249 }
250
251 sub save_group_membership {
252   $lxdebug->enter_sub();
253
254   my %users  = $auth->read_all_users();
255   my $groups = $auth->read_groups();
256
257   foreach my $group (values %{ $groups }) {
258     $group->{members} = [ ];
259
260     foreach my $user (values %users) {
261       push @{ $group->{members} }, $user->{id} if ($form->{"u_$user->{id}_g_$group->{id}"});
262     }
263
264     $auth->save_group($group);
265   }
266
267   $form->{message} = $locale->text('The group memberships have been saved.');
268
269   edit_groups();
270
271   $lxdebug->leave_sub();
272 }
273
274 1;