X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FAttributes.pm;h=10b9f4bf5240b495ac22ef266d20e17d95957f30;hp=bb63b8146c5f5dbfb616db9edea353048f254a1c;hb=187086c479a09629b7d180eec513fb7657f4e291;hpb=d4d0590bef31071e8809ec046717444b95b3f30a diff --git a/rt/lib/RT/Attributes.pm b/rt/lib/RT/Attributes.pm index bb63b8146..10b9f4bf5 100644 --- a/rt/lib/RT/Attributes.pm +++ b/rt/lib/RT/Attributes.pm @@ -1,38 +1,40 @@ # BEGIN BPS TAGGED BLOCK {{{ -# +# # COPYRIGHT: -# -# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC -# -# +# +# This software is Copyright (c) 1996-2018 Best Practical Solutions, LLC +# +# # (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. -# -# +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +# 02110-1301 or visit their web page on the internet at +# http://www.gnu.org/licenses/old-licenses/gpl-2.0.html. +# +# # 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 @@ -41,24 +43,17 @@ # 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 }}} -# Autogenerated by DBIx::SearchBuilder factory (by ) -# WARNING: THIS FILE IS AUTOGENERATED. ALL CHANGES TO THIS FILE WILL BE LOST. -# -# !! DO NOT EDIT THIS FILE !! # - -use strict; - +# END BPS TAGGED BLOCK }}} =head1 NAME - RT::Attributes -- Class Description - +RT::Attributes - collection of RT::Attribute objects + =head1 SYNOPSIS - use RT::Attributes + use RT::Attributes; + my $Attributes = RT::Attributes->new($CurrentUser); =head1 DESCRIPTION @@ -67,71 +62,144 @@ use strict; =cut + package RT::Attributes; -use RT::SearchBuilder; +use strict; +use warnings; + +use base 'RT::SearchBuilder'; + use RT::Attribute; -use vars qw( @ISA ); -@ISA= qw(RT::SearchBuilder); +sub Table { 'Attributes'} -sub _Init { +sub _DoSearch { my $self = shift; - $self->{'table'} = 'Attributes'; - $self->{'primary_key'} = 'id'; + $self->SUPER::_DoSearch(); +# if _DoSearch doesn't fully succeed, 'must_redo_search' will be true +# and call _BuildAccessTable then will result in a deep recursion + if ( $self->{'must_redo_search'} ) { + $RT::Logger->crit( +"_DoSearch is not so successful as it still needs redo search, won't call _BuildAccessTable" + ); + } + else { + $self->_BuildAccessTable(); + } +} - return ( $self->SUPER::_Init(@_) ); +sub _BuildAccessTable { + my $self = shift; + delete $self->{'attr'}; + while (my $attr = $self->Next) { + push @{$self->{'attr'}->{$attr->Name}}, $attr; + } } -=head2 NewItem +sub _AttrHash { + my $self = shift; + $self->_DoSearch if ($self->{'must_redo_search'} && $self->{'is_limited'}); + unless ($self->{'attr'}) { + $self->{'attr'}->{'__none'} = RT::Attribute->new($self->CurrentUser); + } + return ($self->{'attr'}); +} + +=head2 Names -Returns an empty new RT::Attribute item +Returns a list of the Names of all attributes for this object. =cut -sub NewItem { +sub Names { my $self = shift; - return(RT::Attribute->new($self->CurrentUser)); + my @keys = keys %{$self->_AttrHash}; + return(@keys); + + } - eval "require RT::Attributes_Overlay"; - if ($@ && $@ !~ qr{^Can't locate RT/Attributes_Overlay.pm}) { - die $@; - }; +=head2 Named STRING - eval "require RT::Attributes_Vendor"; - if ($@ && $@ !~ qr{^Can't locate RT/Attributes_Vendor.pm}) { - die $@; - }; +Returns an array of all the RT::Attribute objects with the name STRING - eval "require RT::Attributes_Local"; - if ($@ && $@ !~ qr{^Can't locate RT/Attributes_Local.pm}) { - die $@; - }; +=cut +sub Named { + my $self = shift; + my $name = shift; + my @attributes; + if ($self->_AttrHash) { + @attributes = @{($self->_AttrHash->{$name}||[])}; + } + return (@attributes); +} +=head2 DeleteEntry { Name => Content => , id => } +Deletes attributes with + the matching name + and the matching content or id -=head1 SEE ALSO +If Content and id are both undefined, delete all attributes with +the matching name. -This class allows "overlay" methods to be placed -into the following files _Overlay is for a System overlay by the original author, -_Vendor is for 3rd-party vendor add-ons, while _Local is for site-local customizations. +=cut -These overlay files can contain new subs or subs to replace existing subs in this module. -Each of these files should begin with the line +sub DeleteEntry { + my $self = shift; + my %args = ( + Name => undef, + Content => undef, + id => undef, + @_ + ); + my $found = 0; + foreach my $attr ( $self->Named( $args{'Name'} ) ) { + 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'} ) ) + { + my ($id, $msg) = $attr->Delete; + return ($id, $msg) unless $id; + $found = 1; + } + } + return (0, "No entry found") unless $found; + $self->RedoSearch; + # XXX: above string must work but because of bug in DBIx::SB it doesn't, + # to reproduce delete string below and run t/api/attribute-tests.t + $self->_DoSearch; + return (1, $self->loc('Attribute Deleted')); +} - no warnings qw(redefine); -so that perl does not kick and scream when you redefine a subroutine or variable in your overlay. -RT::Attributes_Overlay, RT::Attributes_Vendor, RT::Attributes_Local +=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 (eval { $obj->id} ){ + return undef; + } + + my $type = $obj->isa("RT::CurrentUser") ? "RT::User" : ref($obj); + + $self->Limit(FIELD => 'ObjectType', OPERATOR=> '=', VALUE => $type, ENTRYAGGREGATOR => 'OR'); + $self->Limit(FIELD => 'ObjectId', OPERATOR=> '=', VALUE => $obj->id, ENTRYAGGREGATOR => 'OR', QUOTEVALUE => 0); + +} + +RT::Base->_ImportOverlays(); 1;