source: trunk/LATMOS-Accounts/lib/LATMOS/Accounts/Bases/Sql/Address.pm @ 1144

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

Fix setting address with site

File size: 5.4 KB
Line 
1package LATMOS::Accounts::Bases::Sql::Address;
2
3use 5.010000;
4use strict;
5use warnings;
6
7use base qw(LATMOS::Accounts::Bases::Sql::objects);
8
9our $VERSION = (q$Rev: 594 $ =~ /^Rev: (\d+) /)[0];
10
11=head1 NAME
12
13LATMOS::Accounts::Bases::Sql::Address - Physical office Adress Support
14
15=head1 DESCRIPTION
16
17C<Address> objects allow to store user's several office addresses.
18
19Notice most of other bases (Ldap, ...) support only one address.
20
21=cut
22
23sub _object_table { 'address' }
24
25sub _key_field { 'name' }
26
27sub _has_extended_attributes { 1 }
28
29sub _get_attr_schema {
30    my ($class, $base) = @_;
31
32    $class->SUPER::_get_attr_schema($base,
33        {
34            name =>         { inline => 1, },
35            exported =>     { inline => 1, },
36            user =>         { inline => 1,
37                reference => 'user',
38            },
39            site =>         {
40                reference => 'site',
41            },
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 },
52            },
53            postalCode =>   {
54                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 },
55            },
56            streetAddress => {
57                formtype => 'TEXTAREA',
58                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 },
59            },
60            postOfficeBox => {
61                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 },
62            },
63            st =>           {
64                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 },
65            },
66            facsimileTelephoneNumber => {
67                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 },
68            },
69            o =>            {
70                ro => sub { $_[0] && $_[0]->get_attributes('site') ? 1 : 0 },
71            },
72            isMainAddress => { formtype => 'CHECKBOX', },
73            active => { ro => 1 },
74        }
75    );
76}
77
78sub _create {
79    my ($class, $base, $id, %data) = @_;
80    $data{user} or return;
81    my $user = $base->get_object('user', $data{user});
82    $user or return;
83    if (!$user->get_c_field('otheraddress')) {
84        $data{isMainAddress} = 1;
85    }
86    $class->SUPER::_create($base, $id, %data);
87}
88
89sub 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
129sub _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
142sub set_fields {
143    my ($self, %data) = @_;
144    my %fdata;
145    foreach my $attr (keys %data) {
146        $attr =~ /^site$/ and do {
147            my $site =
148            $self->base->get_object('site',
149                $data{$attr});
150            if ($site) {
151                foreach (qw(co l postalCode streetAddress postOfficeBox st
152                        facsimileTelephoneNumber o)) {
153                    $fdata{$_} = undef;
154                    $data{$_} = undef;
155                }
156            }
157            $fdata{$attr} = $data{$attr} || undef;
158            next;
159        };
160        $fdata{$attr} = $data{$attr} || undef;
161    }
162    if  (keys %fdata) {
163        $self->SUPER::set_fields(%fdata);
164    }
165}
166
1671;
168
169__END__
170
171=head1 SEE ALSO
172
173L<LATMOS::Accounts::Bases::Sql>
174
175L<LATMOS::Accounts::Bases::Sql::Onlyaddress>
176
177=head1 AUTHOR
178
179Olivier Thauvin, E<lt>olivier.thauvin@latmos.ipsl.frE<gt>
180
181=head1 COPYRIGHT AND LICENSE
182
183Copyright (C) 2008, 2009 CNRS SA/CETP/LATMOS
184
185This library is free software; you can redistribute it and/or modify
186it under the same terms as Perl itself, either Perl version 5.10.0 or,
187at your option, any later version of Perl 5 you may have available.
188
189
190=cut
Note: See TracBrowser for help on using the repository browser.