import rt 3.2.2
[freeside.git] / rt / lib / RT / Attributes_Overlay.pm
diff --git a/rt/lib/RT/Attributes_Overlay.pm b/rt/lib/RT/Attributes_Overlay.pm
new file mode 100644 (file)
index 0000000..63c9ba0
--- /dev/null
@@ -0,0 +1,211 @@
+# {{{ BEGIN BPS TAGGED BLOCK
+# 
+# COPYRIGHT:
+#  
+# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC 
+#                                          <jesse@bestpractical.com>
+# 
+# (Except where explicitly superseded by other copyright notices)
+# 
+# 
+# LICENSE:
+# 
+# This work is made available to you under the terms of Version 2 of
+# the GNU General Public License. A copy of that license should have
+# been provided with this software, but in any event can be snarfed
+# from www.gnu.org.
+# 
+# This work is distributed in the hope that it will be useful, but
+# WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+# General Public License for more details.
+# 
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+# 
+# 
+# CONTRIBUTION SUBMISSION POLICY:
+# 
+# (The following paragraph is not intended to limit the rights granted
+# to you to modify and distribute this software under the terms of
+# the GNU General Public License and is only of importance to you if
+# you choose to contribute your changes and enhancements to the
+# community by submitting them to Best Practical Solutions, LLC.)
+# 
+# By intentionally submitting any modifications, corrections or
+# derivatives to this work, or any other work intended for use with
+# Request Tracker, to Best Practical Solutions, LLC, you confirm that
+# you are the copyright holder for those contributions and you grant
+# Best Practical Solutions,  LLC a nonexclusive, worldwide, irrevocable,
+# royalty-free, perpetual, license to use, copy, create derivative
+# works based on those contributions, and sublicense and distribute
+# those contributions and any derivatives thereof.
+# 
+# }}} END BPS TAGGED BLOCK
+=head1 NAME
+
+  RT::Attributes - collection of RT::Attribute objects
+
+=head1 SYNOPSIS
+
+  use RT:Attributes;
+my $Attributes = new RT::Attributes($CurrentUser);
+
+=head1 DESCRIPTION
+
+
+=head1 METHODS
+
+=begin testing
+
+ok(require RT::Attributes);
+
+my $root = RT::User->new($RT::SystemUser);
+ok (UNIVERSAL::isa($root, 'RT::User'));
+$root->Load('root');
+ok($root->id, "Found a user for root");
+
+my $attr = $root->Attributes;
+
+ok (UNIVERSAL::isa($attr,'RT::Attributes'), 'got the attributes object');
+
+my ($id, $msg) =  $root->AddAttribute(Name => 'TestAttr', Content => 'The attribute has content'); 
+ok ($id, $msg);
+my @names = $attr->Names;
+
+is ($names[0] , 'TestAttr');
+
+
+=end testing
+
+=cut
+
+use strict;
+no warnings qw(redefine);
+
+
+sub _DoSearch {
+    my $self = shift;
+    $self->SUPER::_DoSearch();
+    $self->_BuildAccessTable();
+}
+
+
+sub _BuildAccessTable {
+    my $self = shift;
+    delete $self->{'attr'};
+    while (my $attr = $self->Next) {
+        push @{$self->{'attr'}->{$attr->Name}}, $attr;
+    }
+}
+
+
+sub _AttrHash {
+    my $self = shift;
+    $self->_DoSearch if ($self->{'must_redo_search'});
+    unless ($self->{'attr'}) {
+        $self->{'attr'}->{'__none'} = RT::Attribute->new($self->CurrentUser);
+    }
+    return ($self->{'attr'});
+}
+
+=head2 Names
+
+Returns a list of the Names of all attributes for this object. 
+
+=cut
+
+sub Names {
+    my $self = shift;
+    my @keys =  keys %{$self->_AttrHash};
+    return(@keys);
+
+
+}
+
+=head2 Named STRING
+
+Returns an array of all the RT::Attribute objects with the name STRING
+
+=cut
+
+sub Named {
+    my $self = shift;
+    my $name = shift;
+    my @attributes; 
+    if ($self->_AttrHash) {
+        @attributes = @{($self->_AttrHash->{$name}||[])};
+    }
+    return (@attributes);   
+}
+
+=head2 WithId ID
+
+Returns the RT::Attribute objects with the id ID
+
+XXX TODO XXX THIS NEEDS A BETTER ACL CHECK
+
+=cut
+
+sub WithId {
+    my $self = shift;
+    my $id = shift;
+
+    my $attr = RT::Attribute->new($self->CurrentUser);
+    $attr->LoadByCols( id => $id );
+    return($attr);
+}
+
+=head2 DeleteEntry { Name =>   Content => , id => }
+
+Deletes attributes with
+    the matching name 
+ and the matching content or id
+
+If Content and id are both undefined, delete all attributes with
+the matching name.
+
+=cut
+
+
+sub DeleteEntry {
+    my $self = shift;
+    my %args = ( Name => undef,
+                 Content => undef,
+                 id => undef,
+                 @_);
+
+    foreach my $attr ($self->Named($args{'Name'})){ 
+        $attr->Delete
+            if (!defined $args{'id'} and !defined $args{'Content'})
+            or (defined $args{'id'} and $attr->id eq $args{'id'})
+            or (defined $args{'Content'} and $attr->Content eq $args{'Content'});
+    }
+    $self->_DoSearch();
+    return (1, $self->loc('Attribute Deleted'));
+}
+
+
+# {{{ LimitToObject 
+
+=head2 LimitToObject $object
+
+Limit the Attributes to rights for the object $object. It needs to be an RT::Record class.
+
+=cut
+
+sub LimitToObject {
+    my $self = shift;
+    my $obj = shift;
+    unless (defined($obj) && ref($obj) && UNIVERSAL::can($obj, 'id') && $obj->id) {
+    return undef;
+    }
+    $self->Limit(FIELD => 'ObjectType', OPERATOR=> '=', VALUE => ref($obj), ENTRYAGGREGATOR => 'OR');
+    $self->Limit(FIELD => 'ObjectId', OPERATOR=> '=', VALUE => $obj->id, ENTRYAGGREGATOR => 'OR', QUOTEVALUE => 0);
+
+}
+
+# }}}
+
+1;