[Rt-commit] rt branch, 4.2/pluggable-cf-types, updated. rt-4.0.0rc6-135-g779a12a

Chia-liang Kao clkao at bestpractical.com
Wed Mar 9 08:25:12 EST 2011


The branch, 4.2/pluggable-cf-types has been updated
       via  779a12a3f6025b8afa6b93c19ca9e81cb77e1757 (commit)
       via  7dc62b834543a024b756b6188365e6dde8a16abd (commit)
       via  eab78fbea954473a69718d182d7d04d9718c4c53 (commit)
       via  f95d4bc7b191879d9b5db11e0b65bf1903d72ea2 (commit)
       via  fe8756f01f83ce8bb5e812e388b05ff331693c50 (commit)
      from  347c6f561a3bbb1205e27b03fe764ac2579fac5f (commit)

Summary of changes:
 lib/RT/CustomField.pm                     |   63 ++++++---
 lib/RT/CustomField/Type/IPAddress.pm      |  100 +++++++++++++
 lib/RT/CustomField/Type/IPAddressRange.pm |  137 ++++++++++++++++++
 lib/RT/ObjectCustomFieldValue.pm          |  224 +++--------------------------
 lib/RT/Tickets.pm                         |    4 +-
 5 files changed, 306 insertions(+), 222 deletions(-)
 create mode 100644 lib/RT/CustomField/Type/IPAddress.pm
 create mode 100644 lib/RT/CustomField/Type/IPAddressRange.pm

- Log -----------------------------------------------------------------
commit fe8756f01f83ce8bb5e812e388b05ff331693c50
Author: Chia-liang Kao <clkao at bestpractical.com>
Date:   Wed Mar 9 19:08:20 2011 +0800

    remove unused param

diff --git a/lib/RT/Tickets.pm b/lib/RT/Tickets.pm
index e9c9e62..633bbc7 100644
--- a/lib/RT/Tickets.pm
+++ b/lib/RT/Tickets.pm
@@ -1498,7 +1498,7 @@ sub _CustomFieldLimit_Date {
 
 # returns true if the custom field type expansion has handled the rest of the query
 sub _CustomFieldLimit_TypeExpansion {
-    my ($self, $field, $cf, $value, $op, undef, %rest) = @_;
+    my ($self, $field, $cf, $value, $op, %rest) = @_;
 
     if ($cf->Type eq 'IPAddressRange') {
         return $self->_CustomFieldLimit_IPAddressRange($field, $value, $op, %rest);
@@ -1594,7 +1594,7 @@ sub _CustomFieldLimit {
         # if column is not defined, that means the CF type still has
         # change to expand the query into actual column clauses
         return if
-            $self->_CustomFieldLimit_TypeExpansion($field, $cf, $value, $op, undef, %rest);
+            $self->_CustomFieldLimit_TypeExpansion($field, $cf, $value, $op, %rest);
     }
 
     if ( !$negative_op || $single_value ) {

commit f95d4bc7b191879d9b5db11e0b65bf1903d72ea2
Author: Chia-liang Kao <clkao at bestpractical.com>
Date:   Wed Mar 9 19:50:19 2011 +0800

    move canonicalize functions to their class of custom field types.

diff --git a/lib/RT/CustomField.pm b/lib/RT/CustomField.pm
index bfb6e54..4fdb0c0 100644
--- a/lib/RT/CustomField.pm
+++ b/lib/RT/CustomField.pm
@@ -170,25 +170,6 @@ our %FieldTypes = (
                     'Select up to [_1] datetimes',                    # loc
                   ]
                 },
-
-    IPAddress => {
-        sort_order => 110,
-        selection_type => 0,
-
-        labels => [ 'Enter multiple IP addresses',       # loc
-                    'Enter one IP address',             # loc
-                    'Enter up to [_1] IP addresses',     # loc
-                  ]
-                },
-    IPAddressRange => {
-        sort_order => 120,
-        selection_type => 0,
-
-        labels => [ 'Enter multiple IP address ranges',       # loc
-                    'Enter one IP address range',             # loc
-                    'Enter up to [_1] IP address ranges',     # loc
-                  ]
-                },
 );
 
 
@@ -218,6 +199,50 @@ our $RIGHT_CATEGORIES = {
 # Tell RT::ACE that this sort of object can get acls granted
 $RT::ACE::OBJECT_TYPES{'RT::CustomField'} = 1;
 
+
+sub RegisterType {
+    my ($class, $name, $param) = @_;
+    $FieldTypes{$name} = $param;
+
+    if (my $class = $param->{class}) {
+        $class->require or die $UNIVERSAL::require::ERROR;
+    }
+}
+
+sub GetTypeClass {
+    my ($self) = @_;
+    my $type = $FieldTypes{$self->Type};
+    $type ? $type->{class} : undef;
+#    $FieldTypes{$name}{class};
+}
+
+__PACKAGE__->RegisterType(
+    IPAddress => {
+        sort_order => 110,
+        selection_type => 0,
+
+        labels => [ 'Enter multiple IP addresses',       # loc
+                    'Enter one IP address',             # loc
+                    'Enter up to [_1] IP addresses',     # loc
+                  ],
+        class => 'RT::CustomField::Type::IPAddress',
+    },
+
+);
+
+__PACKAGE__->RegisterType(
+    IPAddressRange => {
+        sort_order => 120,
+        selection_type => 0,
+
+        labels => [ 'Enter multiple IP address ranges',       # loc
+                    'Enter one IP address range',             # loc
+                    'Enter up to [_1] IP address ranges',     # loc
+                  ],
+        class => 'RT::CustomField::Type::IPAddressRange',
+    },
+);
+
 __PACKAGE__->AddRights(%$RIGHTS);
 __PACKAGE__->AddRightCategories(%$RIGHT_CATEGORIES);
 
diff --git a/lib/RT/CustomField/Type/IPAddress.pm b/lib/RT/CustomField/Type/IPAddress.pm
new file mode 100644
index 0000000..be01d19
--- /dev/null
+++ b/lib/RT/CustomField/Type/IPAddress.pm
@@ -0,0 +1,86 @@
+package RT::CustomField::Type::IPAddress;
+use strict;
+use warnings;
+
+use Regexp::Common qw(RE_net_IPv4);
+use Regexp::IPv6 qw($IPv6_re);
+
+sub CanonicalizeForCreate {
+    my ($self, $cf, $args) = @_;
+
+    if ( $args->{'Content'} ) {
+        $args->{'Content'} = $self->ParseIP( $args->{'Content'} );
+    }
+
+
+    unless ( defined $args->{'Content'} ) {
+        return wantarray
+              ? ( 0, "Content is an invalid IP address" ) # loc
+              : 0;
+    }
+
+    return wantarray ? ( 1 ) : 1;
+}
+
+sub CanonicalizeForSearch {
+    my ($self, $cf, $value, $op ) = @_;
+
+    my $parsed = $self->ParseIP($value);
+    if ($parsed) {
+        $value = $parsed;
+    }
+    else {
+        $RT::Logger->warn("$value is not a valid IPAddress");
+    }
+    return $value;
+}
+
+sub ParseIP {
+    my $self = shift;
+    my $value = shift or return;
+    $value = lc $value;
+    $value =~ s!^\s+!!;
+    $value =~ s!\s+$!!;
+
+    if ( $value =~ /^($RE{net}{IPv4})$/o ) {
+        return sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+    }
+    elsif ( $value =~ /^$IPv6_re$/o ) {
+
+        # up_fields are before '::'
+        # low_fields are after '::' but without v4
+        # v4_fields are the v4
+        my ( @up_fields, @low_fields, @v4_fields );
+        my $v6;
+        if ( $value =~ /(.*:)(\d+\..*)/ ) {
+            ( $v6, my $v4 ) = ( $1, $2 );
+            chop $v6 unless $v6 =~ /::$/;
+            while ( $v4 =~ /(\d+)\.(\d+)/g ) {
+                push @v4_fields, sprintf '%.2x%.2x', $1, $2;
+            }
+        }
+        else {
+            $v6 = $value;
+        }
+
+        my ( $up, $low );
+        if ( $v6 =~ /::/ ) {
+            ( $up, $low ) = split /::/, $v6;
+        }
+        else {
+            $up = $v6;
+        }
+
+        @up_fields = split /:/, $up;
+        @low_fields = split /:/, $low if $low;
+
+        my @zero_fields =
+          ('0000') x ( 8 - @v4_fields - @up_fields - @low_fields );
+        my @fields = ( @up_fields, @zero_fields, @low_fields, @v4_fields );
+
+        return join ':', map { sprintf "%.4x", hex "0x$_" } @fields;
+    }
+    return;
+}
+
+1;
diff --git a/lib/RT/CustomField/Type/IPAddressRange.pm b/lib/RT/CustomField/Type/IPAddressRange.pm
new file mode 100644
index 0000000..e5bb609
--- /dev/null
+++ b/lib/RT/CustomField/Type/IPAddressRange.pm
@@ -0,0 +1,107 @@
+package RT::CustomField::Type::IPAddressRange;
+use strict;
+use warnings;
+
+use RT::CustomField::Type::IPAddress;
+
+use Regexp::Common qw(RE_net_IPv4);
+use Regexp::IPv6 qw($IPv6_re);
+use Regexp::Common::net::CIDR;
+require Net::CIDR;
+
+sub CanonicalizeForCreate {
+    my ($self, $cf, $args) = @_;
+
+    if ($args->{'Content'}) {
+        ($args->{'Content'}, $args->{'LargeContent'}) =
+            $self->ParseIPRange( $args->{'Content'} );
+    }
+    $args->{'ContentType'} = 'text/plain';
+
+    unless ( defined $args->{'Content'} ) {
+        return wantarray
+                ? ( 0, "Content is an invalid IP address range" ) # loc
+                : 0;
+    }
+
+    return wantarray ? ( 1 ) : 1;
+}
+
+sub CanonicalizeForSearch {
+    my ($self, $cf, $value, $op) = @_;
+
+    if ( $value =~ /^\s*$RE{net}{CIDR}{IPv4}{-keep}\s*$/o ) {
+
+        # convert incomplete 192.168/24 to 192.168.0.0/24 format
+        $value =
+            join( '.', map $_ || 0, ( split /\./, $1 )[ 0 .. 3 ] ) . "/$2"
+            || $value;
+    }
+
+    my ( $start_ip, $end_ip ) =
+        $self->ParseIPRange($value);
+    if ( $start_ip && $end_ip ) {
+        if ( $op =~ /^([<>])=?$/ ) {
+            my $is_less = $1 eq '<' ? 1 : 0;
+            if ( $is_less ) {
+                $value = $start_ip;
+            }
+            else {
+                $value = $end_ip;
+            }
+        }
+        else {
+            $value = join '-', $start_ip, $end_ip;
+        }
+    }
+    else {
+        $RT::Logger->warn("$value is not a valid IPAddressRange");
+    }
+    return $value;
+}
+
+*ParseIP = \&RT::CustomField::Type::IPAddress::ParseIP;
+
+sub ParseIPRange {
+    my $self = shift;
+    my $value = shift or return;
+    $value = lc $value;
+    $value =~ s!^\s+!!;
+    $value =~ s!\s+$!!;
+    
+    if ( $value =~ /^$RE{net}{CIDR}{IPv4}{-keep}$/go ) {
+        my $cidr = join( '.', map $_||0, (split /\./, $1)[0..3] ) ."/$2";
+        $value = (Net::CIDR::cidr2range( $cidr ))[0] || $value;
+    }
+    elsif ( $value =~ /^$IPv6_re(?:\/\d+)?$/o ) {
+        $value = (Net::CIDR::cidr2range( $value ))[0] || $value;
+    }
+    
+    my ($sIP, $eIP);
+    if ( $value =~ /^($RE{net}{IPv4})$/o ) {
+        $sIP = $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+    }
+    elsif ( $value =~ /^($RE{net}{IPv4})-($RE{net}{IPv4})$/o ) {
+        $sIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+        $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $2;
+    }
+    elsif ( $value =~ /^($IPv6_re)$/o ) {
+        $sIP = $self->ParseIP( $1 );
+        $eIP = $sIP;
+    }
+    elsif ( $value =~ /^($IPv6_re)-($IPv6_re)$/o ) {
+        ($sIP, $eIP) = ( $1, $2 );
+        $sIP = $self->ParseIP( $sIP );
+        $eIP = $self->ParseIP( $eIP );
+    }
+    else {
+        return;
+    }
+
+    ($sIP, $eIP) = ($eIP, $sIP) if $sIP gt $eIP;
+    
+    return $sIP, $eIP;
+}
+
+
+1;
diff --git a/lib/RT/ObjectCustomFieldValue.pm b/lib/RT/ObjectCustomFieldValue.pm
index 9dde495..f838030 100644
--- a/lib/RT/ObjectCustomFieldValue.pm
+++ b/lib/RT/ObjectCustomFieldValue.pm
@@ -52,11 +52,6 @@ use strict;
 use warnings;
 
 use RT::Interface::Web;
-use Regexp::Common qw(RE_net_IPv4);
-use Regexp::IPv6 qw($IPv6_re);
-use Regexp::Common::net::CIDR;
-require Net::CIDR;
-
 
 
 
@@ -69,83 +64,30 @@ sub Table {'ObjectCustomFieldValues'}
 sub _CanonicalizeForCreate {
     my ($self, $cf_as_sys, $args) = @_;
 
-    if($cf_as_sys->Type eq 'IPAddress') {
-        if ( $args->{'Content'} ) {
-            $args->{'Content'} = $self->ParseIP( $args->{'Content'} );
-        }
-
-        unless ( defined $args->{'Content'} ) {
-            return
-              wantarray
-              ? ( 0, $self->loc("Content is an invalid IP address") )
-              : 0;
-        }
-    }
-
-    if($cf_as_sys->Type eq 'IPAddressRange') {
-        if ($args->{'Content'}) {
-            ($args->{'Content'}, $args->{'LargeContent'}) = $self->ParseIPRange( $args->{'Content'} );
-        }
-        $args->{'ContentType'} = 'text/plain';
+    my $class = $cf_as_sys->GetTypeClass;
 
-        unless ( defined $args->{'Content'} ) {
-            return
-              wantarray
-              ? ( 0, $self->loc("Content is an invalid IP address range") )
-              : 0;
+    if ($class) {
+        my ($ret, $msg) = $class->CanonicalizeForCreate( $cf_as_sys, $args );
+        unless ($ret) {
+            return (0, $self->loc($msg));
         }
     }
 
     return wantarray ? (1) : 1;
 }
 
-# XXX: not yet, the ipaddressrange belongs to some deeper hook for CFLimit
 sub _CanonicalizeForSearch {
     my ($self, $cf, $value, $op) = @_;
 
-    if ( $cf && $cf->Type eq 'IPAddress' ) {
-        my $parsed = RT::ObjectCustomFieldValue->ParseIP($value);
-        if ($parsed) {
-            $value = $parsed;
-        }
-        else {
-            $RT::Logger->warn("$value is not a valid IPAddress");
-        }
-    }
-
-    if ( $cf->Type eq 'IPAddressRange' ) {
+    return unless $cf;
 
-        if ( $value =~ /^\s*$RE{net}{CIDR}{IPv4}{-keep}\s*$/o ) {
+    my $class = $cf->GetTypeClass;
 
-            # convert incomplete 192.168/24 to 192.168.0.0/24 format
-            $value =
-              join( '.', map $_ || 0, ( split /\./, $1 )[ 0 .. 3 ] ) . "/$2"
-              || $value;
-        }
-
-        my ( $start_ip, $end_ip ) =
-          RT::ObjectCustomFieldValue->ParseIPRange($value);
-        if ( $start_ip && $end_ip ) {
-            if ( $op =~ /^([<>])=?$/ ) {
-                my $is_less = $1 eq '<' ? 1 : 0;
-                if ( $is_less ) {
-                    $value = $start_ip;
-                }
-                else {
-                    $value = $end_ip;
-                }
-            }
-            else {
-                $value = join '-', $start_ip, $end_ip;
-            }
-        }
-        else {
-            $RT::Logger->warn("$value is not a valid IPAddressRange");
-        }
+    if ($class) {
+        $value = $class->CanonicalizeForSearch( $cf, $value, $op );
     }
 
     return $value;
-
 }
 
 sub Create {
@@ -226,7 +168,7 @@ sub LoadByCols {
         $cf->Load( $args{CustomField} );
         if ( $cf->Type && $cf->Type eq 'IPAddressRange' ) {
 
-            my ( $sIP, $eIP ) = $cf->ParseIPRange( $args{'Content'} );
+            my ( $sIP, $eIP ) = RT::CustomField::Type::IPAddressRange->ParseIPRange( $args{'Content'} );
             if ( $sIP && $eIP ) {
                 $self->SUPER::LoadByCols( %args,
                                           Content      => $sIP,
@@ -307,6 +249,7 @@ content, try "LargeContent"
 
 my $re_ip_sunit = qr/[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]/;
 my $re_ip_serialized = qr/$re_ip_sunit(?:\.$re_ip_sunit){3}/;
+use Regexp::IPv6 qw($IPv6_re);
 
 sub Content {
     my $self = shift;
@@ -478,97 +421,6 @@ sub IncludeContentForValue {
     return $self->_FillInTemplateURL($self->CustomFieldObj->IncludeContentForValue);
 }
 
-
-sub ParseIPRange {
-    my $self = shift;
-    my $value = shift or return;
-    $value = lc $value;
-    $value =~ s!^\s+!!;
-    $value =~ s!\s+$!!;
-    
-    if ( $value =~ /^$RE{net}{CIDR}{IPv4}{-keep}$/go ) {
-        my $cidr = join( '.', map $_||0, (split /\./, $1)[0..3] ) ."/$2";
-        $value = (Net::CIDR::cidr2range( $cidr ))[0] || $value;
-    }
-    elsif ( $value =~ /^$IPv6_re(?:\/\d+)?$/o ) {
-        $value = (Net::CIDR::cidr2range( $value ))[0] || $value;
-    }
-    
-    my ($sIP, $eIP);
-    if ( $value =~ /^($RE{net}{IPv4})$/o ) {
-        $sIP = $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
-    }
-    elsif ( $value =~ /^($RE{net}{IPv4})-($RE{net}{IPv4})$/o ) {
-        $sIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
-        $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $2;
-    }
-    elsif ( $value =~ /^($IPv6_re)$/o ) {
-        $sIP = $self->ParseIP( $1 );
-        $eIP = $sIP;
-    }
-    elsif ( $value =~ /^($IPv6_re)-($IPv6_re)$/o ) {
-        ($sIP, $eIP) = ( $1, $2 );
-        $sIP = $self->ParseIP( $sIP );
-        $eIP = $self->ParseIP( $eIP );
-    }
-    else {
-        return;
-    }
-
-    ($sIP, $eIP) = ($eIP, $sIP) if $sIP gt $eIP;
-    
-    return $sIP, $eIP;
-}
-
-sub ParseIP {
-    my $self = shift;
-    my $value = shift or return;
-    $value = lc $value;
-    $value =~ s!^\s+!!;
-    $value =~ s!\s+$!!;
-
-    if ( $value =~ /^($RE{net}{IPv4})$/o ) {
-        return sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
-    }
-    elsif ( $value =~ /^$IPv6_re$/o ) {
-
-        # up_fields are before '::'
-        # low_fields are after '::' but without v4
-        # v4_fields are the v4
-        my ( @up_fields, @low_fields, @v4_fields );
-        my $v6;
-        if ( $value =~ /(.*:)(\d+\..*)/ ) {
-            ( $v6, my $v4 ) = ( $1, $2 );
-            chop $v6 unless $v6 =~ /::$/;
-            while ( $v4 =~ /(\d+)\.(\d+)/g ) {
-                push @v4_fields, sprintf '%.2x%.2x', $1, $2;
-            }
-        }
-        else {
-            $v6 = $value;
-        }
-
-        my ( $up, $low );
-        if ( $v6 =~ /::/ ) {
-            ( $up, $low ) = split /::/, $v6;
-        }
-        else {
-            $up = $v6;
-        }
-
-        @up_fields = split /:/, $up;
-        @low_fields = split /:/, $low if $low;
-
-        my @zero_fields =
-          ('0000') x ( 8 - @v4_fields - @up_fields - @low_fields );
-        my @fields = ( @up_fields, @zero_fields, @low_fields, @v4_fields );
-
-        return join ':', map { sprintf "%.4x", hex "0x$_" } @fields;
-    }
-    return;
-}
-
-
 =head2 id
 
 Returns the current value of id.

commit eab78fbea954473a69718d182d7d04d9718c4c53
Author: Chia-liang Kao <clkao at bestpractical.com>
Date:   Wed Mar 9 20:15:41 2011 +0800

    Make use of canonicalize in loadbycols

diff --git a/lib/RT/ObjectCustomFieldValue.pm b/lib/RT/ObjectCustomFieldValue.pm
index f838030..7d0f963 100644
--- a/lib/RT/ObjectCustomFieldValue.pm
+++ b/lib/RT/ObjectCustomFieldValue.pm
@@ -166,14 +166,16 @@ sub LoadByCols {
     if ( $args{CustomField} ) {
         $cf = RT::CustomField->new( $self->CurrentUser );
         $cf->Load( $args{CustomField} );
-        if ( $cf->Type && $cf->Type eq 'IPAddressRange' ) {
-
-            my ( $sIP, $eIP ) = RT::CustomField::Type::IPAddressRange->ParseIPRange( $args{'Content'} );
-            if ( $sIP && $eIP ) {
-                $self->SUPER::LoadByCols( %args,
-                                          Content      => $sIP,
-                                          LargeContent => $eIP
-                                        );
+
+        if ( exists $args{'Content'} && defined $args{'Content'} ) {
+            my ($ret, $msg) = $self->_CanonicalizeForCreate( $cf, \%args );
+            if ($ret) {
+                $self->SUPER::LoadByCols( %args );
+            }
+            else {
+                return wantarray
+                ? ( 0, $msg )
+                : 0;
             }
         }
     }

commit 7dc62b834543a024b756b6188365e6dde8a16abd
Author: Chia-liang Kao <clkao at bestpractical.com>
Date:   Wed Mar 9 20:15:51 2011 +0800

    cleanup

diff --git a/lib/RT/CustomField.pm b/lib/RT/CustomField.pm
index 4fdb0c0..86129a7 100644
--- a/lib/RT/CustomField.pm
+++ b/lib/RT/CustomField.pm
@@ -211,9 +211,9 @@ sub RegisterType {
 
 sub GetTypeClass {
     my ($self) = @_;
+    return unless $self->Type;
     my $type = $FieldTypes{$self->Type};
     $type ? $type->{class} : undef;
-#    $FieldTypes{$name}{class};
 }
 
 __PACKAGE__->RegisterType(

commit 779a12a3f6025b8afa6b93c19ca9e81cb77e1757
Author: Chia-liang Kao <clkao at bestpractical.com>
Date:   Wed Mar 9 20:29:14 2011 +0800

    Make Stringify a type class method

diff --git a/lib/RT/CustomField/Type/IPAddress.pm b/lib/RT/CustomField/Type/IPAddress.pm
index be01d19..5ef1bdc 100644
--- a/lib/RT/CustomField/Type/IPAddress.pm
+++ b/lib/RT/CustomField/Type/IPAddress.pm
@@ -35,6 +35,20 @@ sub CanonicalizeForSearch {
     return $value;
 }
 
+my $re_ip_sunit = qr/[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]/;
+my $re_ip_serialized = qr/$re_ip_sunit(?:\.$re_ip_sunit){3}/;
+
+sub Stringify {
+    my ($self, $ocfv) = @_;
+    my $content = $ocfv->_Value('Content');
+
+    if ( $content =~ /^\s*($re_ip_serialized)\s*$/o ) {
+        $content = sprintf "%d.%d.%d.%d", split /\./, $1;
+    }
+
+    return $content
+}
+
 sub ParseIP {
     my $self = shift;
     my $value = shift or return;
diff --git a/lib/RT/CustomField/Type/IPAddressRange.pm b/lib/RT/CustomField/Type/IPAddressRange.pm
index e5bb609..398370d 100644
--- a/lib/RT/CustomField/Type/IPAddressRange.pm
+++ b/lib/RT/CustomField/Type/IPAddressRange.pm
@@ -2,7 +2,7 @@ package RT::CustomField::Type::IPAddressRange;
 use strict;
 use warnings;
 
-use RT::CustomField::Type::IPAddress;
+use base qw(RT::CustomField::Type::IPAddress);
 
 use Regexp::Common qw(RE_net_IPv4);
 use Regexp::IPv6 qw($IPv6_re);
@@ -60,7 +60,37 @@ sub CanonicalizeForSearch {
     return $value;
 }
 
-*ParseIP = \&RT::CustomField::Type::IPAddress::ParseIP;
+my $re_ip_sunit = qr/[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]/;
+my $re_ip_serialized = qr/$re_ip_sunit(?:\.$re_ip_sunit){3}/;
+use Regexp::IPv6 qw($IPv6_re);
+
+sub Stringify {
+    my ($self, $ocfv) = @_;
+    my $content = $self->SUPER::Stringify($ocfv);
+
+    my $large_content = $ocfv->__Value('LargeContent');
+    if ( $large_content =~ /^\s*($re_ip_serialized)\s*$/o ) {
+        my $eIP = sprintf "%d.%d.%d.%d", split /\./, $1;
+        if ( $content eq $eIP ) {
+            return $content;
+        }
+        else {
+            return $content . "-" . $eIP;
+        }
+    }
+    elsif ( $large_content =~ /^\s*($IPv6_re)\s*$/o ) {
+        my $eIP = $1;
+        if ( $content eq $eIP ) {
+            return $content;
+        }
+        else {
+            return $content . "-" . $eIP;
+        }
+    }
+    else {
+        return $content;
+    }
+}
 
 sub ParseIPRange {
     my $self = shift;
diff --git a/lib/RT/ObjectCustomFieldValue.pm b/lib/RT/ObjectCustomFieldValue.pm
index 7d0f963..6480134 100644
--- a/lib/RT/ObjectCustomFieldValue.pm
+++ b/lib/RT/ObjectCustomFieldValue.pm
@@ -249,48 +249,16 @@ content, try "LargeContent"
 
 =cut
 
-my $re_ip_sunit = qr/[0-1][0-9][0-9]|2[0-4][0-9]|25[0-5]/;
-my $re_ip_serialized = qr/$re_ip_sunit(?:\.$re_ip_sunit){3}/;
-use Regexp::IPv6 qw($IPv6_re);
-
 sub Content {
     my $self = shift;
 
-    my $content = $self->_Value('Content');
-    if (   $self->CustomFieldObj->Type eq 'IPAddress'
-        || $self->CustomFieldObj->Type eq 'IPAddressRange' )
-    {
-
-        if ( $content =~ /^\s*($re_ip_serialized)\s*$/o ) {
-            $content = sprintf "%d.%d.%d.%d", split /\./, $1;
-        }
+    my $class = $self->CustomFieldObj->GetTypeClass;
 
-        return $content if $self->CustomFieldObj->Type eq 'IPAddress';
-
-        my $large_content = $self->__Value('LargeContent');
-        if ( $large_content =~ /^\s*($re_ip_serialized)\s*$/o ) {
-            my $eIP = sprintf "%d.%d.%d.%d", split /\./, $1;
-            if ( $content eq $eIP ) {
-                return $content;
-            }
-            else {
-                return $content . "-" . $eIP;
-            }
-        }
-        elsif ( $large_content =~ /^\s*($IPv6_re)\s*$/o ) {
-            my $eIP = $1;
-            if ( $content eq $eIP ) {
-                return $content;
-            }
-            else {
-                return $content . "-" . $eIP;
-            }
-        }
-        else {
-            return $content;
-        }
+    if ($class) {
+        return $class->Stringify( $self );
     }
 
+    my $content = $self->_Value('Content');
     if ( !(defined $content && length $content) && $self->ContentType && $self->ContentType eq 'text/plain' ) {
         return $self->LargeContent;
     } else {

-----------------------------------------------------------------------


More information about the Rt-commit mailing list