source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Group.pm @ 1904

Last change on this file since 1904 was 1904, checked in by nanardon, 7 years ago

Don't poupulate alias and group with object alias

  • Property svn:keywords set to Id Rev
File size: 8.9 KB
Line 
1package LATMOS::Accounts::Bases::Sql::Group;
2
3use 5.010000;
4use strict;
5use warnings;
6use overload '""' => 'stringify';
7
8use base qw(LATMOS::Accounts::Bases::Sql::objects);
9use LATMOS::Accounts::Log;
10use LATMOS::Accounts::I18N;
11
12our $VERSION = (q$Rev$ =~ /^Rev: (\d+) /)[0];
13
14=head1 NAME
15
16LATMOS::Accounts::Bases::Sql::Group - Groups objects support
17
18=cut
19
20sub stringify {
21    my ($self) = @_;
22
23    $self->get_field('label')
24    || $self->id;
25}
26
27sub _object_table { 'group' }
28
29sub _key_field { 'name' }
30
31sub _has_extended_attributes { 1 }
32
33sub _get_attr_schema {
34    my ($class, $base) = @_;
35
36    $class->SUPER::_get_attr_schema($base,
37        {
38            gidNumber  => {
39                inline => 1,
40                uniq => 1,
41                iname => 'gidnumber',
42                mandatory => 1, 
43                label => l('GID'),
44            },
45            gidnumber  => { inline => 1, uniq => 1, hide => 1, },
46            cn         => { inline => 1, ro => 1, iname => 'name', },
47            memberUID  => {
48                monitored => 1,
49                hide => 1,
50                reference => 'user',
51                multiple => 1,
52                delayed => 1,
53                ro => sub {
54                    $_[0] && 
55                    (($_[0]->_get_c_field('sutype') ||'') =~ /^(jobtype|contrattype)$/
56                     || $_[0]->_get_c_field('autoMemberFilter')
57                     || $_[0]->_get_c_field('autoFromSutype'))
58                    ? 1 : 0 
59                },
60                get => sub {
61                    my ($self) = @_; 
62                    my $sth = $self->base->db->prepare_cached(
63                        q{
64                        select value from group_attributes
65                        join "group" on "group".ikey = group_attributes.okey
66                        join "user" on "user".name = group_attributes.value
67                        where "group".name = ? and attr = ?
68                        } .
69                        ($self->base->{wexported} ? '' : 'and "user".exported = true')
70                    );
71                    $sth->execute($self->object->id, 'memberUID');
72                    my @res;
73                    while (my $res = $sth->fetchrow_hashref) {
74                        push(@res, $res->{value});
75                    }
76                    return \@res;
77                },
78                set => sub {
79                    my ($self, $data) = @_;
80                    $self->object->_set_group_members($data);
81                },
82                label => l('Member'),
83            },
84            member     => {
85                monitored => 1,
86                reference => 'user',
87                multiple => 1, 
88                delayed => 1,
89                iname => 'memberUID',
90                can_values => sub { $base->list_objects('user') },
91                ro => sub {
92                    $_[0] && 
93                    (($_[0]->_get_c_field('sutype') ||'') =~ /^(jobtype|contrattype)$/
94                     || $_[0]->_get_c_field('autoMemberFilter')
95                     || $_[0]->_get_c_field('autoFromSutype'))
96                    ? 1 : 0 
97                },
98                get => sub {
99                    my ($self) = @_;
100                    $self->object->_get_c_field('memberUID');
101                },
102                set => sub {
103                    my ($self, $data) = @_;
104                    $self->object->_set_group_members($data);
105                },
106                label => l('Member'),
107            },
108            sAMAccountName => { iname => 'name', ro => 1 },
109            groupname  => { ro => 1 },
110            managedBy  => {
111                monitored => 1,
112                reference => 'user',
113                can_values => sub {
114                    my %uniq = map { $_ => 1 } grep { $_ }
115                    ($_[1] ? $_[1]->get_attributes('manager') : ()),
116                    $base->search_objects('user', 'active=*');
117                    sort keys %uniq;
118                },
119                label => l('Manager'),
120            },
121            managedAlsoBy  => {
122                monitored => 1,
123                reference => 'user',
124                multiple => 1,
125                delayed => 1,
126                can_values => sub {
127                    my %uniq = map { $_ => 1 } grep { $_ }
128                    ($_[1] ? $_[1]->get_attributes('manager') : ()),
129                    $base->search_objects('user', 'active=*');
130                    sort keys %uniq;
131                },
132                label => l('Secondary Manager'),
133            },
134            sutype => {
135                reference => 'sutype',
136                monitored => 1,
137                label => l('Structure'),
138                multiple => 1,
139            },
140            autoMemberFilter => {
141                multiple => 1,
142                set => sub {
143                    my ($self, $data) = @_;
144                    $self->object->set_fields($self->name, $data) or return;
145                    $self->object->populate_dyn_group;
146                    return 1;
147                },
148                label => l('Automatics filters'),
149            },
150            autoFromSutype => {
151                reference => 'sutype',
152                multiple => 1,
153                set => sub {
154                    my ($self, $data) = @_;
155                    $self->object->set_fields($self->name, $data) or return;
156                    $self->object->populate_dyn_group;
157                    return 1;
158                },
159                label => l('From group type'),
160            },
161            label => {
162                label => l('Label'),
163            },
164            expire => {
165                label => l('Expire'),
166            },
167            description => {
168                label => l('Description'),
169            },
170            comment => {
171                label => l('Comment'),
172            },
173            memberCount => {
174                managed => 1,
175                ro => 1,
176                get => sub {
177                    my ($self) = @_;
178                    scalar(@{$self->object->_get_c_field('memberUID') || []});
179                },
180                label => l('Member count'),
181            },
182        }
183    )
184}
185
186sub _set_group_members {
187    my ($self, $members) = @_;
188    my %member;
189    my $res = 0;
190    foreach (@{ $self->_get_c_field('memberUID') || [] }) {
191        $member{$_}{c} = 1;
192    }
193    foreach (ref $members ? @{ $members || []} : $members) {
194        $_ or next; # avoid undef
195        $member{$_}{n} = 1;
196    }
197
198    foreach (keys %member) {
199        $member{$_}{c} && $member{$_}{n} and next; # no change !
200        my $user = $self->base->get_object('user', $_) or next;
201        if ($member{$_}{n}) {
202            my $sth = $self->db->prepare_cached(
203                q{insert into group_attributes_users (value, attr, okey) values (?,?,?)}
204            );
205            $res += $sth->execute($_, 'memberUID', $self->_get_ikey);
206        } elsif ($member{$_}{c}) {
207            if (($user->get_c_field('department') || '') eq $self->id) {
208                $self->base->log(LA_WARN,
209                    "Don't removing user %s from group %s: is it's department",
210                    $user->id, $self->id);
211                next;
212            }
213            my $sth = $self->db->prepare_cached(
214                q{delete from group_attributes_users where value = ? and attr = ? and okey = ?}
215            );
216            $res += $sth->execute($_, 'memberUID', $self->_get_ikey);
217        } # else {} # can't happend
218    }
219    return $res;
220}
221
222=head2 populate_dyn_group
223
224Synchronise group's members according filter set into C<autoMemberFilter> attribute.
225
226=cut
227
228sub populate_dyn_group {
229    my ($self) = @_;
230
231    if (
232           !$self->get_field('autoMemberFilter')
233        && !$self->get_field('autoFromSutype')) {
234        return 0;
235    }
236    $self->base->log(LA_DEBUG,
237        "Populating group %s from autoMemberFilter/autoFromSutype attribute",
238        $self->id
239    );
240
241    my %users;
242
243    if (my $filter = $self->get_field('autoFromSutype')) {
244        my @suTypeFilter = map { "sutype=$_" } (ref $filter ? @{ $filter } : $filter);
245        foreach my $group ($self->base->search_objects('group', @suTypeFilter)) {
246            foreach ($self->base->search_objects('user', "memberOf=$group")) {
247                $users{$_} = 1;
248            }
249        }
250    }
251
252   
253    if (my $filter = $self->get_field('autoMemberFilter')) {
254        foreach ($self->base->search_objects(
255                'user',
256                'oalias=NULL',
257                ref $filter ? @{ $filter } : $filter)) {
258            $users{$_} = 1;
259        }
260    }
261
262    my $res = $self->_set_group_members([ keys %users ]);
263
264    $res;
265}
266
2671;
268
269__END__
270
271=head1 SEE ALSO
272
273L<LATMOS::Accounts::Bases::Sql>
274
275=head1 AUTHOR
276
277Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
278
279=head1 COPYRIGHT AND LICENSE
280
281Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
282
283This library is free software; you can redistribute it and/or modify
284it under the same terms as Perl itself, either Perl version 5.10.0 or,
285at your option, any later version of Perl 5 you may have available.
286
287=cut
Note: See TracBrowser for help on using the repository browser.