source: LATMOS-Accounts-Web/lib/LATMOS/Accounts/Web/Model/AttrForms.pm @ 144

Last change on this file since 144 was 144, checked in by nanardon, 15 years ago
  • make AttrForm? model usable also for object creation
File size: 5.1 KB
Line 
1package LATMOS::Accounts::Web::Model::AttrForms;
2
3use strict;
4use warnings;
5use base 'Catalyst::Model';
6
7=head1 NAME
8
9LATMOS::Accounts::Web::Model::AttrForms - Catalyst Model
10
11=head1 DESCRIPTION
12
13Catalyst Model.
14
15=cut
16
17my $attrs = {
18    uid => [ 'Login' ],
19    uidNumber => [ 'UID' ],
20    gidNumber => [ 'GID', 'select:group:gidNumber' ],
21    sn => [ 'Nom' ],
22    givenName => [ 'Prénom' ],
23    homeDirectory => [ 'Home' ],
24    loginShell => [ 'Shell' ],
25    physicalDeliveryOfficeName => [ 'Bureau' ],
26    telephoneNumber => [ 'Téléphone' ],
27    otherTelephone => [ 'Téléphone (autre)' ],
28    company => [ 'Société' ],
29    l => [ 'Ville' ],
30    postalCode => [ 'Code postal' ],
31    postOfficeBox => [ 'BP' ],
32    department => [ 'Département' ],
33    streetAddress => [ 'Rue', 'textarea' ],
34    st => [ 'Etat' ],
35};
36
37my $forms = {
38    user => {
39        name => 'SystÚme',
40        acl => 'admin',
41        attrs => [ qw(
42            sn givenName description
43            uid uidNumber gidNumber gecos homeDirectory loginShell
44            mail
45        ) ],
46    },
47    useraddress => {
48        name => 'Adresse',
49        attrs => [ qw(
50            initials
51            telephoneNumber
52            otherTelephone
53            mail
54            streetAddress
55            postOfficeBox
56            postalCode
57            l
58            physicalDeliveryOfficeName
59        ) ],
60    },
61    userstatus => {
62        name => 'Status',
63        attrs => [ qw(
64            company
65            department
66        ) ],
67    },
68    site => {
69        name => 'Site',
70        attrs => [ qw(
71            streetAddress
72            postOfficeBox
73            postalCode
74            l
75        ) ],
76    },
77    group => {
78        name => 'SystÚme',
79        acl => 'admin',
80        attrs => [ qw(
81            gidNumber description
82        ) ],
83    },
84};
85
86sub escape {
87    my ($self, $text) = @_;
88    $text ||= '';
89    for ($text) {
90        s/&/&/g;
91        s/</&lt;/g;
92        s/>/&gt;/g;
93        s/"/&quot;/g;
94    }
95    $text;
96}
97
98sub new {
99    my ($class) = @_;
100    bless({}, $class);
101}
102
103# call either OBJ or type + base
104
105sub ACCEPT_CONTEXT {
106    my ($self, $c, $form, $object, $base) = @_;
107    my $new = {};
108    $new->{c} = $c;
109    $new->{form} = $form;
110    $new->{object} = $object if (ref $object);
111    $new->{base} = $base || ($object ? $object->base : undef) or return $self;
112    $new->{otype} = ref $object ? $object->type : $object;
113    bless($new, 'LATMOS::Accounts::Web::Model::AttrForms');
114}
115
116sub base {
117    my ( $self ) = @_;
118    $self->{base}
119}
120
121sub otype {
122    my ($self) = @_;
123    $self->{otype};
124}
125
126sub label {
127    my ($self) = @_;
128    $forms->{$self->{form}}->{name} || ''
129}
130
131sub attributes {
132    my ($self) = @_;
133    grep { $self->base->get_field_name($self->otype, $_, 'a') }
134    @{ $forms->{$self->{form}}->{attrs} };
135}
136
137sub attr_label {
138    my ($self, $attr) = @_;
139    return $self->escape($attrs->{$attr}[0] || $attr);
140}
141
142sub attr_raw_value {
143    my ($self, $attr) = @_;
144    return $self->{c}->req->param($attr) ||
145        ($self->{object} ? $self->{object}->get_c_field($attr) : '')
146}
147
148sub attr_field {
149    my ($self, $attr, $type) = @_;
150    $type ||= $self->base->get_field_name($self->otype, $attr, 'w')
151        ? $attrs->{$attr}[1] || ''
152        : 'label';
153    # exception: gidNumber is used also in group, but we don't want
154    # group list here, really the number !
155    $type = '' if (($self->{form} || '') =~ /^group/);
156    for ($type) {
157        /^textarea$/ and return sprintf(
158            '<textarea name="%s">%s</textarea>',
159            $self->escape($attr),
160            $self->escape($self->attr_raw_value($attr)),
161        );
162        /^label$/ and return $self->escape(
163            $self->attr_raw_value($attr)
164        );
165        /^select:([^:]+):(.*)$/ and do {
166            my $otype = $1;
167            my $keyfield = $2;
168            my $select = sprintf('<select name="%s">',
169                $self->escape($attr)) . "\n";
170            my $value = $self->attr_raw_value($attr);
171            foreach my $id ($self->{object}->base->list_objects($otype)) {
172                my $obj = $self->{object}->base->get_object($otype, $id) or next;
173                my $val = $keyfield ? $obj->get_c_field($keyfield) : $id;
174                $select .= sprintf(
175                    '    <option value="%s"%s>%s</options>',
176                    $self->escape($val),
177                    $value eq $val ? ' "selected"' : '',
178                    $self->escape($id),
179                );
180                $select .= "\n";
181            }
182            $select .= "</select>\n";
183            return $select;
184        };
185    }
186    return sprintf(
187        '<input type="text" name="%s" value="%s">',
188        $attr,
189        $self->escape($self->attr_raw_value($attr))
190    );
191}
192
193sub set_attrs {
194    my ($self) = @_;
195    $self->{object}->set_c_fields(
196        map {
197            $_ => $self->{c}->req->param($_)
198        } grep { 
199            exists $self->{c}->req->params->{$_}
200        } $self->attributes
201    );
202    $self->{object}->base->commit;
203}
204
205=head1 AUTHOR
206
207Thauvin Olivier
208
209=head1 LICENSE
210
211This library is free software, you can redistribute it and/or modify
212it under the same terms as Perl itself.
213
214=cut
215
2161;
Note: See TracBrowser for help on using the repository browser.