Ignore:
Timestamp:
04/07/15 16:42:39 (9 years ago)
Author:
nanardon
Message:

merge changes

Location:
trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases
Files:
12 edited

Legend:

Unmodified
Added
Removed
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Attributes.pm

    r1297 r1315  
    192192} 
    193193 
     194=head2 checkinput ($value) 
     195 
     196Check input value, return false on error 
     197 
     198=cut 
     199 
     200sub checkinput { 
     201    my ($self, $values) = @_; 
     202 
     203    if ($self->mandatory && 
     204        (!(defined($values)) || $values eq '')) { 
     205        $self->base->log(LA_ERR, 
     206            "%s attribute cannot be empty for object %s/%s", 
     207            $self->name, 
     208            $self->object->type, 
     209            $self->object->id, 
     210        ); 
     211        return; 
     212    } 
     213 
     214    if ($self->has_values_list && $values) { 
     215        my @possible = $self->can_values; 
     216        foreach my $value (ref $values ? @{ $values } : $values) { 
     217            if (! grep { $value eq $_ } @possible) { 
     218                $self->base->log(LA_ERR, 
     219                    "%s attribute cannot have `%s' as value for object %s/%s", 
     220                    $self->name, 
     221                    $value, 
     222                    $self->object->type, 
     223                    $self->object->id, 
     224                ); 
     225                return; 
     226            } 
     227        } 
     228    } 
     229 
     230    if (ref $values eq 'ARRAY' && ! $self->multiple) { 
     231        $self->base->log(LA_WARN, 'Attribute %s is not multi valuesd', $self->name); 
     232        # TODO: really return an error 
     233        # return; 
     234    } 
     235 
     236    if ($self->{checkinput}) { 
     237        if (!$self->{checkinput}->($values)) { 
     238            return; 
     239        } 
     240    } 
     241 
     242    return 1; 
     243} 
     244 
    194245=head2 readable 
    195246 
     
    370421    my ($self, $values) = @_; 
    371422 
    372     if (ref $self->{set} eq 'CODE') { 
    373         return $self->{set}->($self, 
    374             ref $values 
    375             ? [ map { $self->input($_) } @$values ] 
    376             : $values ? $self->input($values) : undef); 
    377     } else { 
    378         return $self->object->set_fields( 
    379             $self->iname, 
    380             ref $values 
    381                 ? [ map { $self->input($_) } @$values ] 
    382                 : $values ? $self->input($values) : undef); 
    383     } 
     423    my $inputv = ref $values 
     424        ? [ map { $self->input($_) } @$values ] 
     425        : $values ? $self->input($values) : undef; 
     426 
     427    my $res = ref $self->{set} eq 'CODE' 
     428        ? $self->{set}->($self, $inputv) 
     429        : $self->object->set_fields($self->iname, $inputv); 
     430 
     431    # If the attribute has a post code, call it 
     432    if ($res && $self->{post}) { 
     433        $self->{post}->($self, $inputv); 
     434    } 
     435 
     436    $res 
    384437} 
    385438 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Objects.pm

    r1306 r1315  
    370370            return; 
    371371        }; 
    372         $attribute->mandatory && 
    373             (!(defined($cdata{$cfield})) || $cdata{$cfield} eq '') and do { 
     372 
     373        if (!$attribute->checkinput($cdata{$cfield})) { 
    374374            $self->base->log(LA_ERR, 
    375                 "%s attribute cannot be empty, ignoring for object %s/%s", 
    376                 $cfield, 
    377                         $self->type, 
    378                         $self->id, 
     375                "Value for attribute %s to %s (%s) does not match requirements", 
     376                $cfield, $self->id, $self->type 
    379377            ); 
    380             return 0; 
     378            return; 
    381379        }; 
    382380    } 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Accreq.pm

    r1099 r1315  
    9292                }, 
    9393            }, 
     94            comment => { }, 
     95            description => { }, 
     96            notifyMail => { }, 
    9497        } 
    9598    ) 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Address.pm

    r1286 r1315  
    4040                reference => 'site', 
    4141            }, 
    42             sn =>           { ro => 1, }, 
    43             mail =>         { ro => 1, }, 
    44             givenName =>    { ro => 1, }, 
    45             postalAddress => { ro => 1, }, 
    46             displayName =>  { ro => 1, }, 
    47             co =>           { 
    48                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
    49             }, 
    50             l =>            { 
    51                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     42            sn =>           { 
     43                managed => 1, 
     44                ro => 1, 
     45                get => sub { 
     46                    my ($attr) = @_; 
     47                    my $self = $attr->object; 
     48                    my $user = $self->base->get_object('user', $self->_get_c_field('user')) 
     49                        or return; 
     50                    return $user->_get_c_field($attr->name); 
     51                }, 
     52            }, 
     53            mail =>         { 
     54                managed => 1, 
     55                ro => 1, 
     56                get => sub { 
     57                    my ($attr) = @_; 
     58                    my $self = $attr->object; 
     59                    my $user = $self->base->get_object('user', $self->_get_c_field('user')) 
     60                        or return; 
     61                    return $user->_get_c_field($attr->name); 
     62                }, 
     63            }, 
     64            givenName => { 
     65                managed => 1, 
     66                ro => 1, 
     67                get => sub { 
     68                    my ($attr) = @_; 
     69                    my $self = $attr->object; 
     70                    my $user = $self->base->get_object('user', $self->_get_c_field('user')) 
     71                        or return; 
     72                    return $user->_get_c_field($attr->name); 
     73                }, 
     74            }, 
     75            postalAddress => { 
     76                managed => 1, 
     77                ro => 1, 
     78                get => sub { 
     79                    my ($attr) = @_; 
     80                    my $self = $attr->object; 
     81                    my $bp = $self->_get_c_field('postOfficeBox'); 
     82                    return join("\n", grep { $_ } ( 
     83                            $self->_get_c_field('o'), 
     84                            $self->_get_c_field('streetAddress'), 
     85                            ($bp ? 'BP ' . $bp : ''), 
     86                            join(' ', grep { $_ } ( 
     87                                    $self->_get_c_field('postalCode'), 
     88                                    $self->_get_c_field('l'),)), 
     89                            join(' ', grep { $_ } ( 
     90                                    $self->_get_c_field('st'), 
     91                                    $self->_get_c_field('co'),), 
     92                            ) 
     93                        ) 
     94                    ); 
     95                }, 
     96            }, 
     97            displayName =>  { 
     98                managed => 1, 
     99                ro => 1, 
     100                get => sub { 
     101                    my $self = $_[0]->object; 
     102                    return join(' ', grep { $_ } ( 
     103                            $self->_get_c_field('givenName'), 
     104                            $self->_get_c_field('sn'), 
     105                        ) 
     106                    ); 
     107                }, 
     108            }, 
     109            co => { 
     110                managed => 1, 
     111                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     112                get => sub { 
     113                    my ($self) = @_; 
     114                    if (my $site = $self->object->get_attributes('site')) { 
     115                        if (my $osite = $self->base->get_object('site', $site)) { 
     116                            return $osite->get_attributes($self->name); 
     117                        } 
     118                    } 
     119                    return $self->object->get_field($self->name); 
     120                }, 
     121                set => sub { 
     122                    my ($self, $data) = @_; 
     123                    if (my $site = $self->object->get_attributes('site')) { 
     124                        return 1; 
     125                    } else { 
     126                        return $self->object->set_fields($self->name, $data) 
     127                    } 
     128                }, 
     129            }, 
     130            l => { 
     131                managed => 1, 
     132                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     133                get => sub { 
     134                    my ($self) = @_; 
     135                    if (my $site = $self->object->get_attributes('site')) { 
     136                        if (my $osite = $self->base->get_object('site', $site)) { 
     137                            return $osite->get_attributes($self->name); 
     138                        } 
     139                    } 
     140                    return $self->object->get_field($self->name); 
     141                }, 
     142                set => sub { 
     143                    my ($self, $data) = @_; 
     144                    if (my $site = $self->object->get_attributes('site')) { 
     145                        return 1; 
     146                    } else { 
     147                        return $self->object->set_fields($self->name, $data) 
     148                    } 
     149                }, 
    52150            }, 
    53151            postalCode =>   { 
    54                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     152                managed => 1, 
     153                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     154                get => sub { 
     155                    my ($self) = @_; 
     156                    if (my $site = $self->object->get_attributes('site')) { 
     157                        if (my $osite = $self->base->get_object('site', $site)) { 
     158                            return $osite->get_attributes($self->name); 
     159                        } 
     160                    } 
     161                    return $self->object->get_field($self->name); 
     162                }, 
     163                set => sub { 
     164                    my ($self, $data) = @_; 
     165                    if (my $site = $self->object->get_attributes('site')) { 
     166                        return 1; 
     167                    } else { 
     168                        return $self->object->set_fields($self->name, $data) 
     169                    } 
     170                }, 
    55171            }, 
    56172            streetAddress => { 
     173                managed => 1, 
    57174                formtype => 'TEXTAREA', 
    58175                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     176                get => sub { 
     177                    my ($self) = @_; 
     178                    if (my $site = $self->object->get_attributes('site')) { 
     179                        if (my $osite = $self->base->get_object('site', $site)) { 
     180                            return $osite->get_attributes($self->name); 
     181                        } 
     182                    } 
     183                    return $self->object->get_field($self->name); 
     184                }, 
     185                set => sub { 
     186                    my ($self, $data) = @_; 
     187                    if (my $site = $self->object->get_attributes('site')) { 
     188                        return 1; 
     189                    } else { 
     190                        return $self->object->set_fields($self->name, $data) 
     191                    } 
     192                }, 
    59193            }, 
    60194            postOfficeBox => { 
    61                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
    62             }, 
    63             st =>           { 
    64                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     195                managed => 1, 
     196                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     197                get => sub { 
     198                    my ($self) = @_; 
     199                    if (my $site = $self->object->get_attributes('site')) { 
     200                        if (my $osite = $self->base->get_object('site', $site)) { 
     201                            return $osite->get_attributes($self->name); 
     202                        } 
     203                    } 
     204                    return $self->object->get_field($self->name); 
     205                }, 
     206                set => sub { 
     207                    my ($self, $data) = @_; 
     208                    if (my $site = $self->object->get_attributes('site')) { 
     209                        return 1; 
     210                    } else { 
     211                        return $self->object->set_fields($self->name, $data) 
     212                    } 
     213                }, 
     214            }, 
     215            st => { 
     216                managed => 1, 
     217                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     218                get => sub { 
     219                    my ($self) = @_; 
     220                    if (my $site = $self->object->get_attributes('site')) { 
     221                        if (my $osite = $self->base->get_object('site', $site)) { 
     222                            return $osite->get_attributes($self->name); 
     223                        } 
     224                    } 
     225                    return $self->object->get_field($self->name); 
     226                }, 
     227                set => sub { 
     228                    my ($self, $data) = @_; 
     229                    if (my $site = $self->object->get_attributes('site')) { 
     230                        return 1; 
     231                    } else { 
     232                        return $self->object->set_fields($self->name, $data) 
     233                    } 
     234                }, 
    65235            }, 
    66236            facsimileTelephoneNumber => { 
    67                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     237                managed => 1, 
     238                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     239                get => sub { 
     240                    my ($self) = @_; 
     241                    if (my $site = $self->object->get_attributes('site')) { 
     242                        if (my $osite = $self->base->get_object('site', $site)) { 
     243                            return $osite->get_attributes($self->name); 
     244                        } 
     245                    } 
     246                    return $self->object->get_field($self->name); 
     247                }, 
     248                set => sub { 
     249                    my ($self, $data) = @_; 
     250                    if (my $site = $self->object->get_attributes('site')) { 
     251                        return 1; 
     252                    } else { 
     253                        return $self->object->set_fields($self->name, $data) 
     254                    } 
     255                }, 
    68256            }, 
    69257            o =>            { 
    70                 ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     258                managed => 1, 
     259                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 }, 
     260                get => sub { 
     261                    my ($self) = @_; 
     262                    if (my $site = $self->object->get_attributes('site')) { 
     263                        if (my $osite = $self->base->get_object('site', $site)) { 
     264                            return $osite->get_attributes($self->name); 
     265                        } 
     266                    } 
     267                    return $self->object->get_field($self->name); 
     268                }, 
     269                set => sub { 
     270                    my ($self, $data) = @_; 
     271                    if (my $site = $self->object->get_attributes('site')) { 
     272                        return 1; 
     273                    } else { 
     274                        return $self->object->set_fields($self->name, $data) 
     275                    } 
     276                }, 
    71277            }, 
    72278            isMainAddress => { formtype => 'CHECKBOX', }, 
    73279            active => { ro => 1 }, 
     280            telephoneNumber => { }, 
     281            physicalDeliveryOfficeName => { }, 
     282            otherTelephone => { }, 
     283            ipPhone => { }, 
     284            homePhone => { }, 
     285            description => { }, 
    74286        } 
    75287    ); 
     
    87299} 
    88300 
    89 sub get_field { 
    90     my ($self, $field) = @_; 
    91     if ((grep { $field eq $_ } (qw( 
    92             co l 
    93             postalCode streetAddress 
    94             postOfficeBox st 
    95             facsimileTelephoneNumber o 
    96             ))) && (my $fsite = $self->get_c_field('site'))) { 
    97         my $site = $self->base->get_object('site', $fsite); 
    98         if ($site) { 
    99             return $site->get_field($field); 
    100         } 
    101     } elsif ($field =~ /^(sn|givenName|mail)$/) { 
    102         my $user = $self->base->get_object('user', $self->_get_c_field('user')) 
    103             or return; 
    104         return $user->_get_c_field($field); 
    105     } elsif ($field eq 'postalAddress' ) { 
    106         my $bp = $self->_get_c_field('postOfficeBox'); 
    107         return join("\n", grep { $_ } ( 
    108             $self->_get_c_field('o'), 
    109             $self->_get_c_field('streetAddress'), 
    110             ($bp ? 'BP ' . $bp : ''), 
    111             join(' ', grep { $_ } ( 
    112                     $self->_get_c_field('postalCode'), 
    113                     $self->_get_c_field('l'),)), 
    114             join(' ', grep { $_ } ( 
    115                     $self->_get_c_field('st'), 
    116                     $self->_get_c_field('co'),), 
    117             ) 
    118         )); 
    119     } elsif ($field eq 'displayName') { 
    120         return join(' ', grep { $_ } ( 
    121             $self->_get_c_field('givenName'), 
    122             $self->_get_c_field('sn'), 
    123         )); 
    124     } else { 
    125         return $self->SUPER::get_field($field); 
    126     } 
    127 } 
    128  
    129 sub _set_c_fields { 
    130     my ($self, %cdata) = @_; 
    131     if ($cdata{site} && 
    132         $self->base->get_object('site', $cdata{site})) { 
    133         foreach (qw(co l postalCode streetAddress postOfficeBox st 
    134                     facsimileTelephoneNumber o)) { 
    135             delete($cdata{$_}); 
    136         } 
    137     } 
    138  
    139     $self->SUPER::_set_c_fields(%cdata); 
    140 } 
    141  
    142 sub set_fields { 
    143     my ($self, %data) = @_; 
    144     my %fdata; 
    145     my $res = 0; 
    146     foreach my $attr (keys %data) { 
    147         $attr =~ /^site$/ and do { 
    148             my $site = 
    149             $self->base->get_object('site', 
    150                 $data{$attr}); 
    151             if ($site) { 
    152                 foreach (qw(co l postalCode streetAddress postOfficeBox st 
    153                         facsimileTelephoneNumber o)) { 
    154                     $fdata{$_} = undef; 
    155                     $data{$_} = undef; 
    156                 } 
    157             } 
    158             $fdata{$attr} = $data{$attr} || undef; 
    159             next; 
    160         }; 
    161         $fdata{$attr} = $data{$attr} || undef; 
    162     } 
    163     if  (keys %fdata) { 
    164         $res += $self->SUPER::set_fields(%fdata); 
    165     } 
    166  
    167     $res; 
    168 } 
    169  
    1703011; 
    171302 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Aliases.pm

    r1297 r1315  
    2525    my ($class, $base) = @_; 
    2626 
     27     
     28    my $recurs = sub { 
     29        my ($attr) = @_; 
     30        my ($self) = $attr->object; 
     31        my $field = $attr->name;  
     32 
     33        my $sth = $self->db->prepare_cached(q{ 
     34            select name from aliases where array[lower($1)] <@ 
     35            string_to_array(lower(array_to_string("forward", ',')), ',') 
     36            }); 
     37        my @tocheck = ($field =~ /^sameforward$/ 
     38            ? $self->get_field('forward') 
     39            : ($field =~ /^samedestination$/  
     40                ? $self->get_field('finalpoint') 
     41                : $self->id)); 
     42        my @results; 
     43        my @already; 
     44        while (my $next = shift(@tocheck)) { 
     45            # endless loop detection 
     46            grep { $next eq $_ } @already and do { 
     47                push(@results, 'LOOP'); 
     48                next; 
     49            }; 
     50            push(@already, $next); 
     51            $sth->execute($next); 
     52            while (my $res = $sth->fetchrow_hashref) { 
     53                push(@tocheck, $res->{name}); 
     54                $res->{name} eq $self->id and next; 
     55                push(@results, $res->{name}); 
     56            } 
     57            $field =~ /^(parents|sameforward)$/ and last; # No recursive search 
     58        } 
     59        return scalar(@results) <= 1 ? $results[0] : \@results; 
     60    }; 
     61 
    2762    $class->SUPER::_get_attr_schema($base, 
    2863        { 
     
    3469                multiple => 1, 
    3570                monitored => 1, 
     71                set => sub { 
     72                    my ($self, $data) = @_; 
     73                    return $self->object->set_fields($self->iname,  
     74                        $data 
     75                        ? ref $data ? $data : [ $data ] 
     76                        : undef 
     77                    ); 
     78                }, 
    3679            }, 
    37             finalpoint      => { ro => 1, multiple => 1 }, 
    38             parents         => { ro => 1, }, 
    39             anyparents      => { ro => 1, }, 
    40             sameforward     => { ro => 1, multiple => 1 }, 
    41             samedestination => { ro => 1, multiple => 1 }, 
     80            finalpoint      => { 
     81                ro => 1, 
     82                multiple => 1, 
     83                get => sub { 
     84                    my ($self) = @_; 
     85                    my $sth = $self->base->db->prepare_cached(q{ 
     86                        select forward from aliases where lower(name) = lower(?) 
     87                        limit 1 
     88                        }); 
     89                    my @res = (); 
     90                    my @next = @{ $self->object->get_field('forward') || [] }; 
     91                    while (my $next = shift(@next)) { 
     92                        $sth->execute($next); 
     93                        if (my $res = $sth->fetchrow_hashref) { 
     94                            push(@next, @{ $res->{forward} }); 
     95                        } else { 
     96                            push(@res, $next); 
     97                        } 
     98                    } 
     99                    $sth->finish; 
     100                    return @res ? \@res : undef; 
     101                }, 
     102            }, 
     103            parents         => { 
     104                ro => 1, 
     105                get => $recurs, 
     106            }, 
     107            anyparents      => { 
     108                ro => 1, 
     109                get => $recurs, 
     110            }, 
     111            sameforward     => { 
     112                ro => 1, 
     113                multiple => 1, 
     114                get => $recurs, 
     115            }, 
     116            samedestination => { 
     117                ro => 1, 
     118                multiple => 1, 
     119                get => $recurs, 
     120            }, 
    42121            user            => { 
    43122                ro => 1, 
     
    48127                formtype => 'DATE', 
    49128            }, 
     129            comment => { }, 
    50130        } 
    51131    ) 
     
    86166} 
    87167 
    88 sub get_field { 
    89     my ($self, $field) = @_;  
    90     if ($field eq 'finalpoint') { 
    91         my $sth = $self->db->prepare_cached(q{ 
    92         select forward from aliases where lower(name) = lower(?) 
    93         limit 1 
    94         }); 
    95         my @res = (); 
    96         my @next = @{ $self->get_field('forward') || [] }; 
    97         while (my $next = shift(@next)) { 
    98             $sth->execute($next); 
    99             if (my $res = $sth->fetchrow_hashref) { 
    100                 push(@next, @{ $res->{forward} }); 
    101             } else { 
    102                 push(@res, $next); 
    103             } 
    104         } 
    105         $sth->finish; 
    106         return @res ? \@res : undef; 
    107     } 
    108     if ($field =~ /^(parents|anyparents|sameforward|samedestination)$/) { 
    109         my $sth = $self->db->prepare_cached(q{ 
    110             select name from aliases where array[lower($1)] <@ 
    111                 string_to_array(lower(array_to_string("forward", ',')), ',') 
    112             }); 
    113         my @tocheck = ($field =~ /^sameforward$/ 
    114             ? $self->get_field('forward') 
    115             : ($field =~ /^samedestination$/  
    116                 ? $self->get_field('finalpoint') 
    117                 : $self->id)); 
    118         my @results; 
    119         my @already; 
    120         while (my $next = shift(@tocheck)) { 
    121             # endless loop detection 
    122             grep { $next eq $_ } @already and do { 
    123                 push(@results, 'LOOP'); 
    124                 next; 
    125             }; 
    126             push(@already, $next); 
    127             $sth->execute($next); 
    128             while (my $res = $sth->fetchrow_hashref) { 
    129                 push(@tocheck, $res->{name}); 
    130                 $res->{name} eq $self->id and next; 
    131                 push(@results, $res->{name}); 
    132             } 
    133             $field =~ /^(parents|sameforward)$/ and last; # No recursive search 
    134         } 
    135         return scalar(@results) <= 1 ? $results[0] : \@results; 
    136     } 
    137     $self->SUPER::get_field($field); 
    138 } 
    139  
    140 sub set_fields { 
    141     my ($self, %attrs) = @_; 
    142     foreach (keys %attrs) { 
    143         /^forward$/ and do { 
    144             $attrs{$_} = [ $attrs{$_} ] unless(ref $attrs{$_}); 
    145         }; 
    146     } 
    147     $self->SUPER::set_fields(%attrs); 
    148 } 
    149168 
    1501691; 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Group.pm

    r1297 r1315  
    2727    $class->SUPER::_get_attr_schema($base, 
    2828        { 
    29             gidNumber  => { inline => 1, uniq => 1, iname => 'gidnumber', 
    30                 mandatory => 1, }, 
     29            gidNumber  => { 
     30                inline => 1, 
     31                uniq => 1, 
     32                iname => 'gidnumber', 
     33                mandatory => 1,  
     34            }, 
    3135            gidnumber  => { inline => 1, uniq => 1, hide => 1, }, 
    32             exported   => { inline => 1, }, 
    33             name       => { inline => 1, ro => 1 }, 
    3436            cn         => { inline => 1, ro => 1, iname => 'name', }, 
    35             create     => { inline => 1, ro => 1 }, 
    36             date       => { inline => 1, ro => 1 }, 
    3737            memberUID  => { 
    3838                monitored => 1, 
     
    4646                     || $_[0]->_get_c_field('autoMemberFilter')) 
    4747                    ? 1 : 0  
     48                }, 
     49                get => sub { 
     50                    my ($self) = @_;  
     51                    my $sth = $self->base->db->prepare_cached( 
     52                        q{ 
     53                        select value from group_attributes 
     54                        join "group" on "group".ikey = group_attributes.okey 
     55                        join "user" on "user".name = group_attributes.value 
     56                        where "group".name = ? and attr = ? 
     57                        } . 
     58                        ($self->base->{wexported} ? '' : 'and "user".exported = true') 
     59                    ); 
     60                    $sth->execute($self->object->id, 'memberUID'); 
     61                    my @res; 
     62                    while (my $res = $sth->fetchrow_hashref) { 
     63                        push(@res, $res->{value}); 
     64                    } 
     65                    return \@res; 
     66                }, 
     67                set => sub { 
     68                    my ($self, $data) = @_; 
     69                    $self->object->_set_group_members($data); 
    4870                }, 
    4971            }, 
     
    6082                    ? 1 : 0  
    6183                }, 
     84                get => sub { 
     85                    my ($self) = @_; 
     86                    $self->object->_get_c_field('memberUID'); 
     87                }, 
     88                set => sub { 
     89                    my ($self, $data) = @_; 
     90                    $self->object->_set_group_members($data); 
     91                }, 
    6292            }, 
    6393            sAMAccountName => { iname => 'name', ro => 1 }, 
     
    91121            autoMemberFilter => { 
    92122                multiple => 1, 
    93             } 
     123                set => sub { 
     124                    my ($self, $data) = @_; 
     125                    $self->object->set_fields($self->name, $data) or return; 
     126                    $self->object->populate_dyn_group; 
     127                    return 1; 
     128                } 
     129            }, 
     130            label => { }, 
     131            expire => { }, 
     132            description => { }, 
     133            comment => { }, 
    94134        } 
    95135    ) 
    96 } 
    97  
    98 sub get_field { 
    99     my ($self, $field) = @_; 
    100     for ($field) { 
    101         /^(member|memberUID)$/ and do { 
    102             my $sth = $self->db->prepare_cached( 
    103                 q{ 
    104                 select value from group_attributes 
    105                 join "group" on "group".ikey = group_attributes.okey 
    106                 join "user" on "user".name = group_attributes.value 
    107                 where "group".name = ? and attr = ? 
    108                 } . 
    109                 ($self->base->{wexported} ? '' : 'and "user".exported = true') 
    110             ); 
    111             $sth->execute($self->id, 'memberUID'); 
    112             my @res; 
    113             while (my $res = $sth->fetchrow_hashref) { 
    114                 push(@res, $res->{value}); 
    115             } 
    116             return \@res; 
    117         }; 
    118     } 
    119     $self->SUPER::get_field($field); 
    120136} 
    121137 
     
    124140    my %member; 
    125141    my $res = 0; 
    126     foreach (@{ $self->get_field('memberUID') }) { 
     142    foreach (@{ $self->_get_c_field('memberUID') }) { 
    127143        $member{$_}{c} = 1; 
    128144    } 
     
    158174} 
    159175 
    160 sub set_fields { 
    161     my ($self, %data) = @_; 
    162     my %fdata; 
    163     my $res = 0; 
    164     foreach my $attr (keys %data) { 
    165         $attr =~ /^memberUID|member$/ and do { 
    166             if (($self->_get_c_field('sutype') ||'') =~ /^(jobtype|contrattype)$/ || 
    167                  $self->get_field('autoMemberFilter')) { 
    168                 $self->base->log(LA_WARN, 
    169                     "Group %s is managed, ignoring member set request", 
    170                     $self->id); 
    171                 next; 
    172             } 
    173             $res += $self->_set_group_members($data{$attr}); 
    174             next; 
    175         }; 
    176         $fdata{$attr} = $data{$attr}; 
    177     } 
    178  
    179     if (keys %fdata) { 
    180             my $setres = $self->SUPER::set_fields(%fdata); 
    181         if (exists($fdata{autoMemberFilter})) { 
    182             $res += $self->populate_dyn_group; 
    183         } 
    184         return unless(defined($setres)); 
    185             $res += ($setres || 0); 
    186     } 
    187      
    188     $res 
    189 } 
    190  
    191176=head2 populate_dyn_group 
    192177 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Nethost.pm

    r1302 r1315  
    4747                    $base->search_objects('netzone', 'type=dhcp') 
    4848                }, 
     49                set => sub { 
     50                    my ($self, $data) = @_; 
     51                    foreach (ref $data ? @{$data} : $data) { 
     52                        my $zone = $self->base->get_object('netzone', $_) 
     53                            or next; 
     54                        my @freeips = $zone->get_attributes('freeIP') or next; 
     55                        my $idx = rand(scalar(@freeips)); 
     56                        $self->object->_addAttributeValue('ip', $freeips[$idx]); 
     57                        $self->base->log(LA_NOTICE, "Assigning ip %s to host %s", 
     58                            $freeips[$idx], $self->object->id); 
     59                    } 
     60                }, 
    4961            }, 
    5062            macaddr => { 
     
    7890                multiple => 1, ro => 1, managed => 1, 
    7991                reference => 'netzone', 
     92                get => sub { 
     93                    my ($self) = @_; 
     94                    my $find = $self->base->db->prepare_cached(q{ 
     95                        select name from netzone where ikey in 
     96                        ( 
     97                        select netzone_attributes.okey from netzone_attributes join 
     98                        nethost_attributes_ips on netzone_attributes.attr='net' 
     99                            and  
     100                        nethost_attributes_ips.value::inet <<= 
     101                        netzone_attributes.value::inet 
     102                        where nethost_attributes_ips.okey = $1 
     103                        except 
     104                        select netzone_attributes.okey from netzone_attributes join 
     105                        nethost_attributes_ips on netzone_attributes.attr='netExclude' 
     106                            and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet 
     107                        where nethost_attributes_ips.okey = $1 
     108                        ) 
     109                        order by name 
     110                        }); 
     111                    $find->execute($self->object->get_attributes('ikey')); 
     112                    my @zones; 
     113                    while (my $res = $find->fetchrow_hashref) { 
     114                        push(@zones, $res->{name}); 
     115                    } 
     116                    return @zones ? [ @zones ] : undef; 
     117                }, 
    80118            }, 
    81119            puppetClass => { multiple => 1, }, 
     
    83121                multiple => 1, ro => 1, managed => 1, 
    84122                reference => 'netzone', 
     123                get => sub { 
     124                    my ($self) = @_; 
     125                    my $find = $self->base->db->prepare_cached(q{ 
     126                        select name from netzone where ikey in 
     127                        ( 
     128                        select netzone_attributes.okey from netzone_attributes join 
     129                        nethost_attributes_ips on netzone_attributes.attr='netExclude' 
     130                            and  
     131                        nethost_attributes_ips.value::inet <<= 
     132                        netzone_attributes.value::inet 
     133                        where nethost_attributes_ips.okey = $1 
     134                        ) 
     135                            order by name 
     136                        }); 
     137                    $find->execute($self->object->get_attributes('ikey')); 
     138                    my @zones; 
     139                    while (my $res = $find->fetchrow_hashref) { 
     140                        push(@zones, $res->{name}); 
     141                    } 
     142                    return @zones ? [ @zones ] : undef; 
     143                }, 
    85144            }, 
    86145            noDynamic => {  
     
    96155            sshfpUpdate  => { 
    97156                managed => 1, 
    98             }, 
     157                iname => 'sshfp', 
     158                input => sub { 
     159                    my ($self, $data) = @_; 
     160                    open(my $h, '<', $data) or return; 
     161                    my @sshfps; 
     162                    while (my $line = <$h>) { 
     163                        my ($type, $mode, $key) = $line =~ /^\S+\s+IN\s+SSHFP\s+(\d)\s+(\d)\s+(\S+)/i 
     164                            or do { 
     165                            la_log(LA_ERR, "Seems to not be a ssh-keygen line: %s", $line); 
     166                            return; 
     167                        }; 
     168                        la_log(LA_DEBUG, "found sshfp %s %s %s", $type, $mode, $key); 
     169                        push(@sshfps, "$type $mode $key"); 
     170                    } 
     171                    close($h); 
     172                    \@sshfps; 
     173                } 
     174            }, 
     175            comment => { }, 
     176            description => { }, 
     177            encryptKey => { }, 
     178            ip6 => { }, 
     179            reverse => { }, 
     180            serialNumber => { }, 
    99181        } 
    100182    ) 
    101183} 
    102184 
    103 sub get_field { 
    104     my ($self, $field) = @_; 
    105  
    106     if ($field eq 'netZone') { 
    107         my $find = $self->base->db->prepare_cached(q{ 
    108             select name from netzone where ikey in 
    109             ( 
    110             select netzone_attributes.okey from netzone_attributes join 
    111             nethost_attributes_ips on netzone_attributes.attr='net' 
    112                 and  
    113             nethost_attributes_ips.value::inet <<= 
    114             netzone_attributes.value::inet 
    115             where nethost_attributes_ips.okey = $1 
    116             except 
    117             select netzone_attributes.okey from netzone_attributes join 
    118             nethost_attributes_ips on netzone_attributes.attr='netExclude' 
    119             and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet 
    120             where nethost_attributes_ips.okey = $1 
    121             ) 
    122                 order by name 
    123             }); 
    124         $find->execute($self->get_attributes('ikey')); 
    125         my @zones; 
    126         while (my $res = $find->fetchrow_hashref) { 
    127             push(@zones, $res->{name}); 
    128         } 
    129         return @zones ? [ @zones ] : undef; 
    130     } elsif ($field eq 'netZoneExclude') { 
    131         my $find = $self->base->db->prepare_cached(q{ 
    132             select name from netzone where ikey in 
    133             ( 
    134             select netzone_attributes.okey from netzone_attributes join 
    135             nethost_attributes_ips on netzone_attributes.attr='netExclude' 
    136                 and  
    137             nethost_attributes_ips.value::inet <<= 
    138             netzone_attributes.value::inet 
    139             where nethost_attributes_ips.okey = $1 
    140             ) 
    141                 order by name 
    142             }); 
    143         $find->execute($self->get_attributes('ikey')); 
    144         my @zones; 
    145         while (my $res = $find->fetchrow_hashref) { 
    146             push(@zones, $res->{name}); 
    147         } 
    148         return @zones ? [ @zones ] : undef; 
    149     } else { 
    150         return $self->SUPER::get_field($field); 
    151     } 
    152 } 
    153  
    154185sub set_fields { 
    155186    my ($self, %data) = @_; 
    156     if ($data{ipFrom}) { 
    157         my @currentips = grep { $_ } $self->get_attributes('ip'); 
    158         foreach (ref $data{ipFrom} ? @{$data{ipFrom}} : $data{ipFrom}) { 
    159             my $zone = $self->base->get_object('netzone', $_) 
    160                 or next; 
    161             my @freeips = $zone->get_attributes('freeIP') or next; 
    162             my $idx = rand(scalar(@freeips)); 
    163             push(@currentips, $freeips[$idx]); 
    164             $self->base->log(LA_NOTICE, "Assigning ip %s to host %s", 
    165                 $freeips[$idx], $self->id); 
    166         } 
    167         push(@currentips, ref $data{ip} ? @{$data{ip}} : $data{ip}) 
    168             if ($data{ip}); 
    169         $data{ip} = \@currentips; 
    170         delete($data{ipFrom}); 
    171     } 
    172     if ($data{sshfpUpdate}) { 
    173         open my $h, '<', \$data{sshfpUpdate}; 
    174         my @sshfps; 
    175         while (my $line = <$h>) { 
    176             my ($type, $mode, $key) = $line =~ /^\S+\s+IN\s+SSHFP\s+(\d)\s+(\d)\s+(\S+)/i 
    177                 or do { 
    178                     la_log(LA_ERR, "Seems to not be a ssh-keygen line: %s", $line); 
    179                     return; 
    180                 }; 
    181             la_log(LA_DEBUG, "found sshfp %s %s %s", $type, $mode, $key); 
    182             push(@sshfps, "$type $mode $key"); 
    183         } 
    184         close($h); 
    185         delete($data{sshfpUpdate}); 
    186         $data{sshfp} = \@sshfps; 
    187     } 
    188187 
    189188    my $res = $self->SUPER::set_fields(%data); 
    190189 
     190    # Post update related 
    191191    if (exists $data{related}) { 
    192192        my %exists; 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Netzone.pm

    r1297 r1315  
    4444            }, 
    4545            output => {}, 
    46             outputD => { hide => 1, ro => 1, managed => 1, }, 
     46            outputD => { 
     47                hide => 1, 
     48                ro => 1, 
     49                managed => 1, 
     50                get => sub { 
     51                    $_[0]->object->_get_c_field('output') || 
     52                    $_[0]->object->id 
     53                }, 
     54            }, 
    4755            template => {}, 
    48             templateD => { hide => 1, ro => 1, managed => 1, }, 
     56            templateD => { 
     57                hide => 1, 
     58                ro => 1, 
     59                managed => 1, 
     60                get => sub { 
     61                    $_[0]->object->_get_c_field('template') || 
     62                    $_[0]->object->id 
     63                }, 
     64            }, 
    4965            type    => { 
    5066                mandatory => 1, 
     
    6379                }, 
    6480            }, 
    65             freeIP => { managed => 1, ro => 1, multiple => 1, }, 
    66             freeIPCount => { managed => 1, ro => 1, }, 
    67             ipCount => { managed => 1, ro => 1, }, 
    68             hosts =>  { ro => 1, multiple => 1, reference => 'nethost', }, 
    69             hostsExclude =>  { ro => 1, multiple => 1, reference => 'nethost' }, 
     81            freeIP => { 
     82                managed => 1, 
     83                ro => 1, 
     84                multiple => 1, 
     85                get => sub { 
     86                    my $self = $_[0]->object; 
     87                    my @ips; 
     88                    my $findip = $self->base->db->prepare(q{ 
     89                        select * from ( 
     90                        select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where 
     91                        attr='net' and okey = $1 and family(value::inet) = 4 
     92                        except 
     93                        ( 
     94                        select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from 
     95                        netzone_attributes where attr='netExclude' and okey = $1 
     96                        union 
     97                        select nethost_attributes_ips.value from nethost_attributes_ips join netzone_attributes on 
     98                        netzone_attributes.attr='net' and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet 
     99                        where netzone_attributes.okey = $1 
     100                        ) 
     101                        ) as s 
     102                        order by host::inet 
     103                        }); 
     104                    $findip->execute($self->get_attributes('ikey')); 
     105                    while (my $res = $findip->fetchrow_hashref) { 
     106                        push(@ips, $res->{host}); 
     107                    } 
     108                    return scalar(@ips) ? \@ips : undef; 
     109                }, 
     110            }, 
     111            freeIPCount => { 
     112                managed => 1, 
     113                ro => 1, 
     114                get => sub { 
     115                    return scalar(grep { $_ } $_[0]->object->get_attributes('freeIP')); 
     116                }, 
     117            }, 
     118            ipCount => { 
     119                managed => 1, 
     120                ro => 1, 
     121                get => sub { 
     122                    my ($self) = $_[0]->object; 
     123                    my $findip = $self->base->db->prepare(q{ 
     124                        select count(*) from ( 
     125                        select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where 
     126                        attr='net' and okey = $1 and family(value::inet) = 4 
     127                        except 
     128                        ( 
     129                        select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from 
     130                        netzone_attributes where attr='netExclude' and okey = $1 
     131                        ) 
     132                        ) as s 
     133                        }); 
     134                    $findip->execute($self->get_attributes('ikey')); 
     135                    my $res = $findip->fetchrow_hashref; 
     136                    $findip->finish; 
     137                    return $res->{count} 
     138                }, 
     139            }, 
     140            hosts =>  { 
     141                ro => 1, 
     142                multiple => 1, 
     143                reference => 'nethost', 
     144                get => sub { 
     145                    my ($self) = $_[0]->object; 
     146                    my $findhost = $self->base->db->prepare_cached(q{ 
     147                        select name from nethost join nethost_attributes_ips on 
     148                        nethost.ikey = nethost_attributes_ips.okey 
     149                        where value::inet <<= any(?) 
     150                        } . ($self->base->{wexported} ? '' : 'and exported = true') . 
     151                        q{ except 
     152                        select name from nethost join nethost_attributes_ips on 
     153                        nethost.ikey = nethost_attributes_ips.okey 
     154                        where value::inet <<= any(?) 
     155                        order by name 
     156                        } 
     157                    ); 
     158                    $findhost->execute( 
     159                        [ $self->get_attributes('net') ], 
     160                        [ $self->get_attributes('netExclude') ], 
     161                    ); 
     162                    my @hosts; 
     163                    while (my $res = $findhost->fetchrow_hashref) { 
     164                        push(@hosts, $res->{name}); 
     165                    } 
     166                    return scalar(@hosts) ? \@hosts : undef; 
     167                }, 
     168            }, 
     169            hostsExclude =>  { 
     170                ro => 1, 
     171                multiple => 1, 
     172                reference => 'nethost', 
     173                get => sub { 
     174                    my $self = $_[0]->object; 
     175                    my $findhost = $self->base->db->prepare_cached(q{ 
     176                        select name from nethost join nethost_attributes_ips on 
     177                        nethost.ikey = nethost_attributes_ips.okey 
     178                        where value::inet <<= any(?) 
     179                        } . ($self->base->{wexported} ? '' : 'and exported = true') . 
     180                        q{ 
     181                        order by name 
     182                        } 
     183                    ); 
     184                    $findhost->execute( 
     185                        [ $self->get_attributes('netExclude') ], 
     186                    ); 
     187                    my @hosts; 
     188                    while (my $res = $findhost->fetchrow_hashref) { 
     189                        push(@hosts, $res->{name}); 
     190                    } 
     191                    return scalar(@hosts) ? \@hosts : undef; 
     192                }, 
     193            }, 
    70194            lastBuild => { hide => 1, }, 
    71195            lastUpdate => { ro => 1, iname => 'lastBuild' }, 
     
    74198            exported => { formtype => 'CHECKBOX', }, 
    75199            puppetClass =>  { multiple => 1, }, 
     200            domain => { }, 
     201            description => { }, 
    76202        } 
    77203    ) 
    78204} 
    79205 
    80 sub get_field { 
    81     my ($self, $field) = @_; 
    82     if ($field eq 'ipCount') { 
    83         my $findip = $self->base->db->prepare(q{ 
    84             select count(*) from ( 
    85             select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where 
    86             attr='net' and okey = $1 and family(value::inet) = 4 
    87             except 
    88             ( 
    89             select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from 
    90             netzone_attributes where attr='netExclude' and okey = $1 
    91             ) 
    92             ) as s 
    93             }); 
    94         $findip->execute($self->get_attributes('ikey')); 
    95         my $res = $findip->fetchrow_hashref; 
    96         $findip->finish; 
    97         return $res->{count} 
    98     } elsif ($field eq 'freeIP') { 
    99         my @ips; 
    100         my $findip = $self->base->db->prepare(q{ 
    101             select * from ( 
    102             select host(network(value::inet)+ (generate_series(1, broadcast(value::inet) - network(value::inet) -1))) from netzone_attributes where 
    103             attr='net' and okey = $1 and family(value::inet) = 4 
    104             except 
    105             ( 
    106             select host(network(value::inet)+ (generate_series(0, broadcast(value::inet) - network(value::inet)))) from 
    107             netzone_attributes where attr='netExclude' and okey = $1 
    108             union 
    109             select nethost_attributes_ips.value from nethost_attributes_ips join netzone_attributes on 
    110             netzone_attributes.attr='net' and nethost_attributes_ips.value::inet <<= netzone_attributes.value::inet 
    111             where netzone_attributes.okey = $1 
    112             ) 
    113             ) as s 
    114             order by host::inet 
    115             }); 
    116         $findip->execute($self->get_attributes('ikey')); 
    117         while (my $res = $findip->fetchrow_hashref) { 
    118             push(@ips, $res->{host}); 
    119         } 
    120         return scalar(@ips) ? \@ips : undef; 
    121     } elsif ($field eq 'freeIPCount') { 
    122         return scalar(grep { $_ } $self->get_attributes('freeIP')); 
    123     } elsif ($field eq 'hosts') { 
    124         my $findhost = $self->base->db->prepare_cached(q{ 
    125             select name from nethost join nethost_attributes_ips on 
    126             nethost.ikey = nethost_attributes_ips.okey 
    127             where value::inet <<= any(?) 
    128             } . ($self->base->{wexported} ? '' : 'and exported = true') . 
    129             q{ except 
    130             select name from nethost join nethost_attributes_ips on 
    131             nethost.ikey = nethost_attributes_ips.okey 
    132             where value::inet <<= any(?) 
    133             order by name 
    134             } 
    135         ); 
    136         $findhost->execute( 
    137             [ $self->get_attributes('net') ], 
    138             [ $self->get_attributes('netExclude') ], 
    139         ); 
    140         my @hosts; 
    141         while (my $res = $findhost->fetchrow_hashref) { 
    142             push(@hosts, $res->{name}); 
    143         } 
    144         return scalar(@hosts) ? \@hosts : undef; 
    145     } elsif ($field eq 'hostsExclude') { 
    146         my $findhost = $self->base->db->prepare_cached(q{ 
    147             select name from nethost join nethost_attributes_ips on 
    148             nethost.ikey = nethost_attributes_ips.okey 
    149             where value::inet <<= any(?) 
    150             } . ($self->base->{wexported} ? '' : 'and exported = true') . 
    151             q{ 
    152             order by name 
    153             } 
    154         ); 
    155         $findhost->execute( 
    156             [ $self->get_attributes('netExclude') ], 
    157         ); 
    158         my @hosts; 
    159         while (my $res = $findhost->fetchrow_hashref) { 
    160             push(@hosts, $res->{name}); 
    161         } 
    162         return scalar(@hosts) ? \@hosts : undef; 
    163     } elsif ($field eq 'templateD') { 
    164         return $self->get_attributes('template') || ($self->id . '.in'); 
    165     } elsif ($field eq 'outputD') { 
    166         return $self->get_attributes('output') || $self->id; 
    167     } else { 
    168         return $self->SUPER::get_field($field); 
    169     } 
    170 } 
    171  
    1722061; 
    173207 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Service.pm

    r1303 r1315  
    5454                reference => 'user', 
    5555            }, 
     56            comment => { }, 
     57            description => { }, 
    5658        } 
    5759    ) 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Site.pm

    r1023 r1315  
    3535            create => { ro => 1, inline => 1, }, 
    3636            streetAddress => { formtype => 'TEXTAREA' }, 
    37             postalAddress => { ro => 1, }, 
     37            postalAddress => { 
     38                ro => 1, 
     39                get => sub { 
     40                    my $self = $_[0]->object; 
     41                    my $bp = $self->_get_c_field('postOfficeBox'); 
     42                    return join("\n", grep { $_ } ( 
     43                            $self->_get_c_field('o'), 
     44                            $self->_get_c_field('streetAddress'), 
     45                            ($bp ? 'BP ' . $bp : ''), 
     46                            join(' ', grep { $_ } ( 
     47                                    $self->_get_c_field('postalCode'), 
     48                                    $self->_get_c_field('l'),)), 
     49                            join(' ', grep { $_ } ( 
     50                                    $self->_get_c_field('st'), 
     51                                    $self->_get_c_field('co'),), 
     52                            ) 
     53                        ) 
     54                    ); 
     55                }, 
     56            }, 
    3857            siteNick => { uniq => 1 }, 
     58            st => { }, 
     59            postalCode => { }, 
     60            postOfficeBox => { }, 
     61            o => { }, 
     62            l => { }, 
     63            facsimileTelephoneNumber => { }, 
     64            description => { }, 
     65            co => { }, 
    3966        } 
    4067    ) 
    41 } 
    42  
    43 sub get_field { 
    44     my ($self, $field) = @_; 
    45     if ($field eq 'postalAddress' ) { 
    46         my $bp = $self->_get_c_field('postOfficeBox'); 
    47         return join("\n", grep { $_ } ( 
    48             $self->_get_c_field('o'), 
    49             $self->_get_c_field('streetAddress'), 
    50             ($bp ? 'BP ' . $bp : ''), 
    51             join(' ', grep { $_ } ( 
    52                     $self->_get_c_field('postalCode'), 
    53                     $self->_get_c_field('l'),)), 
    54             join(' ', grep { $_ } ( 
    55                     $self->_get_c_field('st'), 
    56                     $self->_get_c_field('co'),), 
    57             ) 
    58         )); 
    59     } else { 
    60         return $self->SUPER::get_field($field); 
    61     } 
    6268} 
    6369 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/User.pm

    r1297 r1315  
    4343    my ($class, $base) = @_; 
    4444 
     45    my $subsetaddress = sub { 
     46        my ($self, $data) = @_; 
     47        my $fmainaddress = $self->object->_get_c_field('mainaddress'); 
     48 
     49        # set address attribute => create address object on the fly 
     50        # except if attr is empty ! 
     51        if (!$fmainaddress && $data) { 
     52            $fmainaddress = $self->object->id . '-' . join('', map { ('a'..'z')[rand(26)] } 
     53                (0..4)); 
     54            $self->base->_create_c_object( 
     55                'address', $fmainaddress, 
     56                user => $self->object->id, 
     57                isMainAddress => 1, ) or do { 
     58                $self->base->log(LA_ERR, 
     59                    "Cannot create main address for user %s", $self->object->id); 
     60                return; 
     61            }; 
     62        } 
     63        if ($fmainaddress &&  
     64            (my $address = $self->base->get_object('address', $fmainaddress))) { 
     65            if ($address->attribute($self->name) && 
     66                !$address->attribute($self->name)->ro) { 
     67                return $address->set_c_fields($self->name => $data) ||0; 
     68            } 
     69        } 
     70    }; 
     71 
    4572    $class->SUPER::_get_attr_schema($base, 
    4673        { 
     74            exported => { 
     75                post => sub { 
     76                    my ($self, $value) = @_; 
     77                    my $attr = $self->name; 
     78 
     79                    if (my $obj = $self->base-> 
     80                            get_object('revaliases', $self->object->id)) { 
     81                        my $ares = $obj->set_c_fields( 
     82                            ($attr eq 'exported' ? 'exported' : 'unexported') => $value 
     83                        ); 
     84                        if (!defined($ares)) { 
     85                            $self->base->log(LA_ERR, 
     86                                'Cannot set revaliases exported attribute for user %s', 
     87                                $self->object->id); 
     88                        } 
     89                    } 
     90                    my $must_expire = $self->name eq 'exported' 
     91                        ? ($value ? 0 : 1 ) 
     92                        : ($value ? 1 : 0 ); 
     93 
     94                    foreach my $al ($self->object->get_attributes('aliases')) { 
     95                        my $obj = $self->base->get_object('aliases', $al) or next; 
     96                        $obj->_set_c_fields( 
     97                            expire => $must_expire 
     98                                ? strftime( 
     99                                    "%Y-%m-%d %H:%M:%S", 
     100                                    localtime(time + 3600 * 24 * 365) 
     101                                  ) 
     102                                : undef, 
     103                        ); 
     104                    } 
     105                }, 
     106            }, 
    47107            uidNumber => { 
    48108                inline => 1, 
     
    58118                mandatory => 1, 
    59119                can_values => sub { 
    60                     map { $base->get_object('group', 
    61                             $_)->get_attributes('gidNumber') } 
    62                     $base->list_objects('group') 
     120                    my $sth = $base->db->prepare_cached( 
     121                        q{ 
     122                        select gidnumber from "group" where exported = true 
     123                        } 
     124                    ); 
     125                    $sth->execute(); 
     126                    my @res; 
     127                    while (my $res = $sth->fetchrow_hashref) { 
     128                        push(@res, $res->{gidnumber}); 
     129                    } 
     130                    return @res; 
    63131                }, 
    64132                display => sub { 
     
    81149                monitored => 1, 
    82150            }, 
    83             exported  => { 
    84                 inline => 1, 
    85                 formtype => 'CHECKBOX', 
    86                 monitored => 1, 
    87             }, 
    88151            locked    => { 
    89152                formtype => 'CHECKBOX', 
     
    92155            }, 
    93156            expire    => { inline => 1, formtype => 'DATE', monitored => 1, }, 
    94             name      => { inline => 1, ro => 1, }, 
    95157            cn        => { 
    96158                inline => 1, ro => 1, 
     
    107169                }, 
    108170            }, 
    109             create    => { inline => 1, ro => 1, }, 
    110             date      => { inline => 1, ro => 1, }, 
    111171            memberOf  => { 
    112172                multiple => 1, delayed => 1, 
     
    127187                    } 
    128188                    return \@res; 
    129                 } 
    130             }, 
    131             forward   => {}, 
     189                }, 
     190                set => sub { 
     191                    my ($self, $values) = @_; 
     192                    my %old = map { $_ => 'o' } @{ $self->get }; 
     193                    foreach my $group (grep { $_ } ref $values ? @{ $values } : $values) { 
     194                        if ($old{$group}) { 
     195                            $old{$group} = undef; # no change 
     196                        } else { 
     197                            $old{$group} = 'n'; 
     198                        } 
     199                    } 
     200 
     201                    my $res = 0; 
     202                    foreach my $group (keys %old) { 
     203                        $old{$group} or next; # no change 
     204 
     205                        my $ogroup = $self->base->get_object('group', $group) or next; 
     206                        ($ogroup->_get_c_field('sutype') || '') =~ /^(jobtype|contrattype)$/ and next; 
     207 
     208                        if ($old{$group} eq 'n') { 
     209                            $res += $ogroup->_addAttributeValue('memberUID', $self->object->id); 
     210                        } else { 
     211                            if (($self->object->_get_c_field('department') || '') eq $ogroup->id) { 
     212                                $self->base->log(LA_WARN, 
     213                                    "Don't removing user %s from group %s: is its department", 
     214                                    $self->object->id, $ogroup->id); 
     215                                next; 
     216                            } 
     217                            $res += $ogroup->_delAttributeValue('memberUID', $self->object->id); 
     218                        } 
     219                    } 
     220                    return $res; 
     221                }, 
     222            }, 
     223            forward => { 
     224                managed => 1, 
     225                get => sub { 
     226                    my ($self) = @_; 
     227                    my $sth = $self->base->db->prepare(q{ 
     228                        select forward from aliases where name = ? 
     229                        } . ($self->base->{wexported} ? '' : ' and exported = true')); 
     230                    $sth->execute($self->object->id); 
     231                    my $res = $sth->fetchrow_hashref; 
     232                    $sth->finish; 
     233                    return $res->{forward} 
     234                }, 
     235                set => sub { 
     236                    my ($self, $data) = @_; 
     237                    if ($data) { 
     238                        if (my $f = $self->base->get_object('aliases', $self->object->id)) { 
     239                            return $f->_set_c_fields(forward => $data); 
     240                        } else { 
     241                            if ($self->base->_create_c_object( 
     242                                    'aliases', $self->object->id, 
     243                                    forward => $data, 
     244                                    description => 'automatically created for ' . $self->object->id, 
     245                                )) { 
     246                                return 1; 
     247                            } else { 
     248                                $self->base->log(LA_ERR, "Cannot add forward for %s", 
     249                                    $self->id); 
     250                            } 
     251                        } 
     252                    } else { 
     253                        if (my $res = $self->base->_delete_object('aliases', $self->id)) { 
     254                            return $res; 
     255                        } else { 
     256                            $self->base->log(LA_ERR, "Cannot remove forward for %s", 
     257                                $self->id); 
     258                        } 
     259                    } 
     260                    return; 
     261                }, 
     262            }, 
    132263            aliases   => { 
    133264                reference => 'aliases', 
    134265                formtype => 'TEXT', 
    135266                multiple => 1, 
     267                get => sub { 
     268                    my ($self) = @_; 
     269                    my $sth = $self->base->db->prepare(q{ 
     270                        select name from aliases where array[lower($1)] = 
     271                        string_to_array(lower(array_to_string("forward", ',')), ',') 
     272                        } . ($self->base->{wexported} ? '' : 'and exported = true')); 
     273                    $sth->execute($self->object->id); 
     274                    my @values; 
     275                    while (my $res = $sth->fetchrow_hashref) { 
     276                        push(@values, $res->{name}); 
     277                    } 
     278                    return \@values; 
     279                }, 
     280                set => sub { 
     281                    my ($self, $data) = @_; 
     282                    my $res = 0; 
     283                    my %aliases = map { $_ => 1 } grep { $_ } (ref $data ? @{$data} : $data); 
     284                    foreach ($self->object->_get_attributes('aliases')) { 
     285                        $aliases{$_} ||= 0; 
     286                        $aliases{$_} +=2; 
     287                    } 
     288                    foreach (keys %aliases) { 
     289                        if ($aliases{$_} == 2) { 
     290                            if ($self->base->_delete_object('aliases', $_)) { 
     291                                $res++ 
     292                            } else { 
     293                                $self->base->log(LA_ERR, 
     294                                    "Cannot remove aliases %s from user %s", $_, 
     295                                    $self->object->id); 
     296                            } 
     297                        } elsif ($aliases{$_} == 1) { 
     298                            if ($self->base->_create_c_object( 
     299                                    'aliases', $_, 
     300                                    forward => [ $self->object->id ], 
     301                                    description => 'automatically created for ' . $self->object->id, 
     302                                )) { 
     303                                $res++ 
     304                            } else { 
     305                                $self->base->log(LA_ERR, 'Cannot set forward %s to user %s', 
     306                                    $_, $self->object->id); 
     307                                return; 
     308                            } 
     309                        } # 3 no change 
     310                    } 
     311                    $res 
     312                }, 
    136313            }, 
    137314            revaliases => { 
    138315                formtype => 'TEXT', 
     316                set => sub { 
     317                    my ($self, $data) = @_; 
     318                 
     319                    my $res = 0; 
     320                    if ($data) { 
     321                        if (my $obj = $self->base-> 
     322                            get_object('revaliases', $self->object->id)) { 
     323                            my $ares = $obj->set_c_fields( 
     324                                'as' => $data, 
     325                                'exported' => ($self->get_attributes('exported') || 0), 
     326                            ); 
     327                            if (defined($ares)) { 
     328                                $res+=$ares; 
     329                            } else { 
     330                                $self->base->log(LA_ERR, 'Cannot set revaliases for user %s', 
     331                                    $self->object->id); 
     332                            } 
     333                        } else { 
     334                            if ($self->base->_create_c_object( 
     335                                    'revaliases', 
     336                                    $self->object->id, as => $data, 
     337                                    'exported' => ($self->get_attributes('exported') || 0), 
     338                                    description => 'automatically created for ' . $self->object->id, 
     339                                )) { 
     340                                $res++; 
     341                            } else { 
     342                                $self->base->log(LA_ERR, 'Cannot set revaliases for user %s', 
     343                                    $self->object->id); 
     344                            } 
     345                        } 
     346                    } else { 
     347                        $self->base->_delete_object('revaliases', $self->object->id); 
     348                        $res++; 
     349                    } 
     350 
     351                    $res 
     352                }, 
    139353            }, 
    140354            manager => { 
     
    167381                can_values => sub { 
    168382                    $base->search_objects('site') 
    169                 } 
    170             }, 
    171             co => { }, 
    172             l => { }, 
    173             postalCode => { }, 
    174             streetAddress => { formtype => 'TEXTAREA', }, 
    175             postOfficeBox => { }, 
    176             st => { }, 
    177             facsimileTelephoneNumber => { }, 
    178             o => { iname => 'company', ro => 1 }, 
     383                }, 
     384                get => sub { 
     385                    my ($self) = @_; 
     386                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     387                        $self->base->get_object('address', $fmainaddress) 
     388                            ->_get_c_field($self->name); 
     389                    } else { 
     390                        return; 
     391                    } 
     392                }, 
     393                set => $subsetaddress, 
     394            }, 
     395            co => { 
     396                get => sub { 
     397                    my ($self) = @_; 
     398                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     399                        $self->base->get_object('address', $fmainaddress) 
     400                            ->_get_c_field($self->name); 
     401                    } else { 
     402                        return; 
     403                    } 
     404                }, 
     405                set => $subsetaddress, 
     406            }, 
     407            l => { 
     408                get => sub { 
     409                    my ($self) = @_; 
     410                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     411                        $self->base->get_object('address', $fmainaddress) 
     412                            ->_get_c_field($self->name); 
     413                    } else { 
     414                        return; 
     415                    } 
     416                }, 
     417                set => $subsetaddress, 
     418            }, 
     419            postalCode => { 
     420                get => sub { 
     421                    my ($self) = @_; 
     422                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     423                        $self->base->get_object('address', $fmainaddress) 
     424                            ->_get_c_field($self->name); 
     425                    } else { 
     426                        return; 
     427                    } 
     428                }, 
     429                set => $subsetaddress, 
     430            }, 
     431            streetAddress => { 
     432                formtype => 'TEXTAREA', 
     433                get => sub { 
     434                    my ($self) = @_; 
     435                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     436                        $self->base->get_object('address', $fmainaddress) 
     437                            ->_get_c_field($self->name); 
     438                    } else { 
     439                        return; 
     440                    } 
     441                }, 
     442                set => $subsetaddress, 
     443            }, 
     444            postOfficeBox => { 
     445                get => sub { 
     446                    my ($self) = @_; 
     447                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     448                        $self->base->get_object('address', $fmainaddress) 
     449                            ->_get_c_field($self->name); 
     450                    } else { 
     451                        return; 
     452                    } 
     453                }, 
     454                set => $subsetaddress, 
     455            }, 
     456            st => { 
     457                get => sub { 
     458                    my ($self) = @_; 
     459                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     460                        $self->base->get_object('address', $fmainaddress) 
     461                            ->_get_c_field($self->name); 
     462                    } else { 
     463                        return; 
     464                    } 
     465                }, 
     466                set => $subsetaddress, 
     467            }, 
     468            facsimileTelephoneNumber => { 
     469                get => sub { 
     470                    my ($self) = @_; 
     471                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     472                        $self->base->get_object('address', $fmainaddress) 
     473                            ->_get_c_field($self->name); 
     474                    } else { 
     475                        return; 
     476                    } 
     477                }, 
     478                set => $subsetaddress, 
     479            }, 
     480            o => { 
     481                ro => 1, 
     482                iname => 'company', 
     483            }, 
    179484            ou => { iname => 'department', ro => 1 }, 
    180             telephoneNumber => { }, 
    181             physicalDeliveryOfficeName => { }, 
     485            telephoneNumber => { 
     486                get => sub { 
     487                    my ($self) = @_; 
     488                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     489                        $self->base->get_object('address', $fmainaddress) 
     490                            ->_get_c_field($self->name); 
     491                    } else { 
     492                        return; 
     493                    } 
     494                }, 
     495                set => $subsetaddress, 
     496            }, 
     497            physicalDeliveryOfficeName => { 
     498                get => sub { 
     499                    my ($self) = @_; 
     500                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     501                        $self->base->get_object('address', $fmainaddress) 
     502                            ->_get_c_field($self->name); 
     503                    } else { 
     504                        return; 
     505                    } 
     506                }, 
     507                set => $subsetaddress, 
     508            }, 
    182509            uid => { iname => 'name', ro => 1 }, 
    183510            cn =>  { iname => 'name', ro => 1 }, 
     
    216543                }, 
    217544            }, 
    218             sAMAccountName  => { ro => 1, managed => 1  }, 
     545            sAMAccountName  => { 
     546                ro => 1, 
     547                managed => 1, 
     548                iname => 'name', 
     549            }, 
    219550            accountExpires => { 
    220551                ro => 1, 
     
    282613            }, 
    283614            managedObjects => { ro => 1, reference => 'group', }, 
    284             otheraddress => { ro => 1, reference => 'address', }, 
    285             mainaddress => { ro => 1, reference => 'address', }, 
    286             postalAddress => { ro => 1, }, 
     615            otheraddress => { 
     616                ro => 1, 
     617                reference => 'address', 
     618                get => sub { 
     619                    my ($self) = @_; 
     620                    my $sth = $self->base->db->prepare_cached(q{ 
     621                        select name from address left join address_attributes 
     622                        on address.ikey = address_attributes.okey and 
     623                        address_attributes.attr = 'isMainAddress' 
     624                        where "user" = ? 
     625                        order by address_attributes.attr 
     626                        }); 
     627                    $sth->execute($self->object->id); 
     628                    my @values; 
     629                    while (my $res = $sth->fetchrow_hashref) { 
     630                        push(@values, $res->{name}); 
     631                    } 
     632                    return \@values; 
     633                }, 
     634            }, 
     635            mainaddress => { 
     636                ro => 1, 
     637                reference => 'address', 
     638                get => sub { 
     639                    my ($self) = @_; 
     640                    my $sth = $self->base->db->prepare_cached(q{ 
     641                        select name from address join address_attributes on ikey = okey 
     642                        where "user" = ? and attr = 'isMainAddress' 
     643                        }); 
     644                    $sth->execute($self->object->id); 
     645                    my $res = $sth->fetchrow_hashref; 
     646                    $sth->finish; 
     647                    return $res->{name}; 
     648                }, 
     649            }, 
     650            postalAddress => { 
     651                ro => 1, 
     652                get => sub { 
     653                    my ($self) = @_; 
     654                    if (my $fmainaddress = $self->object->_get_c_field('mainaddress')) { 
     655                        $self->base->get_object('address', $fmainaddress) 
     656                            ->_get_c_field($self->name); 
     657                    } else { 
     658                        return; 
     659                    } 
     660                }, 
     661            }, 
    287662            facsimileTelephoneNumber => { ro => 1, }, 
    288663            allsite   => { 
     
    324699                }, 
    325700            }, 
    326             krb5ValidEnd => { ro => 1, }, 
     701            krb5ValidEnd => { 
     702                ro => 1, 
     703                managed => 1, 
     704                get => sub { 
     705                    my ($self) = @_; 
     706                    my $sth = $self->object->db->prepare_cached( 
     707                        sprintf( 
     708                            q{select date_part('epoch', expire)::int as expire 
     709                            from %s where %s = ?}, 
     710                            $self->object->db->quote_identifier($self->object->_object_table), 
     711                            $self->object->db->quote_identifier($self->object->_key_field), 
     712                        ) 
     713                    ); 
     714                    $sth->execute($self->object->id); 
     715                    my $res = $sth->fetchrow_hashref; 
     716                    $sth->finish; 
     717                    return $res->{expire} 
     718                }, 
     719            }, 
    327720            cells  => { 
    328721                ro => 1, 
     
    362755            }, 
    363756            userPassword => { readable => 0, }, 
     757            wWWHomePage => { }, 
     758            title => { }, 
     759            snNative => { }, 
     760            givenNameNative => { }, 
     761            sn => { }, 
     762            shadowWarning => { }, 
     763            shadowMin => { }, 
     764            shadowMax => { }, 
     765            shadowLastChange => { }, 
     766            shadowInactive => { }, 
     767            shadowFlag => { }, 
     768            otherTelephone => { }, 
     769            nickname => { }, 
     770            mobile => { }, 
     771            mail => { }, 
     772            labeledURI => { }, 
     773            jobType => { }, 
     774            ipPhone => { }, 
     775            initials => { }, 
     776            homePhone => { }, 
     777            homeDirectory => { }, 
     778            halReference => { }, 
     779            grade => { }, 
     780            givenName => { }, 
     781            encryptedPassword => { }, 
     782            description => { }, 
     783            company => { }, 
     784            comment => { }, 
     785            college => { }, 
    364786        } 
    365787    ) 
    366 } 
    367  
    368 sub get_field { 
    369     my ($self, $field) = @_; 
    370     if ($field eq 'sAMAccountName') { 
    371         return $self->id; 
    372     } elsif ($field eq 'krb5ValidEnd') { 
    373         my $sth = $self->db->prepare_cached( 
    374             sprintf( 
    375                 q{select date_part('epoch', expire)::int as expire 
    376                 from %s where %s = ?}, 
    377                 $self->db->quote_identifier($self->_object_table), 
    378                 $self->db->quote_identifier($self->_key_field), 
    379             ) 
    380         ); 
    381         $sth->execute($self->id); 
    382         my $res = $sth->fetchrow_hashref; 
    383         $sth->finish; 
    384         return $res->{expire} 
    385     } elsif ($field eq 'pwdAccountLockedTime') { 
    386     } elsif ($field eq 'otheraddress') { 
    387         my $sth = $self->db->prepare_cached(q{ 
    388             select name from address left join address_attributes 
    389             on address.ikey = address_attributes.okey and 
    390             address_attributes.attr = 'isMainAddress' 
    391             where "user" = ? 
    392             order by address_attributes.attr 
    393         }); 
    394         $sth->execute($self->id); 
    395         my @values; 
    396         while (my $res = $sth->fetchrow_hashref) { 
    397             push(@values, $res->{name}); 
    398         } 
    399         return \@values; 
    400     } elsif ($field eq 'mainaddress') { 
    401         my $sth = $self->db->prepare_cached(q{ 
    402             select name from address join address_attributes on ikey = okey 
    403             where "user" = ? and attr = 'isMainAddress' 
    404             }); 
    405         $sth->execute($self->id); 
    406         my $res = $sth->fetchrow_hashref; 
    407         $sth->finish; 
    408         return $res->{name}; 
    409     } elsif (grep { $field eq $_ } qw(postalAddress 
    410             co l postalCode streetAddress  
    411             postOfficeBox st  
    412             facsimileTelephoneNumber  
    413             o telephoneNumber  
    414             physicalDeliveryOfficeName  
    415             site 
    416         )) { 
    417         if (my $fmainaddress = $self->_get_c_field('mainaddress')) { 
    418             my $address = $self->base->get_object('address', $fmainaddress); 
    419             if ($address) { 
    420                 return $address->_get_c_field($field); 
    421             } else { # can't happend 
    422                 return; 
    423             } 
    424         } else { 
    425             return $self->SUPER::get_field($field); 
    426         } 
    427     } elsif ($field eq 'aliases') { 
    428         my $sth = $self->db->prepare(q{ 
    429             select name from aliases where array[lower($1)] = 
    430                 string_to_array(lower(array_to_string("forward", ',')), ',') 
    431         } . ($self->base->{wexported} ? '' : 'and exported = true')); 
    432         $sth->execute($self->id); 
    433         my @values; 
    434         while (my $res = $sth->fetchrow_hashref) { 
    435             push(@values, $res->{name}); 
    436         } 
    437         return \@values; 
    438     } elsif ($field eq 'forward') { 
    439         my $sth = $self->db->prepare(q{ 
    440             select forward from aliases where name = ? 
    441         } . ($self->base->{wexported} ? '' : ' and exported = true')); 
    442         $sth->execute($self->id); 
    443         my $res = $sth->fetchrow_hashref; 
    444         $sth->finish; 
    445         return $res->{forward} 
    446     } elsif ($field eq 'revaliases') { 
    447         my $sth = $self->db->prepare(q{ 
    448             select "as" from revaliases where name = ? 
    449         } . ($self->base->{wexported} ? '' : ' and exported = true')); 
    450         $sth->execute($self->id); 
    451         my $res = $sth->fetchrow_hashref; 
    452         $sth->finish; 
    453         return $res->{as} 
    454     } elsif ($field eq 'managerContact') { 
    455     } else { 
    456         return $self->SUPER::get_field($field); 
    457     } 
    458788} 
    459789 
     
    476806} 
    477807 
    478 sub set_fields { 
    479     my ($self, %data) = @_; 
    480     my %fdata; 
    481     my $res = 0; 
    482     foreach my $attr (keys %data) { 
    483         $attr =~ /^(un)?exported$/ and do { 
    484             if (my $obj = $self->base-> 
    485                 get_object('revaliases', $self->id)) { 
    486                 my $ares = $obj->set_c_fields( 
    487                     ($attr eq 'exported' ? 'exported' : 'unexported') => $data{$attr} 
    488                 ); 
    489                 if (defined($ares)) { 
    490                     $res+=$ares; 
    491                 } else { 
    492                     $self->base->log(LA_ERR, 
    493                         'Cannot set revaliases exported attribute for user %s', 
    494                         $self->id); 
    495                 } 
    496             } 
    497             my $must_expire = $attr eq 'exported' 
    498                 ? ($data{$attr} ? 0 : 1 ) 
    499                 : ($data{$attr} ? 1 : 0 ); 
    500  
    501             foreach my $al ($self->get_attributes('aliases')) { 
    502                 my $obj = $self->base->get_object('aliases', $al) or next; 
    503                 $obj->_set_c_fields( 
    504                     expire => $must_expire 
    505                         ? strftime( 
    506                             "%Y-%m-%d %H:%M:%S", 
    507                             localtime(time + 3600 * 24 * 365) 
    508                           ) 
    509                         : undef, 
    510                 ); 
    511             } 
    512         }; 
    513         $attr eq 'gidnumber' && $data{$attr} !~ /^\d+$/ and do { 
    514             my $group = $self->base->get_object('group', $data{$attr}) or do { 
    515                 $self->base->log(LA_ERROR, 
    516                     "Can't set gidNumber to %s: no such group", $data{$attr}); 
    517                 return; 
    518             }; 
    519             $data{$attr} = $group->get_attributes('gidNumber'); 
    520         }; 
    521         $attr =~ /^memberOf$/ and do { 
    522             my %members; 
    523             my $memberof = $self->get_field('memberOf'); 
    524             foreach (ref $memberof 
    525                 ? @{ $memberof } 
    526                 : $memberof || ()) { 
    527                 $members{$_}{c} = 1; 
    528             } 
    529             foreach (grep { $_ } ref $data{$attr} ? @{ $data{$attr} || []} : $data{$attr}) { 
    530                 $members{$_}{n} = 1; 
    531             } 
    532  
    533             foreach my $member (keys %members) { 
    534                 $members{$member}{c} && $members{$member}{n} and next; # no change ! 
    535                 my $group = $self->base->get_object('group', $member) or do { 
    536                     la_log(LA_WARN, "Cannot get group %s to set members", $member);  
    537                     next; 
    538                 }; 
    539                 ($group->_get_c_field('sutype') || '') =~ /^(jobtype|contrattype)$/ and next; 
    540                 if ($members{$member}{n}) { 
    541                     my @newmembers = $group->get_attributes('memberUID'); 
    542                     $res += $group->_set_c_fields('memberUID', [ $self->id, @newmembers ]); 
    543                 } elsif ($members{$member}{c}) { 
    544                     if (($self->_get_c_field('department') || '') eq $group->id) { 
    545                         $self->base->log(LA_WARN, 
    546                             "Don't removing user %s from group %s: is it's department", 
    547                             $self->id, $group->id); 
    548                         next; 
    549                     } 
    550                     my @newmembers = grep { $_ ne $self->id } $group->get_attributes('memberUID'); 
    551                     $res += $group->_set_c_fields('memberUID', [ @newmembers ]); 
    552                 } # else {} # can't happend 
    553             } 
    554             next; 
    555         }; 
    556         $attr =~ /^forward$/ and do { 
    557             if ($data{$attr}) { 
    558                 if (my $f = $self->base->get_object('aliases', $self->id)) { 
    559                     $res += $f->_set_c_fields(forward => $data{$attr}); 
    560                 } else { 
    561                     if ($self->base->_create_c_object( 
    562                             'aliases', $self->id, 
    563                             forward => $data{$attr}, 
    564                             description => 'automatically created for ' . $self->id, 
    565                         )) { 
    566                         $res++; 
    567                     } else { 
    568                         $self->base->log(LA_ERR, "Cannot add forward for %s", 
    569                             $self->id); 
    570                     } 
    571                 } 
    572             } else { 
    573                 if ($self->base->_delete_object('aliases', $self->id)) { 
    574                     $res++; 
    575                 } else { 
    576                     $self->base->log(LA_ERR, "Cannot remove forward for %s", 
    577                         $self->id); 
    578                 } 
    579             } 
    580             next; 
    581         }; 
    582         $attr =~ /^aliases$/ and do { 
    583             my %aliases = map { $_ => 1 } grep { $_ } (ref $data{$attr} ? @{$data{$attr}} : 
    584                 $data{$attr}); 
    585             foreach ($self->_get_attributes('aliases')) { 
    586                 $aliases{$_} ||= 0; 
    587                 $aliases{$_} +=2; 
    588             } 
    589             foreach (keys %aliases) { 
    590                 if ($aliases{$_} == 2) { 
    591                     if ($self->base->_delete_object('aliases', $_)) { 
    592                         $res++ 
    593                     } else { 
    594                         $self->base->log(LA_ERR, 
    595                             "Cannot remove aliases %s from user %s", $_, 
    596                             $self->id); 
    597                     } 
    598                 } elsif ($aliases{$_} == 1) { 
    599                     if ($self->base->_create_c_object( 
    600                             'aliases', $_, 
    601                             forward => [ $self->id ], 
    602                             description => 'automatically created for ' . $self->id, 
    603                         )) { 
    604                         $res++ 
    605                     } else { 
    606                         $self->base->log(LA_ERR, 'Cannot set forward %s to user %s', 
    607                             $_, $self->id); 
    608                         return 
    609                     } 
    610                 } # 3 no change 
    611             } 
    612             next; 
    613         }; 
    614         $attr =~ /^revaliases$/ and do { 
    615             if ($data{$attr}) { 
    616                 if (my $obj = $self->base-> 
    617                         get_object('revaliases', $self->id)) { 
    618                     my $ares = $obj->set_c_fields( 
    619                         'as' => $data{$attr}, 
    620                         'exported' => ($self->get_attributes('exported') || 0), 
    621                     ); 
    622                     if (defined($ares)) { 
    623                         $res+=$ares; 
    624                     } else { 
    625                         $self->base->log(LA_ERR, 'Cannot set revaliases for user %s', 
    626                             $self->id); 
    627                     } 
    628                 } else { 
    629                     if ($self->base->_create_c_object( 
    630                         'revaliases', 
    631                         $self->id, as => $data{$attr}, 
    632                         'exported' => ($self->get_attributes('exported') || 0), 
    633                         description => 'automatically created for ' . $self->id, 
    634                     )) { 
    635                         $res++; 
    636                     } else { 
    637                         $self->base->log(LA_ERR, 'Cannot set revaliases for user %s', 
    638                             $self->id); 
    639                     } 
    640                 } 
    641             } else { 
    642                 $self->base->_delete_object('revaliases', $self->id); 
    643                 $res++; 
    644             } 
    645             next; 
    646         }; 
    647         $attr =~ /^department$/ and do { 
    648             if ($data{$attr}) { 
    649                 my $dpmt = $self->base->get_object('group', $data{$attr}) or do { 
    650                     $self->base->log(LA_ERR,  
    651                         "Group %s does not exists", 
    652                         $data{$attr}); 
    653                     return; 
    654                 }; 
    655                 if ((($dpmt->_get_c_field('sutype') || '') ne 'dpmt')) { 
    656                     $self->base->log(LA_ERR, "Group %s is not a department", 
    657                         $data{$attr}); 
    658                     return; 
    659                 } 
    660             } 
    661         };           
    662         $attr =~ /^jobType$/ and do { 
    663             if ($data{$attr}) { 
    664                 my $dpmt = $self->base->get_object('group', $data{$attr}) or do { 
    665                     $self->base->log(LA_ERR,  
    666                         "Group %s does not exists", 
    667                         $data{$attr}); 
    668                     return; 
    669                 }; 
    670                 if ((($dpmt->_get_c_field('sutype') || '') ne 'jobtype')) { 
    671                     $self->base->log(LA_ERR, "Group %s is not a jobtype", 
    672                         $data{$attr}); 
    673                     return; 
    674                 } 
    675             } 
    676         };           
    677         $attr =~ /^contratType$/ and do { 
    678             if ($data{$attr}) { 
    679                 my $dpmt = $self->base->get_object('group', $data{$attr}) or do { 
    680                     $self->base->log(LA_ERR,  
    681                         "Group %s does not exists", 
    682                         $data{$attr}); 
    683                     return; 
    684                 }; 
    685                 if ((($dpmt->_get_c_field('sutype') || '') ne 'contrattype')) { 
    686                     $self->base->log(LA_ERR, "Group %s is not a contrattype", 
    687                         $data{$attr}); 
    688                     return; 
    689                 } 
    690             } 
    691         };           
    692         grep { $attr eq $_ } (qw(co l postalCode streetAddress  
    693             postOfficeBox st facsimileTelephoneNumber  
    694             o telephoneNumber physicalDeliveryOfficeName site)) and do { 
    695             my $fmainaddress = $self->_get_c_field('mainaddress'); 
    696             # set address attribute => create address object on the fly 
    697             # except if attr is empty ! 
    698             if (!$fmainaddress && $data{$attr}) { 
    699                 $fmainaddress = $self->id . '-' . join('', map { ('a'..'z')[rand(26)] } 
    700                 (0..4)); 
    701                 $self->base->_create_c_object( 
    702                     'address', $fmainaddress, 
    703                     user => $self->id, 
    704                     isMainAddress => 1, ) or do { 
    705                     $self->base->log(LA_ERR, 
    706                         "Cannot create main address for user %s", $self->id); 
    707                     return; 
    708                 }; 
    709             } 
    710             if ($fmainaddress &&  
    711                 (my $address = $self->base->get_object('address', $fmainaddress))) { 
    712                 if ($address->attribute($attr) && 
    713                     !$address->attribute($attr)->ro) { 
    714                     $res += $address->set_c_fields($attr => $data{$attr}) ||0; 
    715                 } 
    716             } 
    717             next; 
    718         }; 
    719         $fdata{$attr} = $data{$attr} || undef; 
    720     } 
    721     if (keys %fdata) { 
    722         if (defined(my $res2 = $self->SUPER::set_fields(%fdata))) { 
    723            return $res2 + $res; 
    724        } else { 
    725            return; 
    726        } 
    727     } else { return $res; } 
    728 } 
    729  
    730  
    7318081; 
    732809 
  • trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/objects.pm

    r1314 r1315  
    8282        } 
    8383    } 
     84 
     85    # Common to all object attribute: 
     86    my %commons = ( 
     87        name      => { inline => 1, ro => 1, }, 
     88        create    => { inline => 1, ro => 1, }, 
     89        date      => { inline => 1, ro => 1, }, 
     90        exported   =>   { inline => 1, formtype => 'CHECKBOX', hide => 1, monitored => 1 }, 
     91        unexported =>   { 
     92            inline => 1, 
     93            managed => 1, 
     94            formtype => 'CHECKBOX', 
     95            get => sub { 
     96                my ($self) = @_; 
     97                return $self->object->get_field('exported') ? undef : 1; 
     98            }, 
     99            set => sub { 
     100                my ($self, $data) = @_; 
     101                $self->object->_set_c_fields('exported', $data ? 'false' : 'true'); 
     102            }, 
     103        }, 
     104        services   =>   { inline => 1, multiple => 1, reference => 'service' }, 
     105    ); 
     106 
     107    # Merging / overriding with common to all object attributes properties 
     108    foreach my $attr (keys %commons) { 
     109        foreach my $var (keys %{ $commons{$attr} }) { 
     110            $info->{$attr}{$var} = $commons{$attr}{$var}; 
     111        } 
     112    } 
     113 
     114    # TODO kill this code: useless since everything is declared in perl code 
    84115    if ($class->_has_extended_attributes) { 
    85116        if (!$base->{__cache}{$class->_object_table}{extend}) { 
     
    98129        } 
    99130        foreach (@{$base->{__cache}{$class->_object_table}{extend}}) { 
     131            $base->log(LA_ERR, 'Attribute %s for %s not declared in code', $_, $class->type) if(!exists($info->{$_})); 
    100132            $info->{$_} ||= {}; 
    101133        } 
    102134    } 
    103     $info->{exported}   = { inline => 1, formtype => 'CHECKBOX', hide => 1, monitored => 1 }; 
    104     $info->{unexported} = { inline => 1, formtype => 'CHECKBOX', }; 
    105     $info->{services}   = { inline => 1, multiple => 1, reference => 'service' }; 
    106135 
    107136    $info 
     
    249278sub get_field { 
    250279    my ($self, $field) = @_; 
    251     if ($field eq 'unexported') { 
    252         return $self->get_field('exported') ? undef : 1; 
    253     } 
    254280    if ($field eq 'services') { 
    255281        my @services; 
     
    315341    my @vals; 
    316342    my %ext; 
    317     if (exists($data{unexported})) { 
    318         $data{exported} = $data{unexported} ? 0 : 1; 
    319     } 
    320     if (exists($data{exported})) { 
    321         $data{exported} ||= 0; 
    322     } 
    323343    if (exists($data{services})) { 
    324344        my %old = map { $_ => 0 } $self->get_attributes('services'); 
     
    338358        delete($data{services}); 
    339359    } 
     360    if (exists($data{services})) { 
     361        my %old = map { $_ => 0 } $self->get_attributes('services'); 
     362        foreach my $serv (grep { $_ } ref $data{services} ? @{ $data{services} } : $data{services}) { 
     363            if (!exists($old{$serv})) { 
     364                my $oserv = $self->base->get_object('service', $serv) or next; 
     365                $oserv->addAttributeValue('dependOn', $self->type . '.' . $self->id); 
     366            } 
     367            $old{$serv} = 1; 
     368        } 
     369        foreach my $serv (keys %old) { 
     370            if (!$old{$serv}) { 
     371                my $oserv = $self->base->get_object('service', $serv) or next; 
     372                $oserv->delAttributeValue('dependOn', $self->type . '.' . $self->id); 
     373            } 
     374        } 
     375        delete($data{services}); 
     376    } 
    340377    foreach my $field (keys %data) { 
    341378        my $attr = $self->attribute($field); 
    342         next if ($field eq 'unexported'); 
    343379        my $oldval = $self->get_field($field); 
    344380        next if (($data{$field} || '') eq ($oldval || '')); 
Note: See TracChangeset for help on using the changeset viewer.