import rt 3.8.7
[freeside.git] / rt / lib / RT / ObjectCustomFieldValue_Overlay.pm
index 7f50f2c..37ad056 100644 (file)
@@ -1,8 +1,8 @@
 # BEGIN BPS TAGGED BLOCK {{{
 # 
 # COPYRIGHT:
-#  
-# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC 
+# 
+# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
 #                                          <jesse@bestpractical.com>
 # 
 # (Except where explicitly superseded by other copyright notices)
 # those contributions and any derivatives thereof.
 # 
 # END BPS TAGGED BLOCK }}}
+
 package RT::ObjectCustomFieldValue;
 
 use strict;
-no warnings qw(redefine);
+use warnings;
+use RT::Interface::Web;
 
+no warnings qw(redefine);
 
 sub Create {
     my $self = shift;
     my %args = (
-                CustomField => '0',
-                ObjectType => '',
-                ObjectId => '0',
-                Disabled => '0',
-                Content => '',
-                LargeContent => '',
-                ContentType => '',
-                ContentEncoding => '',
-
-          @_);
-
-   
-    if( $args{'Content'} && length($args{'Content'}) > 255 && !$args{'LargeContent'} ) {
-
-        $args{'LargeContent'} = $args{'Content'};
-        $args{'Content'} = '';
-        $args{'ContentType'} = 'text/plain';
+        CustomField     => 0,
+        ObjectType      => '',
+        ObjectId        => 0,
+        Disabled        => 0,
+        Content         => '',
+        LargeContent    => undef,
+        ContentType     => '',
+        ContentEncoding => '',
+        @_,
+    );
+
+    if ( defined $args{'Content'} && length( Encode::encode_utf8($args{'Content'}) ) > 255 ) {
+        if ( defined $args{'LargeContent'} && length $args{'LargeContent'} ) {
+            $RT::Logger->error("Content is longer than 255 bytes and LargeContent specified");
+        }
+        else {
+            $args{'LargeContent'} = $args{'Content'};
+            $args{'Content'} = '';
+            $args{'ContentType'} ||= 'text/plain';
+        }
     }
 
     ( $args{'ContentEncoding'}, $args{'LargeContent'} ) =
-      $self->_EncodeLOB( $args{'LargeContent'}, $args{'ContentType'} )
-      if ( $args{'LargeContent'} );
-
-    $self->SUPER::Create(
-                         CustomField => $args{'CustomField'},
-                         ObjectType => $args{'ObjectType'},
-                         ObjectId => $args{'ObjectId'},
-                         Disabled => $args{'Disabled'},
-                         Content => $args{'Content'},
-                         LargeContent => $args{'LargeContent'},
-                         ContentType => $args{'ContentType'},
-                         ContentEncoding => $args{'ContentEncoding'},
-);
-
-
-
+        $self->_EncodeLOB( $args{'LargeContent'}, $args{'ContentType'} )
+            if defined $args{'LargeContent'};
+
+    return $self->SUPER::Create(
+        CustomField     => $args{'CustomField'},
+        ObjectType      => $args{'ObjectType'},
+        ObjectId        => $args{'ObjectId'},
+        Disabled        => $args{'Disabled'},
+        Content         => $args{'Content'},
+        LargeContent    => $args{'LargeContent'},
+        ContentType     => $args{'ContentType'},
+        ContentEncoding => $args{'ContentEncoding'},
+    );
 }
 
 
 sub LargeContent {
     my $self = shift;
-    $self->_DecodeLOB( $self->ContentType, $self->ContentEncoding,
-        $self->_Value( 'LargeContent', decode_utf8 => 0 ) );
-
+    return $self->_DecodeLOB(
+        $self->ContentType,
+        $self->ContentEncoding,
+        $self->_Value( 'LargeContent', decode_utf8 => 0 )
+    );
 }
 
-
-
-
 =head2 LoadByTicketContentAndCustomField { Ticket => TICKET, CustomField => CUSTOMFIELD, Content => CONTENT }
 
 Loads a custom field value by Ticket, Content and which CustomField it's tied to
@@ -112,40 +114,40 @@ Loads a custom field value by Ticket, Content and which CustomField it's tied to
 
 sub LoadByTicketContentAndCustomField {
     my $self = shift;
-    my %args = ( Ticket => undef,
-                CustomField => undef,
-                Content => undef,
-                @_
-                );
-
-
-    $self->LoadByCols( Content => $args{'Content'},
-                         CustomField => $args{'CustomField'},
-                         ObjectType => 'RT::Ticket',
-                         ObjectId => $args{'Ticket'},
-                        Disabled => 0
-                        );
-
-    
+    my %args = (
+        Ticket => undef,
+        CustomField => undef,
+        Content => undef,
+        @_
+    );
+
+    return $self->LoadByCols(
+        Content => $args{'Content'},
+        CustomField => $args{'CustomField'},
+        ObjectType => 'RT::Ticket',
+        ObjectId => $args{'Ticket'},
+        Disabled => 0
+    );
 }
 
 sub LoadByObjectContentAndCustomField {
     my $self = shift;
-    my %args = ( Object => undef,
-                CustomField => undef,
-                Content => undef,
-                @_
-                );
+    my %args = (
+        Object => undef,
+        CustomField => undef,
+        Content => undef,
+        @_
+    );
 
     my $obj = $args{'Object'} or return;
 
-    $self->LoadByCols( Content => $args{'Content'},
-                         CustomField => $args{'CustomField'},
-                         ObjectType => ref($obj),
-                         ObjectId => $obj->Id,
-                        Disabled => 0
-                        );
-
+    return $self->LoadByCols(
+        Content => $args{'Content'},
+        CustomField => $args{'CustomField'},
+        ObjectType => ref($obj),
+        ObjectId => $obj->Id,
+        Disabled => 0
+    );
 }
 
 
@@ -156,18 +158,16 @@ content, try "LargeContent"
 
 =cut
 
-
 sub Content {
     my $self = shift;
     my $content = $self->SUPER::Content;
-    if (!$content && $self->ContentType eq 'text/plain') {
-       return $self->LargeContent(); 
+    if ( !(defined $content && length $content) && $self->ContentType && $self->ContentType eq 'text/plain' ) {
+        return $self->LargeContent;
     } else {
         return $content;
     }
 }
 
-
 =head2 Object
 
 Returns the object this value applies to
@@ -176,9 +176,9 @@ Returns the object this value applies to
 
 sub Object {
     my $self  = shift;
-    my $Object = $self->__Value('ObjectType')->new($self->CurrentUser);
-    $Object->Load($self->__Value('ObjectId'));
-    return($Object);
+    my $Object = $self->__Value('ObjectType')->new( $self->CurrentUser );
+    $Object->LoadById( $self->__Value('ObjectId') );
+    return $Object;
 }
 
 
@@ -191,13 +191,13 @@ Disable this value. Used to remove "current" values from records while leaving t
 
 sub Delete {
     my $self = shift;
-    $self->SetDisabled(1);
+    return $self->SetDisabled(1);
 }
 
 =head2 _FillInTemplateURL URL
 
 Takes a URL containing placeholders and returns the URL as filled in for this 
-ObjectCustomFieldValue.
+ObjectCustomFieldValue. The values for the placeholders will be URI-escaped.
 
 Available placeholders:
 
@@ -211,21 +211,41 @@ The id of the object in question.
 
 The value of this custom field for the object in question.
 
+=item __WebDomain__, __WebPort__, __WebPath__, __WebBaseURL__ and __WebURL__
+
+The value of the config option.
+
 =back
 
 =cut
 
-sub _FillInTemplateURL {
+{
+my %placeholders = (
+    id          => { value => sub { $_[0]->ObjectId }, escape => 1 },
+    CustomField => { value => sub { $_[0]->Content }, escape => 1 },
+    WebDomain   => { value => sub { RT->Config->Get('WebDomain') } },
+    WebPort     => { value => sub { RT->Config->Get('WebPort') } },
+    WebPath     => { value => sub { RT->Config->Get('WebPath') } },
+    WebBaseURL  => { value => sub { RT->Config->Get('WebBaseURL') } },
+    WebURL      => { value => sub { RT->Config->Get('WebURL') } },
+);
 
+sub _FillInTemplateURL {
     my $self = shift;
-
     my $url = shift;
 
-    $url =~ s/__id__/@{[$self->ObjectId]}/g;
-    $url =~ s/__CustomField__/@{[$self->Content]}/g;
+    # default value, uri-escape
+    for my $key (keys %placeholders) {
+        $url =~ s{__${key}__}{
+            my $value = $placeholders{$key}{'value'}->( $self );
+            $value = '' if !defined($value);
+            RT::Interface::Web::EscapeURI(\$value) if $placeholders{$key}{'escape'};
+            $value
+        }gxe;
+    }
 
     return $url;
-}
+} }
 
 
 =head2 ValueLinkURL
@@ -256,7 +276,4 @@ sub IncludeContentForValue {
     return $self->_FillInTemplateURL($self->CustomFieldObj->IncludeContentForValue);
 }
 
-
-
-
 1;