1 # BEGIN BPS TAGGED BLOCK {{{
5 # This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
6 # <jesse@bestpractical.com>
8 # (Except where explicitly superseded by other copyright notices)
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
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.
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., 51 Franklin Street, Fifth Floor, Boston, MA
26 # 02110-1301 or visit their web page on the internet at
27 # http://www.gnu.org/licenses/old-licenses/gpl-2.0.html.
30 # CONTRIBUTION SUBMISSION POLICY:
32 # (The following paragraph is not intended to limit the rights granted
33 # to you to modify and distribute this software under the terms of
34 # the GNU General Public License and is only of importance to you if
35 # you choose to contribute your changes and enhancements to the
36 # community by submitting them to Best Practical Solutions, LLC.)
38 # By intentionally submitting any modifications, corrections or
39 # derivatives to this work, or any other work intended for use with
40 # Request Tracker, to Best Practical Solutions, LLC, you confirm that
41 # you are the copyright holder for those contributions and you grant
42 # Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable,
43 # royalty-free, perpetual, license to use, copy, create derivative
44 # works based on those contributions, and sublicense and distribute
45 # those contributions and any derivatives thereof.
47 # END BPS TAGGED BLOCK }}}
50 RT::Queue - an RT Queue object
73 no warnings qw(redefine);
75 use vars qw(@DEFAULT_ACTIVE_STATUS @DEFAULT_INACTIVE_STATUS $RIGHTS);
79 use RT::Interface::Email;
81 @DEFAULT_ACTIVE_STATUS = qw(new open stalled);
82 @DEFAULT_INACTIVE_STATUS = qw(resolved rejected deleted);
84 # $self->loc('new'); # For the string extractor to get a string to localize
85 # $self->loc('open'); # For the string extractor to get a string to localize
86 # $self->loc('stalled'); # For the string extractor to get a string to localize
87 # $self->loc('resolved'); # For the string extractor to get a string to localize
88 # $self->loc('rejected'); # For the string extractor to get a string to localize
89 # $self->loc('deleted'); # For the string extractor to get a string to localize
93 SeeQueue => 'Can this principal see this queue', # loc_pair
94 AdminQueue => 'Create, delete and modify queues', # loc_pair
95 ShowACL => 'Display Access Control List', # loc_pair
96 ModifyACL => 'Modify Access Control List', # loc_pair
97 ModifyQueueWatchers => 'Modify the queue watchers', # loc_pair
98 AssignCustomFields => 'Assign and remove custom fields', # loc_pair
99 ModifyTemplate => 'Modify Scrip templates for this queue', # loc_pair
100 ShowTemplate => 'Display Scrip templates for this queue', # loc_pair
102 ModifyScrips => 'Modify Scrips for this queue', # loc_pair
103 ShowScrips => 'Display Scrips for this queue', # loc_pair
105 ShowTicket => 'See ticket summaries', # loc_pair
106 ShowTicketComments => 'See ticket private commentary', # loc_pair
107 ShowOutgoingEmail => 'See exact outgoing email messages and their recipeients', # loc_pair
109 Watch => 'Sign up as a ticket Requestor or ticket or queue Cc', # loc_pair
110 WatchAsAdminCc => 'Sign up as a ticket or queue AdminCc', # loc_pair
111 CreateTicket => 'Create tickets in this queue', # loc_pair
112 ReplyToTicket => 'Reply to tickets', # loc_pair
113 CommentOnTicket => 'Comment on tickets', # loc_pair
114 OwnTicket => 'Own tickets', # loc_pair
115 ModifyTicket => 'Modify tickets', # loc_pair
116 DeleteTicket => 'Delete tickets', # loc_pair
117 TakeTicket => 'Take tickets', # loc_pair
118 StealTicket => 'Steal tickets', # loc_pair
122 # Tell RT::ACE that this sort of object can get acls granted
123 $RT::ACE::OBJECT_TYPES{'RT::Queue'} = 1;
125 # TODO: This should be refactored out into an RT::ACLedObject or something
126 # stuff the rights into a hash of rights that can exist.
128 foreach my $right ( keys %{$RIGHTS} ) {
129 $RT::ACE::LOWERCASERIGHTNAMES{ lc $right } = $right;
135 my %args = ( Target => '',
141 unless ( $self->CurrentUserHasRight('ModifyQueue') ) {
142 return ( 0, $self->loc("Permission Denied") );
145 return $self->SUPER::_AddLink(%args);
158 unless ( $self->CurrentUserHasRight('ModifyQueue') ) {
159 $RT::Logger->debug("No permission to delete links\n");
160 return ( 0, $self->loc('Permission Denied'))
163 return $self->SUPER::_DeleteLink(%args);
166 =head2 AvailableRights
168 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
172 sub AvailableRights {
177 # {{{ ActiveStatusArray
179 =head2 ActiveStatusArray
181 Returns an array of all ActiveStatuses for this queue
185 sub ActiveStatusArray {
187 if (@RT::ActiveStatus) {
188 return (@RT::ActiveStatus)
190 $RT::Logger->warning("RT::ActiveStatus undefined, falling back to deprecated defaults");
191 return (@DEFAULT_ACTIVE_STATUS);
197 # {{{ InactiveStatusArray
199 =head2 InactiveStatusArray
201 Returns an array of all InactiveStatuses for this queue
205 sub InactiveStatusArray {
207 if (@RT::InactiveStatus) {
208 return (@RT::InactiveStatus)
210 $RT::Logger->warning("RT::InactiveStatus undefined, falling back to deprecated defaults");
211 return (@DEFAULT_INACTIVE_STATUS);
221 Returns an array of all statuses for this queue
227 return ($self->ActiveStatusArray(), $self->InactiveStatusArray());
234 =head2 IsValidStatus VALUE
236 Returns true if VALUE is a valid status. Otherwise, returns 0.
240 my $q = RT::Queue->new($RT::SystemUser);
241 ok($q->IsValidStatus('new')== 1, 'New is a valid status');
242 ok($q->IsValidStatus('f00')== 0, 'f00 is not a valid status');
252 my $retval = grep ( $_ eq $value, $self->StatusArray );
261 =head2 IsActiveStatus VALUE
263 Returns true if VALUE is a Active status. Otherwise, returns 0
267 my $q = RT::Queue->new($RT::SystemUser);
268 ok($q->IsActiveStatus('new')== 1, 'New is a Active status');
269 ok($q->IsActiveStatus('rejected')== 0, 'Rejected is an inactive status');
270 ok($q->IsActiveStatus('f00')== 0, 'f00 is not a Active status');
280 my $retval = grep ( $_ eq $value, $self->ActiveStatusArray );
287 # {{{ IsInactiveStatus
289 =head2 IsInactiveStatus VALUE
291 Returns true if VALUE is a Inactive status. Otherwise, returns 0
295 my $q = RT::Queue->new($RT::SystemUser);
296 ok($q->IsInactiveStatus('new')== 0, 'New is a Active status');
297 ok($q->IsInactiveStatus('rejected')== 1, 'rejeected is an Inactive status');
298 ok($q->IsInactiveStatus('f00')== 0, 'f00 is not a Active status');
304 sub IsInactiveStatus {
308 my $retval = grep ( $_ eq $value, $self->InactiveStatusArray );
323 Arguments: ARGS is a hash of named parameters. Valid parameters are:
333 If you pass the ACL check, it creates the queue and returns its queue id.
337 my $queue = RT::Queue->new($RT::SystemUser);
338 my ($id, $val) = $queue->Create( Name => 'Test1');
341 ($id, $val) = $queue->Create( Name => '66');
352 CorrespondAddress => '',
354 CommentAddress => '',
355 InitialPriority => "0",
356 FinalPriority => "0",
361 unless ( $self->CurrentUser->HasRight(Right => 'AdminQueue', Object => $RT::System) )
363 return ( 0, $self->loc("No permission to create queues") );
366 unless ( $self->ValidateName( $args{'Name'} ) ) {
367 return ( 0, $self->loc('Queue already exists') );
370 #TODO better input validation
371 $RT::Handle->BeginTransaction();
373 my $id = $self->SUPER::Create(%args);
375 $RT::Handle->Rollback();
376 return ( 0, $self->loc('Queue could not be created') );
379 my $create_ret = $self->_CreateQueueGroups();
380 unless ($create_ret) {
381 $RT::Handle->Rollback();
382 return ( 0, $self->loc('Queue could not be created') );
385 $RT::Handle->Commit();
386 return ( $id, $self->loc("Queue created") );
396 $self->loc('Deleting this object would break referential integrity') );
401 # {{{ sub SetDisabled
406 1 will cause this queue to no longer be available for tickets.
407 0 will re-enable this queue.
417 Takes either a numerical id or a textual Name and loads the specified queue.
424 my $identifier = shift;
425 if ( !$identifier ) {
429 if ( $identifier =~ /^(\d+)$/ ) {
430 $self->SUPER::LoadById($identifier);
433 $self->LoadByCols( Name => $identifier );
436 return ( $self->Id );
442 # {{{ sub ValidateName
444 =head2 ValidateName NAME
446 Takes a queue name. Returns true if it's an ok name for
447 a new queue. Returns undef if there's already a queue by that name.
455 my $tempqueue = new RT::Queue($RT::SystemUser);
456 $tempqueue->Load($name);
458 #If this queue exists, return undef
459 if ( $tempqueue->Name() && $tempqueue->id != $self->id) {
463 #If the queue doesn't exist, return 1
465 return ($self->SUPER::ValidateName($name));
476 Returns an RT::Templates object of all of this queue's templates.
483 my $templates = RT::Templates->new( $self->CurrentUser );
485 if ( $self->CurrentUserHasRight('ShowTemplate') ) {
486 $templates->LimitToQueue( $self->id );
494 # {{{ Dealing with custom fields
498 =head2 CustomField NAME
500 Load the queue-specific custom field named NAME
507 my $cf = RT::CustomField->new($self->CurrentUser);
508 $cf->LoadByNameAndQueue(Name => $name, Queue => $self->Id);
517 Returns an RT::CustomFields object containing all global custom fields, as well as those tied to this queue
521 # XXX TODO - this should become TicketCustomFields
525 warn "Queue->CustomFields is deprecated, use Queue->TicketCustomFields instead at (". join(":",caller).")";
526 return $self->TicketCustomFields(@_);
529 sub TicketCustomFields {
532 my $cfs = RT::CustomFields->new( $self->CurrentUser );
533 if ( $self->CurrentUserHasRight('SeeQueue') ) {
534 $cfs->LimitToGlobalOrObjectId( $self->Id );
535 $cfs->LimitToLookupType( 'RT::Queue-RT::Ticket' );
540 sub TicketTransactionCustomFields {
543 my $cfs = RT::CustomFields->new( $self->CurrentUser );
544 if ( $self->CurrentUserHasRight('SeeQueue') ) {
545 $cfs->LimitToGlobalOrObjectId( $self->Id );
546 $cfs->LimitToLookupType( 'RT::Queue-RT::Ticket-RT::Transaction' );
556 # {{{ Routines dealing with watchers.
558 # {{{ _CreateQueueGroups
560 =head2 _CreateQueueGroups
562 Create the ticket groups and links for this ticket.
563 This routine expects to be called from Ticket->Create _inside of a transaction_
565 It will create four groups for this ticket: Requestor, Cc, AdminCc and Owner.
567 It will return true on success and undef on failure.
571 my $Queue = RT::Queue->new($RT::SystemUser); my ($id, $msg) = $Queue->Create(Name => "Foo",
573 ok ($id, "Foo $id was created");
574 ok(my $group = RT::Group->new($RT::SystemUser));
575 ok($group->LoadQueueRoleGroup(Queue => $id, Type=> 'Cc'));
576 ok ($group->Id, "Found the requestors object for this Queue");
579 ok ((my $add_id, $add_msg) = $Queue->AddWatcher(Type => 'Cc', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
580 ok ($add_id, "Add succeeded: ($add_msg)");
581 ok(my $bob = RT::User->new($RT::SystemUser), "Creating a bob rt::user");
582 $bob->LoadByEmail('bob@fsck.com');
583 ok($bob->Id, "Found the bob rt user");
584 ok ($Queue->IsWatcher(Type => 'Cc', PrincipalId => $bob->PrincipalId), "The Queue actually has bob at fsck.com as a requestor");;
585 ok ((my $add_id, $add_msg) = $Queue->DeleteWatcher(Type =>'Cc', Email => 'bob@fsck.com'), "Added bob at fsck.com as a requestor");
586 ok (!$Queue->IsWatcher(Type => 'Cc', Principal => $bob->PrincipalId), "The Queue no longer has bob at fsck.com as a requestor");;
589 $group = RT::Group->new($RT::SystemUser);
590 ok($group->LoadQueueRoleGroup(Queue => $id, Type=> 'Cc'));
591 ok ($group->Id, "Found the cc object for this Queue");
592 $group = RT::Group->new($RT::SystemUser);
593 ok($group->LoadQueueRoleGroup(Queue => $id, Type=> 'AdminCc'));
594 ok ($group->Id, "Found the AdminCc object for this Queue");
601 sub _CreateQueueGroups {
604 my @types = qw(Cc AdminCc Requestor Owner);
606 foreach my $type (@types) {
607 my $type_obj = RT::Group->new($self->CurrentUser);
608 my ($id, $msg) = $type_obj->CreateRoleGroup(Instance => $self->Id,
610 Domain => 'RT::Queue-Role');
612 $RT::Logger->error("Couldn't create a Queue group of type '$type' for ticket ".
613 $self->Id.": ".$msg);
628 AddWatcher takes a parameter hash. The keys are as follows:
630 Type One of Requestor, Cc, AdminCc
632 PrinicpalId The RT::Principal id of the user or group that's being added as a watcher
633 Email The email address of the new watcher. If a user with this
634 email address can't be found, a new nonprivileged user will be created.
636 If the watcher you\'re trying to set has an RT account, set the Owner paremeter to their User Id. Otherwise, set the Email parameter to their Email address.
638 Returns a tuple of (status/id, message).
646 PrincipalId => undef,
651 return ( 0, "No principal specified" )
652 unless $args{'Email'} or $args{'PrincipalId'};
654 if ( !$args{'PrincipalId'} && $args{'Email'} ) {
655 my $user = RT::User->new( $self->CurrentUser );
656 $user->LoadByEmail( $args{'Email'} );
657 $args{'PrincipalId'} = $user->PrincipalId if $user->id;
661 return ( $self->_AddWatcher(%args) )
662 if $self->CurrentUserHasRight('ModifyQueueWatchers');
664 #If the watcher we're trying to add is for the current user
665 if ( $self->CurrentUser->PrincipalId == ($args{'PrincipalId'}||0) ) {
666 # If it's an AdminCc and they don't have
667 # 'WatchAsAdminCc' or 'ModifyTicket', bail
668 if ( $args{'Type'} eq 'AdminCc' ) {
669 return ( $self->_AddWatcher(%args) )
670 if $self->CurrentUserHasRight('WatchAsAdminCc');
673 # If it's a Requestor or Cc and they don't have
674 # 'Watch' or 'ModifyTicket', bail
675 elsif ( $args{'Type'} eq 'Cc' or $args{'Type'} eq 'Requestor' ) {
676 return ( $self->_AddWatcher(%args) )
677 if $self->CurrentUserHasRight('Watch');
680 $RT::Logger->warning( "$self -> AddWatcher got passed a bogus type");
681 return ( 0, $self->loc('Error in parameters to Queue->AddWatcher') );
685 return ( 0, $self->loc("Permission Denied") );
688 #This contains the meat of AddWatcher. but can be called from a routine like
689 # Create, which doesn't need the additional acl check
695 PrincipalId => undef,
701 my $principal = RT::Principal->new( $self->CurrentUser );
702 if ( $args{'PrincipalId'} ) {
703 $principal->Load( $args{'PrincipalId'} );
705 elsif ( $args{'Email'} ) {
706 my $user = RT::User->new($self->CurrentUser);
707 $user->LoadByEmail( $args{'Email'} );
708 $user->Load( $args{'Email'} )
711 if ( $user->Id ) { # If the user exists
712 $principal->Load( $user->PrincipalId );
714 # if the user doesn't exist, we need to create a new user
715 my $new_user = RT::User->new($RT::SystemUser);
717 my ( $Address, $Name ) =
718 RT::Interface::Email::ParseAddressFromHeader($args{'Email'});
720 my ( $Val, $Message ) = $new_user->Create(
722 EmailAddress => $Address,
725 Comments => 'Autocreated when added as a watcher'
728 $RT::Logger->error("Failed to create user ".$args{'Email'} .": " .$Message);
729 # Deal with the race condition of two account creations at once
730 $new_user->LoadByEmail( $args{'Email'} );
732 $principal->Load( $new_user->PrincipalId );
735 # If we can't find this watcher, we need to bail.
736 unless ( $principal->Id ) {
737 return(0, $self->loc("Could not find or create that user"));
740 my $group = RT::Group->new($self->CurrentUser);
741 $group->LoadQueueRoleGroup(Type => $args{'Type'}, Queue => $self->Id);
742 unless ($group->id) {
743 return(0,$self->loc("Group not found"));
746 if ( $group->HasMember( $principal)) {
748 return ( 0, $self->loc('That principal is already a [_1] for this queue', $args{'Type'}) );
752 my ($m_id, $m_msg) = $group->_AddMember(PrincipalId => $principal->Id);
754 $RT::Logger->error("Failed to add ".$principal->Id." as a member of group ".$group->Id."\n".$m_msg);
756 return ( 0, $self->loc('Could not make that principal a [_1] for this queue', $args{'Type'}) );
758 return ( 1, $self->loc('Added principal as a [_1] for this queue', $args{'Type'}) );
763 # {{{ sub DeleteWatcher
765 =head2 DeleteWatcher { Type => TYPE, PrincipalId => PRINCIPAL_ID, Email => EMAIL_ADDRESS }
768 Deletes a queue watcher. Takes two arguments:
770 Type (one of Requestor,Cc,AdminCc)
774 PrincipalId (an RT::Principal Id of the watcher you want to remove)
776 Email (the email address of an existing wathcer)
785 my %args = ( Type => undef,
786 PrincipalId => undef,
790 return ( 0, "No principal specified" )
791 unless $args{Email} or $args{PrincipalId};
793 if ( !$args{PrincipalId} and $args{Email} ) {
794 my $user = RT::User->new( $self->CurrentUser );
795 my ($rv, $msg) = $user->LoadByEmail( $args{Email} );
796 $args{PrincipalId} = $user->PrincipalId if $rv;
799 my $principal = RT::Principal->new($self->CurrentUser);
800 $principal->Load($args{'PrincipalId'});
802 # If we can't find this watcher, we need to bail.
803 unless ($principal->Id) {
804 return(0, $self->loc("Could not find that principal"));
807 my $group = RT::Group->new($self->CurrentUser);
808 $group->LoadQueueRoleGroup(Type => $args{'Type'}, Queue => $self->Id);
809 unless ($group->id) {
810 return(0,$self->loc("Group not found"));
813 my $can_modify_queue = $self->CurrentUserHasRight('ModifyQueueWatchers');
816 #If the watcher we're trying to add is for the current user
817 if ( $self->CurrentUser->PrincipalId eq $args{'PrincipalId'}) {
818 # If it's an AdminCc and they don't have
819 # 'WatchAsAdminCc' or 'ModifyQueue', bail
820 if ( $args{'Type'} eq 'AdminCc' ) {
821 unless ( $can_modify_queue
822 or $self->CurrentUserHasRight('WatchAsAdminCc') ) {
823 return ( 0, $self->loc('Permission Denied'))
827 # If it's a Requestor or Cc and they don't have
828 # 'Watch' or 'ModifyQueue', bail
829 elsif ( ( $args{'Type'} eq 'Cc' ) or ( $args{'Type'} eq 'Requestor' ) ) {
830 unless ( $can_modify_queue
831 or $self->CurrentUserHasRight('Watch') ) {
832 return ( 0, $self->loc('Permission Denied'))
836 $RT::Logger->warning( "$self -> DeleteWatcher got passed a bogus type");
837 return ( 0, $self->loc('Error in parameters to Queue->DeleteWatcher') );
841 # If the watcher isn't the current user
842 # and the current user doesn't have 'ModifyQueueWathcers' bail
844 unless ( $can_modify_queue ) {
845 return ( 0, $self->loc("Permission Denied") );
852 # see if this user is already a watcher.
854 unless ( $group->HasMember($principal)) {
856 $self->loc('That principal is not a [_1] for this queue', $args{'Type'}) );
859 my ($m_id, $m_msg) = $group->_DeleteMember($principal->Id);
861 $RT::Logger->error("Failed to delete ".$principal->Id.
862 " as a member of group ".$group->Id."\n".$m_msg);
864 return ( 0, $self->loc('Could not remove that principal as a [_1] for this queue', $args{'Type'}) );
867 return ( 1, $self->loc("[_1] is no longer a [_2] for this queue.", $principal->Object->Name, $args{'Type'} ));
872 # {{{ AdminCcAddresses
874 =head2 AdminCcAddresses
876 returns String: All queue AdminCc email addresses as a string
880 sub AdminCcAddresses {
883 unless ( $self->CurrentUserHasRight('SeeQueue') ) {
887 return ( $self->AdminCc->MemberEmailAddressesAsString )
897 returns String: All queue Ccs as a string of email addresses
904 unless ( $self->CurrentUserHasRight('SeeQueue') ) {
908 return ( $self->Cc->MemberEmailAddressesAsString);
919 Returns an RT::Group object which contains this Queue's Ccs.
920 If the user doesn't have "ShowQueue" permission, returns an empty group
927 my $group = RT::Group->new($self->CurrentUser);
928 if ( $self->CurrentUserHasRight('SeeQueue') ) {
929 $group->LoadQueueRoleGroup(Type => 'Cc', Queue => $self->Id);
942 Returns an RT::Group object which contains this Queue's AdminCcs.
943 If the user doesn't have "ShowQueue" permission, returns an empty group
950 my $group = RT::Group->new($self->CurrentUser);
951 if ( $self->CurrentUserHasRight('SeeQueue') ) {
952 $group->LoadQueueRoleGroup(Type => 'AdminCc', Queue => $self->Id);
960 # {{{ IsWatcher, IsCc, IsAdminCc
963 # a generic routine to be called by IsRequestor, IsCc and IsAdminCc
965 =head2 IsWatcher { Type => TYPE, PrincipalId => PRINCIPAL_ID }
967 Takes a param hash with the attributes Type and PrincipalId
969 Type is one of Requestor, Cc, AdminCc and Owner
971 PrincipalId is an RT::Principal id
973 Returns true if that principal is a member of the group Type for this queue
981 my %args = ( Type => 'Cc',
982 PrincipalId => undef,
986 # Load the relevant group.
987 my $group = RT::Group->new($self->CurrentUser);
988 $group->LoadQueueRoleGroup(Type => $args{'Type'}, Queue => $self->id);
989 # Ask if it has the member in question
991 my $principal = RT::Principal->new($self->CurrentUser);
992 $principal->Load($args{'PrincipalId'});
993 unless ($principal->Id) {
997 return ($group->HasMemberRecursively($principal));
1005 =head2 IsCc PRINCIPAL_ID
1007 Takes an RT::Principal id.
1008 Returns true if the principal is a requestor of the current queue.
1017 return ( $self->IsWatcher( Type => 'Cc', PrincipalId => $cc ) );
1025 =head2 IsAdminCc PRINCIPAL_ID
1027 Takes an RT::Principal id.
1028 Returns true if the principal is a requestor of the current queue.
1036 return ( $self->IsWatcher( Type => 'AdminCc', PrincipalId => $person ) );
1051 # {{{ ACCESS CONTROL
1057 unless ( $self->CurrentUserHasRight('AdminQueue') ) {
1058 return ( 0, $self->loc('Permission Denied') );
1060 return ( $self->SUPER::_Set(@_) );
1070 unless ( $self->CurrentUserHasRight('SeeQueue') ) {
1074 return ( $self->__Value(@_) );
1079 # {{{ sub CurrentUserHasRight
1081 =head2 CurrentUserHasRight
1083 Takes one argument. A textual string with the name of the right we want to check.
1084 Returns true if the current user has that right for this queue.
1085 Returns undef otherwise.
1089 sub CurrentUserHasRight {
1095 Principal => $self->CurrentUser,
1108 Takes a param hash with the fields 'Right' and 'Principal'.
1109 Principal defaults to the current user.
1110 Returns true if the principal has that right for this queue.
1111 Returns undef otherwise.
1115 # TAKES: Right and optional "Principal" which defaults to the current user
1120 Principal => $self->CurrentUser,
1123 unless ( defined $args{'Principal'} ) {
1124 $RT::Logger->debug("Principal undefined in Queue::HasRight");
1128 $args{'Principal'}->HasRight(
1129 Object => $self->Id ? $self : $RT::System,
1130 Right => $args{'Right'}