import rt 3.2.2
[freeside.git] / rt / lib / RT / Attributes_Overlay.pm
1 # {{{ BEGIN BPS TAGGED BLOCK
2
3 # COPYRIGHT:
4 #  
5 # This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
6 #                                          <jesse@bestpractical.com>
7
8 # (Except where explicitly superseded by other copyright notices)
9
10
11 # LICENSE:
12
13 # This work is made available to you under the terms of Version 2 of
14 # the GNU General Public License. A copy of that license should have
15 # been provided with this software, but in any event can be snarfed
16 # from www.gnu.org.
17
18 # This work is distributed in the hope that it will be useful, but
19 # WITHOUT ANY WARRANTY; without even the implied warranty of
20 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
21 # General Public License for more details.
22
23 # You should have received a copy of the GNU General Public License
24 # along with this program; if not, write to the Free Software
25 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
26
27
28 # CONTRIBUTION SUBMISSION POLICY:
29
30 # (The following paragraph is not intended to limit the rights granted
31 # to you to modify and distribute this software under the terms of
32 # the GNU General Public License and is only of importance to you if
33 # you choose to contribute your changes and enhancements to the
34 # community by submitting them to Best Practical Solutions, LLC.)
35
36 # By intentionally submitting any modifications, corrections or
37 # derivatives to this work, or any other work intended for use with
38 # Request Tracker, to Best Practical Solutions, LLC, you confirm that
39 # you are the copyright holder for those contributions and you grant
40 # Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
41 # royalty-free, perpetual, license to use, copy, create derivative
42 # works based on those contributions, and sublicense and distribute
43 # those contributions and any derivatives thereof.
44
45 # }}} END BPS TAGGED BLOCK
46 =head1 NAME
47
48   RT::Attributes - collection of RT::Attribute objects
49
50 =head1 SYNOPSIS
51
52   use RT:Attributes;
53 my $Attributes = new RT::Attributes($CurrentUser);
54
55 =head1 DESCRIPTION
56
57
58 =head1 METHODS
59
60 =begin testing
61
62 ok(require RT::Attributes);
63
64 my $root = RT::User->new($RT::SystemUser);
65 ok (UNIVERSAL::isa($root, 'RT::User'));
66 $root->Load('root');
67 ok($root->id, "Found a user for root");
68
69 my $attr = $root->Attributes;
70
71 ok (UNIVERSAL::isa($attr,'RT::Attributes'), 'got the attributes object');
72
73 my ($id, $msg) =  $root->AddAttribute(Name => 'TestAttr', Content => 'The attribute has content'); 
74 ok ($id, $msg);
75 my @names = $attr->Names;
76
77 is ($names[0] , 'TestAttr');
78
79
80 =end testing
81
82 =cut
83
84 use strict;
85 no warnings qw(redefine);
86
87
88 sub _DoSearch {
89     my $self = shift;
90     $self->SUPER::_DoSearch();
91     $self->_BuildAccessTable();
92 }
93
94
95 sub _BuildAccessTable {
96     my $self = shift;
97     delete $self->{'attr'};
98     while (my $attr = $self->Next) {
99         push @{$self->{'attr'}->{$attr->Name}}, $attr;
100     }
101 }
102
103
104 sub _AttrHash {
105     my $self = shift;
106     $self->_DoSearch if ($self->{'must_redo_search'});
107     unless ($self->{'attr'}) {
108         $self->{'attr'}->{'__none'} = RT::Attribute->new($self->CurrentUser);
109     }
110     return ($self->{'attr'});
111 }
112
113 =head2 Names
114
115 Returns a list of the Names of all attributes for this object. 
116
117 =cut
118
119 sub Names {
120     my $self = shift;
121     my @keys =  keys %{$self->_AttrHash};
122     return(@keys);
123
124
125 }
126
127 =head2 Named STRING
128
129 Returns an array of all the RT::Attribute objects with the name STRING
130
131 =cut
132
133 sub Named {
134     my $self = shift;
135     my $name = shift;
136     my @attributes; 
137     if ($self->_AttrHash) {
138         @attributes = @{($self->_AttrHash->{$name}||[])};
139     }
140     return (@attributes);   
141 }
142
143 =head2 WithId ID
144
145 Returns the RT::Attribute objects with the id ID
146
147 XXX TODO XXX THIS NEEDS A BETTER ACL CHECK
148
149 =cut
150
151 sub WithId {
152     my $self = shift;
153     my $id = shift;
154
155     my $attr = RT::Attribute->new($self->CurrentUser);
156     $attr->LoadByCols( id => $id );
157     return($attr);
158 }
159
160 =head2 DeleteEntry { Name =>   Content => , id => }
161
162 Deletes attributes with
163     the matching name 
164  and the matching content or id
165
166 If Content and id are both undefined, delete all attributes with
167 the matching name.
168
169 =cut
170
171
172 sub DeleteEntry {
173     my $self = shift;
174     my %args = ( Name => undef,
175                  Content => undef,
176                  id => undef,
177                  @_);
178
179     foreach my $attr ($self->Named($args{'Name'})){ 
180         $attr->Delete
181             if (!defined $args{'id'} and !defined $args{'Content'})
182             or (defined $args{'id'} and $attr->id eq $args{'id'})
183             or (defined $args{'Content'} and $attr->Content eq $args{'Content'});
184     }
185     $self->_DoSearch();
186     return (1, $self->loc('Attribute Deleted'));
187 }
188
189
190 # {{{ LimitToObject 
191
192 =head2 LimitToObject $object
193
194 Limit the Attributes to rights for the object $object. It needs to be an RT::Record class.
195
196 =cut
197
198 sub LimitToObject {
199     my $self = shift;
200     my $obj = shift;
201     unless (defined($obj) && ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id) {
202     return undef;
203     }
204     $self->Limit(FIELD => 'ObjectType', OPERATOR=> '=', VALUE => ref($obj), ENTRYAGGREGATOR => 'OR');
205     $self->Limit(FIELD => 'ObjectId', OPERATOR=> '=', VALUE => $obj->id, ENTRYAGGREGATOR => 'OR', QUOTEVALUE => 0);
206
207 }
208
209 # }}}
210
211 1;