summaryrefslogtreecommitdiff
path: root/rt/lib/RT/Transaction_Overlay.pm
diff options
context:
space:
mode:
Diffstat (limited to 'rt/lib/RT/Transaction_Overlay.pm')
-rw-r--r--rt/lib/RT/Transaction_Overlay.pm305
1 files changed, 49 insertions, 256 deletions
diff --git a/rt/lib/RT/Transaction_Overlay.pm b/rt/lib/RT/Transaction_Overlay.pm
index b179084c8..17e47cb3a 100644
--- a/rt/lib/RT/Transaction_Overlay.pm
+++ b/rt/lib/RT/Transaction_Overlay.pm
@@ -1,8 +1,8 @@
-# BEGIN BPS TAGGED BLOCK {{{
+# {{{ BEGIN BPS TAGGED BLOCK
#
# COPYRIGHT:
#
-# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC
+# This software is Copyright (c) 1996-2004 Best Practical Solutions, LLC
# <jesse@bestpractical.com>
#
# (Except where explicitly superseded by other copyright notices)
@@ -42,8 +42,7 @@
# works based on those contributions, and sublicense and distribute
# those contributions and any derivatives thereof.
#
-# END BPS TAGGED BLOCK }}}
-
+# }}} END BPS TAGGED BLOCK
=head1 NAME
RT::Transaction - RT\'s transaction object
@@ -71,9 +70,6 @@ ok(require RT::Transaction);
=cut
-
-package RT::Transaction;
-
use strict;
no warnings qw(redefine);
@@ -88,9 +84,8 @@ use RT::Scrips;
Create a new transaction.
-This routine should _never_ be called by anything other than RT::Ticket.
-It should not be called
-from client code. Ever. Not ever. If you do this, we will hunt you down and break your kneecaps.
+This routine should _never_ be called anything other Than RT::Ticket. It should not be called
+from client code. Ever. Not ever. If you do this, we will hunt you down. and break your kneecaps.
Then the unpleasant stuff will start.
TODO: Document what gets passed to this
@@ -102,6 +97,7 @@ sub Create {
my %args = (
id => undef,
TimeTaken => 0,
+ Ticket => 0,
Type => 'undefined',
Data => '',
Field => undef,
@@ -110,36 +106,24 @@ sub Create {
MIMEObj => undef,
ActivateScrips => 1,
CommitScrips => 1,
- ObjectType => 'RT::Ticket',
- ObjectId => 0,
- ReferenceType => undef,
- OldReference => undef,
- NewReference => undef,
@_
);
- $args{ObjectId} ||= $args{Ticket};
-
#if we didn't specify a ticket, we need to bail
- unless ( $args{'ObjectId'} && $args{'ObjectType'}) {
- return ( 0, $self->loc( "Transaction->Create couldn't, as you didn't specify an object type and id"));
+ unless ( $args{'Ticket'} ) {
+ return ( 0, $self->loc( "Transaction->Create couldn't, as you didn't specify a ticket id"));
}
#lets create our transaction
- my %params = (
+ my %params = (Ticket => $args{'Ticket'},
Type => $args{'Type'},
Data => $args{'Data'},
Field => $args{'Field'},
OldValue => $args{'OldValue'},
NewValue => $args{'NewValue'},
- Created => $args{'Created'},
- ObjectType => $args{'ObjectType'},
- ObjectId => $args{'ObjectId'},
- ReferenceType => $args{'ReferenceType'},
- OldReference => $args{'OldReference'},
- NewReference => $args{'NewReference'},
+ Created => $args{'Created'}
);
# Parameters passed in during an import that we probably don't want to touch, otherwise
@@ -153,20 +137,20 @@ sub Create {
#Provide a way to turn off scrips if we need to
- $RT::Logger->debug('About to think about scrips for transaction #' .$self->Id);
- if ( $args{'ActivateScrips'} and $args{'ObjectType'} eq 'RT::Ticket' ) {
+ $RT::Logger->debug('About to think about scrips for transaction' .$self->Id);
+ if ( $args{'ActivateScrips'} ) {
$self->{'scrips'} = RT::Scrips->new($RT::SystemUser);
- $RT::Logger->debug('About to prepare scrips for transaction #' .$self->Id);
+ $RT::Logger->debug('About to prepare scrips for transaction' .$self->Id);
$self->{'scrips'}->Prepare(
Stage => 'TransactionCreate',
Type => $args{'Type'},
- Ticket => $args{'ObjectId'},
+ Ticket => $args{'Ticket'},
Transaction => $self->id,
);
if ($args{'CommitScrips'} ) {
- $RT::Logger->debug('About to commit scrips for transaction #' .$self->Id);
+ $RT::Logger->debug('About to commit scrips for transaction' .$self->Id);
$self->{'scrips'}->Commit();
}
}
@@ -194,34 +178,10 @@ sub Scrips {
# {{{ sub Delete
-=head2 Delete
-
-Delete this transaction. Currently DOES NOT CHECK ACLS
-
-=cut
-
sub Delete {
my $self = shift;
-
-
- $RT::Handle->BeginTransaction();
-
- my $attachments = $self->Attachments;
-
- while (my $attachment = $attachments->Next) {
- my ($id, $msg) = $attachment->Delete();
- unless ($id) {
- $RT::Handle->Rollback();
- return($id, $self->loc("System Error: [_1]", $msg));
- }
- }
- my ($id,$msg) = $self->SUPER::Delete();
- unless ($id) {
- $RT::Handle->Rollback();
- return($id, $self->loc("System Error: [_1]", $msg));
- }
- $RT::Handle->Commit();
- return ($id,$msg);
+ return ( 0,
+ $self->loc('Deleting this object could break referential integrity') );
}
# }}}
@@ -426,7 +386,7 @@ sub Attachments {
}
#if they ain't got rights to see, return an empty object
- elsif ($self->__Value('ObjectType') eq "RT::Ticket") {
+ else {
unless ( $self->CurrentUserHasRight('ShowTicket') ) {
return ( $self->{'attachments'} );
}
@@ -507,7 +467,7 @@ sub Description {
}
#if they ain't got rights to see, don't let em
- elsif ($self->__Value('ObjectType') eq "RT::Ticket") {
+ else {
unless ( $self->CurrentUserHasRight('ShowTicket') ) {
return ($self->loc("Permission Denied") );
}
@@ -533,6 +493,7 @@ Returns a text string which briefly describes this transaction
sub BriefDescription {
my $self = shift;
+
#If it's a comment or a comment email record,
# we need to be extra special careful
if ( $self->__Value('Type') =~ /^Comment/ ) {
@@ -542,67 +503,42 @@ sub BriefDescription {
}
#if they ain't got rights to see, don't let em
- elsif ( $self->__Value('ObjectType') eq "RT::Ticket" ) {
+ else {
unless ( $self->CurrentUserHasRight('ShowTicket') ) {
return ( $self->loc("Permission Denied") );
}
}
- my $type = $self->Type; #cache this, rather than calling it 30 times
+ my $type = $self->Type; #cache this, rather than calling it 30 times
- if ( !defined($type) ) {
+ if ( !defined( $type ) ) {
return $self->loc("No transaction type specified");
}
- my $obj_type = $self->FriendlyObjectType;
-
if ( $type eq 'Create' ) {
- return ( $self->loc( "[_1] created", $obj_type ) );
+ return ($self->loc("Ticket created"));
}
elsif ( $type =~ /Status/ ) {
if ( $self->Field eq 'Status' ) {
if ( $self->NewValue eq 'deleted' ) {
- return ( $self->loc( "[_1] deleted", $obj_type ) );
+ return ($self->loc("Ticket deleted"));
}
else {
- return (
- $self->loc(
- "Status changed from [_1] to [_2]",
- "'" . $self->loc( $self->OldValue ) . "'",
- "'" . $self->loc( $self->NewValue ) . "'"
- )
- );
+ return ( $self->loc("Status changed from [_1] to [_2]", $self->loc($self->OldValue), $self->loc($self->NewValue) ));
}
}
# Generic:
- my $no_value = $self->loc("(no value)");
- return (
- $self->loc(
- "[_1] changed from [_2] to [_3]",
- $self->Field,
- ( $self->OldValue ? "'" . $self->OldValue . "'" : $no_value ),
- "'" . $self->NewValue . "'"
- )
- );
+ my $no_value = $self->loc("(no value)");
+ return ( $self->loc( "[_1] changed from [_2] to [_3]", $self->Field , ( $self->OldValue || $no_value ) , $self->NewValue ));
}
- if ( my $code = $_BriefDescriptions{$type} ) {
+ if (my $code = $_BriefDescriptions{$type}) {
return $code->($self);
}
- return $self->loc(
- "Default: [_1]/[_2] changed from [_3] to [_4]",
- $type,
- $self->Field,
- (
- $self->OldValue
- ? "'" . $self->OldValue . "'"
- : $self->loc("(no value)")
- ),
- "'" . $self->NewValue . "'"
- );
+ return $self->loc( "Default: [_1]/[_2] changed from [_3] to [_4]", $type, $self->Field, $self->OldValue, $self->NewValue );
}
%_BriefDescriptions = (
@@ -664,7 +600,7 @@ sub BriefDescription {
my $self = shift;
my $Old = RT::User->new( $self->CurrentUser );
$Old->Load( $self->OldValue );
- return $self->loc("Stolen from [_1]", $Old->Name);
+ return $self->loc("Stolen from [_1] ", $Old->Name);
},
Give => sub {
my $self = shift;
@@ -766,10 +702,7 @@ sub BriefDescription {
},
Set => sub {
my $self = shift;
- if ( $self->Field eq 'Password' ) {
- return $self->loc('Password changed');
- }
- elsif ( $self->Field eq 'Queue' ) {
+ if ( $self->Field eq 'Queue' ) {
my $q1 = new RT::Queue( $self->CurrentUser );
$q1->Load( $self->OldValue );
my $q2 = new RT::Queue( $self->CurrentUser );
@@ -786,7 +719,7 @@ sub BriefDescription {
return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, $t2->AsString, $t1->AsString );
}
else {
- return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, ($self->OldValue? "'".$self->OldValue ."'" : $self->loc("(no value)")) , "'". $self->NewValue."'" );
+ return $self->loc( "[_1] changed from [_2] to [_3]", $self->Field, $self->OldValue, $self->NewValue );
}
},
PurgeTransaction => sub {
@@ -810,7 +743,6 @@ Returns false otherwise
sub IsInbound {
my $self = shift;
- $self->ObjectType eq 'RT::Ticket' or return undef;
return ( $self->TicketObj->IsRequestor( $self->CreatorObj->PrincipalId ) );
}
@@ -818,11 +750,23 @@ sub IsInbound {
# }}}
-sub _OverlayAccessible {
+sub _ClassAccessible {
{
- ObjectType => { public => 1},
- ObjectId => { public => 1},
+ id => { read => 1, type => 'int(11)', default => '' },
+ EffectiveTicket =>
+ { read => 1, write => 1, type => 'int(11)', default => '' },
+ Ticket =>
+ { read => 1, public => 1, type => 'int(11)', default => '' },
+ TimeTaken => { read => 1, type => 'int(11)', default => '' },
+ Type => { read => 1, type => 'varchar(20)', default => '' },
+ Field => { read => 1, type => 'varchar(40)', default => '' },
+ OldValue => { read => 1, type => 'varchar(255)', default => '' },
+ NewValue => { read => 1, type => 'varchar(255)', default => '' },
+ Data => { read => 1, type => 'varchar(100)', default => '' },
+ Creator => { read => 1, auto => 1, type => 'int(11)', default => '' },
+ Created =>
+ { read => 1, auto => 1, type => 'datetime', default => '' },
}
};
@@ -879,16 +823,9 @@ sub _Value {
}
}
- # Make sure the user can see the custom field before showing that it changed
- elsif ( ( $self->__Value('Type') eq 'CustomField' ) && $self->__Value('Field') ) {
- my $cf = RT::CustomField->new( $self->CurrentUser );
- $cf->Load( $self->__Value('Field') );
- return (undef) unless ( $cf->CurrentUserHasRight('SeeCustomField') );
- }
-
#if they ain't got rights to see, don't let em
- elsif ($self->__Value('ObjectType') eq "RT::Ticket") {
+ else {
unless ( $self->CurrentUserHasRight('ShowTicket') ) {
return (undef);
}
@@ -922,150 +859,6 @@ sub CurrentUserHasRight {
# }}}
-sub Ticket {
- my $self = shift;
- return $self->ObjectId;
-}
-
-sub TicketObj {
- my $self = shift;
- return $self->Object;
-}
-
-sub OldValue {
- my $self = shift;
- if (my $type = $self->__Value('ReferenceType')) {
- my $Object = $type->new($self->CurrentUser);
- $Object->Load($self->__Value('OldReference'));
- return $Object->Content;
- }
- else {
- return $self->__Value('OldValue');
- }
-}
-
-sub NewValue {
- my $self = shift;
- if (my $type = $self->__Value('ReferenceType')) {
- my $Object = $type->new($self->CurrentUser);
- $Object->Load($self->__Value('NewReference'));
- return $Object->Content;
- }
- else {
- return $self->__Value('NewValue');
- }
-}
-
-sub Object {
- my $self = shift;
- my $Object = $self->__Value('ObjectType')->new($self->CurrentUser);
- $Object->Load($self->__Value('ObjectId'));
- return($Object);
-}
-
-sub FriendlyObjectType {
- my $self = shift;
- my $type = $self->ObjectType or return undef;
- $type =~ s/^RT:://;
- return $self->loc($type);
-}
-
-=head2 UpdateCustomFields
-
- Takes a hash of
-
- CustomField-<<Id>> => Value
- or
-
- Object-RT::Transaction-CustomField-<<Id>> => Value parameters to update
- this transaction's custom fields
-
-=cut
-
-sub UpdateCustomFields {
- my $self = shift;
- my %args = (@_);
-
- # This method used to have an API that took a hash of a single
- # value "ARGSRef", which was a reference to a hash of arguments.
- # This was insane. The next few lines of code preserve that API
- # while giving us something saner.
-
-
- # TODO: 3.6: DEPRECATE OLD API
-
- my $args;
-
- if ($args{'ARGSRef'}) {
- $args = $args{ARGSRef};
- } else {
- $args = \%args;
- }
-
- foreach my $arg ( keys %$args ) {
- next
- unless ( $arg =~
- /^(?:Object-RT::Transaction--)?CustomField-(\d+)/ );
- next if $arg =~ /-Magic$/;
- my $cfid = $1;
- my $values = $args->{$arg};
- foreach
- my $value ( UNIVERSAL::isa( $values, 'ARRAY' ) ? @$values : $values )
- {
- next unless length($value);
- $self->_AddCustomFieldValue(
- Field => $cfid,
- Value => $value,
- RecordTransaction => 0,
- );
- }
- }
-}
-
-
-
-=head2 CustomFieldValues
-
- Do name => id mapping (if needed) before falling back to RT::Record's CustomFieldValues
-
- See L<RT::Record>
-
-=cut
-
-sub CustomFieldValues {
- my $self = shift;
- my $field = shift;
-
- if ( UNIVERSAL::can( $self->Object, 'QueueObj' ) ) {
-
- unless ( $field =~ /^\d+$/o ) {
- my $CFs = RT::CustomFields->new( $self->CurrentUser );
- $CFs->Limit( FIELD => 'Name', VALUE => $field);
- $CFs->LimitToLookupType($self->CustomFieldLookupType);
- $CFs->LimitToGlobalOrObjectId($self->Object->QueueObj->id);
- $field = $CFs->First->id if $CFs->First;
- }
- }
- return $self->SUPER::CustomFieldValues($field);
-}
-
-# }}}
-
-# {{{ sub CustomFieldLookupType
-
-=head2 CustomFieldLookupType
-
-Returns the RT::Transaction lookup type, which can
-be passed to RT::CustomField->Create() via the 'LookupType' hash key.
-
-=cut
-
-# }}}
-
-sub CustomFieldLookupType {
- "RT::Queue-RT::Ticket-RT::Transaction";
-}
-
# Transactions don't change. by adding this cache congif directiove, we don't lose pathalogically on long tickets.
sub _CacheConfig {
{