admin_groups strict
[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 use strict;
38
39 sub edit_groups {
40   $main::lxdebug->enter_sub();
41
42   my $form     = $main::form;
43
44   my @groups = sort { lc $a->{name} cmp lc $b->{name} } values %{ $main::auth->read_groups() };
45
46   $form->header();
47   print $form->parse_html_template("admin/edit_groups", { 'GROUPS'     => \@groups,
48                                                           'num_groups' => scalar @groups });
49
50   $main::lxdebug->leave_sub();
51 }
52
53 sub add_group {
54   $main::lxdebug->enter_sub();
55
56   my $form     = $main::form;
57   my $locale   = $main::locale;
58
59   delete $form->{group_id};
60   $form->{message} = $locale->text("The group has been added.");
61
62   save_group();
63
64   $main::lxdebug->leave_sub();
65 }
66
67 sub save_group {
68   $main::lxdebug->enter_sub();
69
70   my $form     = $main::form;
71   my $locale   = $main::locale;
72
73   $form->isblank('name', $locale->text('The group name is missing.'));
74
75   my $groups = $main::auth->read_groups();
76
77   foreach my $group (values %{$groups}) {
78     if (($form->{group_id} != $group->{id})
79         && ($form->{name} eq $group->{name})) {
80       $form->show_generic_error($locale->text("A group with that name does already exist."));
81     }
82   }
83
84   my $group;
85
86   if ($form->{group_id} && $groups->{$form->{group_id}}) {
87     $group = $groups->{$form->{group_id}};
88
89   } else {
90     $group = { };
91   }
92
93   $group->{name}        = $form->{name};
94   $group->{description} = $form->{description};
95   $group->{rights}      = {};
96
97   map { $group->{rights}->{$_} = $form->{"${_}_granted"} ? 1 : 0 } SL::Auth::all_rights();
98
99   my $is_new = !$form->{group_id};
100
101   $main::auth->save_group($group);
102
103   $form->{message} ||= $locale->text('The group has been saved.');
104
105   if ($is_new) {
106     edit_groups();
107
108   } else {
109     edit_group();
110   }
111
112   $main::lxdebug->leave_sub();
113 }
114
115 sub edit_group {
116   $main::lxdebug->enter_sub();
117
118   my $form     = $main::form;
119   my $locale   = $main::locale;
120
121   my $groups = $main::auth->read_groups();
122
123   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
124     $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
125   }
126
127   my $group = $groups->{$form->{group_id}};
128
129   my %all_users   = $main::auth->read_all_users();
130   my %users_by_id = map { $_->{id} => $_ } values %all_users;
131
132   my @members     = uniq sort { lc $a->{login} cmp lc $b->{login} } @users_by_id{ @{ $group->{members} } };
133
134   my %grouped     = map { $_ => 1 } uniq @{ $group->{members} };
135   my @non_members = sort { lc $a->{login} cmp lc $b->{login} } grep { !$grouped{$_->{id}} } values %all_users;
136
137   my @rights = map {
138     { "right"       => $_->[0],
139       "description" => $_->[1],
140       "is_section"  => '--' eq substr($_->[0], 0, 2),
141       "granted"     => defined $group->{rights}->{$_->[0]} ? $group->{rights}->{$_->[0]} : 0,
142     }
143   } SL::Auth::all_rights_full();
144
145   $form->header();
146   print $form->parse_html_template("admin/edit_group", { "USERS_IN_GROUP"     => \@members,
147                                                          "USERS_NOT_IN_GROUP" => \@non_members,
148                                                          "RIGHTS"             => \@rights,
149                                                          "name"               => $group->{name},
150                                                          "description"        => $group->{description} });
151
152   $main::lxdebug->leave_sub();
153 }
154
155 sub delete_group {
156   $main::lxdebug->enter_sub();
157
158   my $form     = $main::form;
159   my $locale   = $main::locale;
160
161   my $groups = $main::auth->read_groups();
162
163   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
164     $form->show_generic_error($locale->text("No group has been selected, or the group does not exist anymore."));
165   }
166
167   if ($form->{confirmed}) {
168     $main::auth->delete_group($form->{"group_id"});
169
170     $form->{message} = $locale->text("The group has been deleted.");
171     edit_groups();
172
173   } else {
174
175     $form->header();
176     print $form->parse_html_template("admin/delete_group_confirm", $groups->{$form->{group_id}});
177   }
178
179   $main::lxdebug->leave_sub();
180 }
181
182 sub add_to_group {
183   $main::lxdebug->enter_sub();
184
185   my $form     = $main::form;
186   my $locale   = $main::locale;
187
188   $form->isblank('user_id_not_in_group', $locale->text('No user has been selected.'));
189
190   my $groups = $main::auth->read_groups();
191
192   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
193     $form->show_generic_error($locale->text('No group has been selected, or the group does not exist anymore.'));
194   }
195
196   my $group = $groups->{$form->{group_id}};
197   $group->{members} = [ uniq @{ $group->{members} }, $form->{user_id_not_in_group} ];
198
199   $main::auth->save_group($group);
200
201   $form->{message} = $locale->text('The user has been added to this group.');
202   edit_group();
203
204   $main::lxdebug->leave_sub();
205 }
206
207 sub remove_from_group {
208   $main::lxdebug->enter_sub();
209
210   my $form     = $main::form;
211   my $locale   = $main::locale;
212
213   $form->isblank('user_id_in_group', $locale->text('No user has been selected.'));
214
215   my $groups = $main::auth->read_groups();
216
217   if (!$form->{group_id} || !$groups->{$form->{group_id}}) {
218     $form->show_generic_error($locale->text('No group has been selected, or the group does not exist anymore.'));
219   }
220
221   my $group            = $groups->{$form->{group_id}};
222   $group->{members} = [ uniq grep { $_ ne $form->{user_id_in_group} } @{ $group->{members} } ];
223
224   $main::auth->save_group($group);
225
226   $form->{message} = $locale->text('The user has been removed from this group.');
227   edit_group();
228
229   $main::lxdebug->leave_sub();
230 }
231
232 sub edit_group_membership {
233   $main::lxdebug->enter_sub();
234
235   my $form     = $main::form;
236   my $locale   = $main::locale;
237
238   my %users  = $main::auth->read_all_users();
239   my $groups = $main::auth->read_groups();
240   $groups    = [ sort { lc $a->{name} cmp lc $b->{name} } values %{ $groups } ];
241
242   my @headings = map { { 'title' => $_ } } map { $_->{name} } @{ $groups };
243
244   foreach my $group (@{ $groups }) {
245     $group->{members_h} = { map { $_ => 1 } @{ $group->{members} } };
246   }
247
248   my @rows;
249
250   foreach my $user (sort { lc $a->{login} cmp lc $b->{login} } values %users) {
251     my $row = {
252       'id'              => $user->{id},
253       'login'           => $user->{login},
254       'name'            => $user->{name},
255       'repeat_headings' => (scalar(@rows) % 20) == 0,
256       'GROUPS'          => [],
257     };
258
259     foreach my $group (@{ $groups }) {
260       push @{ $row->{GROUPS} }, {
261         'id'        => $group->{id},
262         'is_member' => $group->{members_h}->{$user->{id}},
263       };
264     }
265
266     push @rows, $row;
267   }
268
269   $form->{title} = $locale->text('Edit group membership');
270   $form->header();
271   print $form->parse_html_template('admin/edit_group_membership', { 'HEADINGS' => \@headings, 'USERS' => \@rows });
272
273   $main::lxdebug->leave_sub();
274 }
275
276 sub save_group_membership {
277   $main::lxdebug->enter_sub();
278
279   my $form     = $main::form;
280   my $locale   = $main::locale;
281
282   my %users  = $main::auth->read_all_users();
283   my $groups = $main::auth->read_groups();
284
285   foreach my $group (values %{ $groups }) {
286     $group->{members} = [ ];
287
288     foreach my $user (values %users) {
289       push @{ $group->{members} }, $user->{id} if ($form->{"u_$user->{id}_g_$group->{id}"});
290     }
291
292     $main::auth->save_group($group);
293   }
294
295   $form->{message} = $locale->text('The group memberships have been saved.');
296
297   edit_groups();
298
299   $main::lxdebug->leave_sub();
300 }
301
302 1;