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

Last change on this file since 1186 was 1186, checked in by nanardon, 12 years ago

add managedAlsoBy attribute to group

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