X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FQueue_Overlay.pm;h=2f180fc56eceda3225956244886d83199126fa42;hp=f40055b3b83353d1998b84efe8ae154719b25f1a;hb=673b9a458d9138523026963df6fa3b4683e09bae;hpb=5fc8c5edf574ab024d4646914b6432d458e2ffbd diff --git a/rt/lib/RT/Queue_Overlay.pm b/rt/lib/RT/Queue_Overlay.pm index f40055b3b..2f180fc56 100644 --- a/rt/lib/RT/Queue_Overlay.pm +++ b/rt/lib/RT/Queue_Overlay.pm @@ -1,8 +1,14 @@ -# BEGIN LICENSE BLOCK +# BEGIN BPS TAGGED BLOCK {{{ # -# Copyright (c) 1996-2003 Jesse Vincent +# COPYRIGHT: +# +# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +# # -# (Except where explictly superceded by other copyright notices) +# (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 @@ -14,13 +20,30 @@ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU # General Public License for more details. # -# Unless otherwise specified, all modifications, corrections or -# extensions to this work which alter its source code become the -# property of Best Practical Solutions, LLC when submitted for -# inclusion in the work. +# 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 LICENSE BLOCK +# END BPS TAGGED BLOCK }}} + =head1 NAME RT::Queue - an RT Queue object @@ -42,18 +65,20 @@ use RT::Queue; =cut + +package RT::Queue; + use strict; no warnings qw(redefine); -use vars qw(@STATUS @ACTIVE_STATUS @INACTIVE_STATUS $RIGHTS); +use vars qw(@DEFAULT_ACTIVE_STATUS @DEFAULT_INACTIVE_STATUS $RIGHTS); + use RT::Groups; use RT::ACL; -use RT::EmailParser; +use RT::Interface::Email; - -@ACTIVE_STATUS = qw(new open stalled); -@INACTIVE_STATUS = qw(resolved rejected deleted); -@STATUS = (@ACTIVE_STATUS, @INACTIVE_STATUS); +@DEFAULT_ACTIVE_STATUS = qw(new open stalled); +@DEFAULT_INACTIVE_STATUS = qw(resolved rejected deleted); # $self->loc('new'); # For the string extractor to get a string to localize # $self->loc('open'); # For the string extractor to get a string to localize @@ -69,15 +94,16 @@ $RIGHTS = { ShowACL => 'Display Access Control List', # loc_pair ModifyACL => 'Modify Access Control List', # loc_pair ModifyQueueWatchers => 'Modify the queue watchers', # loc_pair - AdminCustomFields => 'Create, delete and modify custom fields', # loc_pair + AssignCustomFields => 'Assign and remove custom fields', # loc_pair ModifyTemplate => 'Modify Scrip templates for this queue', # loc_pair ShowTemplate => 'Display Scrip templates for this queue', # loc_pair ModifyScrips => 'Modify Scrips for this queue', # loc_pair ShowScrips => 'Display Scrips for this queue', # loc_pair - ShowTicket => 'Show ticket summaries', # loc_pair - ShowTicketComments => 'Show ticket private commentary', # loc_pair + ShowTicket => 'See ticket summaries', # loc_pair + ShowTicketComments => 'See ticket private commentary', # loc_pair + ShowOutgoingEmail => 'See exact outgoing email messages and their recipeients', # loc_pair Watch => 'Sign up as a ticket Requestor or ticket or queue Cc', # loc_pair WatchAsAdminCc => 'Sign up as a ticket or queue AdminCc', # loc_pair @@ -103,6 +129,39 @@ foreach my $right ( keys %{$RIGHTS} ) { } +sub AddLink { + my $self = shift; + my %args = ( Target => '', + Base => '', + Type => '', + Silent => undef, + @_ ); + + unless ( $self->CurrentUserHasRight('ModifyQueue') ) { + return ( 0, $self->loc("Permission Denied") ); + } + + return $self->SUPER::_AddLink(%args); +} + +sub DeleteLink { + my $self = shift; + my %args = ( + Base => undef, + Target => undef, + Type => undef, + @_ + ); + + #check acls + unless ( $self->CurrentUserHasRight('ModifyQueue') ) { + $RT::Logger->debug("No permission to delete links\n"); + return ( 0, $self->loc('Permission Denied')) + } + + return $self->SUPER::_DeleteLink(%args); +} + =head2 AvailableRights Returns a hash of available rights for this object. The keys are the right names and the values are a description of what the rights do @@ -124,7 +183,12 @@ Returns an array of all ActiveStatuses for this queue sub ActiveStatusArray { my $self = shift; - return (@ACTIVE_STATUS); + if (@RT::ActiveStatus) { + return (@RT::ActiveStatus) + } else { + $RT::Logger->warning("RT::ActiveStatus undefined, falling back to deprecated defaults"); + return (@DEFAULT_ACTIVE_STATUS); + } } # }}} @@ -139,7 +203,12 @@ Returns an array of all InactiveStatuses for this queue sub InactiveStatusArray { my $self = shift; - return (@INACTIVE_STATUS); + if (@RT::InactiveStatus) { + return (@RT::InactiveStatus) + } else { + $RT::Logger->warning("RT::InactiveStatus undefined, falling back to deprecated defaults"); + return (@DEFAULT_INACTIVE_STATUS); + } } # }}} @@ -154,7 +223,7 @@ Returns an array of all statuses for this queue sub StatusArray { my $self = shift; - return (@STATUS); + return ($self->ActiveStatusArray(), $self->InactiveStatusArray()); } # }}} @@ -163,20 +232,23 @@ sub StatusArray { =head2 IsValidStatus VALUE -Returns true if VALUE is a valid status. Otherwise, returns 0 +Returns true if VALUE is a valid status. Otherwise, returns 0. + +=begin testing -=for testing my $q = RT::Queue->new($RT::SystemUser); ok($q->IsValidStatus('new')== 1, 'New is a valid status'); ok($q->IsValidStatus('f00')== 0, 'f00 is not a valid status'); +=end testing + =cut sub IsValidStatus { my $self = shift; my $value = shift; - my $retval = grep ( /^$value$/, $self->StatusArray ); + my $retval = grep ( $_ eq $value, $self->StatusArray ); return ($retval); } @@ -189,19 +261,22 @@ sub IsValidStatus { Returns true if VALUE is a Active status. Otherwise, returns 0 -=for testing +=begin testing + my $q = RT::Queue->new($RT::SystemUser); ok($q->IsActiveStatus('new')== 1, 'New is a Active status'); ok($q->IsActiveStatus('rejected')== 0, 'Rejected is an inactive status'); ok($q->IsActiveStatus('f00')== 0, 'f00 is not a Active status'); +=end testing + =cut sub IsActiveStatus { my $self = shift; my $value = shift; - my $retval = grep ( /^$value$/, $self->ActiveStatusArray ); + my $retval = grep ( $_ eq $value, $self->ActiveStatusArray ); return ($retval); } @@ -214,19 +289,22 @@ sub IsActiveStatus { Returns true if VALUE is a Inactive status. Otherwise, returns 0 -=for testing +=begin testing + my $q = RT::Queue->new($RT::SystemUser); ok($q->IsInactiveStatus('new')== 0, 'New is a Active status'); ok($q->IsInactiveStatus('rejected')== 1, 'rejeected is an Inactive status'); ok($q->IsInactiveStatus('f00')== 0, 'f00 is not a Active status'); +=end testing + =cut sub IsInactiveStatus { my $self = shift; my $value = shift; - my $retval = grep ( /^$value$/, $self->InactiveStatusArray ); + my $retval = grep ( $_ eq $value, $self->InactiveStatusArray ); return ($retval); } @@ -236,11 +314,34 @@ sub IsInactiveStatus { # {{{ sub Create -=head2 Create -Create takes the name of the new queue + + +=head2 Create(ARGS) + +Arguments: ARGS is a hash of named parameters. Valid parameters are: + + Name (required) + Description + CorrespondAddress + CommentAddress + InitialPriority + FinalPriority + DefaultDueIn + If you pass the ACL check, it creates the queue and returns its queue id. +=begin testing + +my $queue = RT::Queue->new($RT::SystemUser); +my ($id, $val) = $queue->Create( Name => 'Test1'); +ok($id, $val); + +($id, $val) = $queue->Create( Name => '66'); +ok(!$id, $val); + +=end testing + =cut sub Create { @@ -301,8 +402,8 @@ sub Delete { =head2 SetDisabled Takes a boolean. -1 will cause this queue to no longer be avaialble for tickets. -0 will re-enable this queue +1 will cause this queue to no longer be available for tickets. +0 will re-enable this queue. =cut @@ -353,20 +454,14 @@ sub ValidateName { my $tempqueue = new RT::Queue($RT::SystemUser); $tempqueue->Load($name); - #If we couldn't load it :) - unless ( $tempqueue->id() ) { - return (1); - } - #If this queue exists, return undef - #Avoid the ACL check. - if ( $tempqueue->Name() ) { + if ( $tempqueue->Name() && $tempqueue->id != $self->id) { return (undef); } #If the queue doesn't exist, return 1 else { - return (1); + return ($self->SUPER::ValidateName($name)); } } @@ -399,7 +494,7 @@ sub Templates { # {{{ CustomField -=item CustomField NAME +=head2 CustomField NAME Load the queue-specific custom field named NAME @@ -416,18 +511,38 @@ sub CustomField { # {{{ CustomFields -=item CustomFields +=head2 CustomFields Returns an RT::CustomFields object containing all global custom fields, as well as those tied to this queue =cut +# XXX TODO - this should become TicketCustomFields + sub CustomFields { my $self = shift; + warn "Queue->CustomFields is deprecated, use Queue->TicketCustomFields instead"; + return $self->TicketCustomFields(@_); +} + +sub TicketCustomFields { + my $self = shift; + + my $cfs = RT::CustomFields->new( $self->CurrentUser ); + if ( $self->CurrentUserHasRight('SeeQueue') ) { + $cfs->LimitToGlobalOrObjectId( $self->Id ); + $cfs->LimitToLookupType( 'RT::Queue-RT::Ticket' ); + } + return ($cfs); +} + +sub TicketTransactionCustomFields { + my $self = shift; my $cfs = RT::CustomFields->new( $self->CurrentUser ); if ( $self->CurrentUserHasRight('SeeQueue') ) { - $cfs->LimitToGlobalOrQueue( $self->Id ); + $cfs->LimitToGlobalOrObjectId( $self->Id ); + $cfs->LimitToLookupType( 'RT::Queue-RT::Ticket-RT::Transaction' ); } return ($cfs); } @@ -443,7 +558,7 @@ sub CustomFields { =head2 _CreateQueueGroups -Create the ticket groups and relationships for this ticket. +Create the ticket groups and links for this ticket. This routine expects to be called from Ticket->Create _inside of a transaction_ It will create four groups for this ticket: Requestor, Cc, AdminCc and Owner. @@ -554,7 +669,7 @@ sub AddWatcher { } } else { - $RT::Logger->warn( "$self -> AddWatcher got passed a bogus type"); + $RT::Logger->warning( "$self -> AddWatcher got passed a bogus type"); return ( 0, $self->loc('Error in parameters to Queue->AddWatcher') ); } } @@ -606,7 +721,7 @@ sub _AddWatcher { my $new_user = RT::User->new($RT::SystemUser); my ( $Address, $Name ) = - RT::EmailParser::ParseAddressFromHeader('', $args{'Email'}); + RT::Interface::Email::ParseAddressFromHeader($args{'Email'}); my ( $Val, $Message ) = $new_user->Create( Name => $Address, @@ -715,8 +830,8 @@ sub DeleteWatcher { } } else { - $RT::Logger->warn( "$self -> DelWatcher got passed a bogus type"); - return ( 0, $self->loc('Error in parameters to Queue->DelWatcher') ); + $RT::Logger->warning( "$self -> DeleteWatcher got passed a bogus type"); + return ( 0, $self->loc('Error in parameters to Queue->DeleteWatcher') ); } } @@ -886,8 +1001,8 @@ sub IsWatcher { =head2 IsCc PRINCIPAL_ID - Takes an RT::Principal id. - Returns true if the principal is a requestor of the current queue. +Takes an RT::Principal id. +Returns true if the principal is a requestor of the current queue. =cut @@ -906,8 +1021,8 @@ sub IsCc { =head2 IsAdminCc PRINCIPAL_ID - Takes an RT::Principal id. - Returns true if the principal is a requestor of the current queue. +Takes an RT::Principal id. +Returns true if the principal is a requestor of the current queue. =cut @@ -1008,7 +1123,7 @@ sub HasRight { } return ( $args{'Principal'}->HasRight( - Object => $self, + Object => $self->Id ? $self : $RT::System, Right => $args{'Right'} ) );