[Rt-commit] r6330 - in rtir/branches/2.1-EXPERIMENTAL: .

ruz at bestpractical.com ruz at bestpractical.com
Mon Oct 30 15:08:28 EST 2006


Author: ruz
Date: Mon Oct 30 15:08:27 2006
New Revision: 6330

Modified:
   rtir/branches/2.1-EXPERIMENTAL/   (props changed)
   rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm

Log:
 r1794 at cubic-pc:  cubic | 2006-10-30 23:18:01 +0300
 * add hook in LoadByCols to do serialisation


Modified: rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm
==============================================================================
--- rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm	(original)
+++ rtir/branches/2.1-EXPERIMENTAL/lib/RT/IR.pm	Mon Oct 30 15:08:27 2006
@@ -121,12 +121,36 @@
 use Regexp::Common::net::CIDR;
 require Net::CIDR;
 
-require RT::Tickets;
+sub ParseIPRange {
+    my $arg = shift or return ();
+
+    if ( $arg =~ /^\s*$RE{net}{CIDR}{IPv4}{-keep}\s*$/go ) {
+        my $cidr = join( '.', map $_||0, (split /\./, $1)[0..3] ) ."/$2";
+        $arg = (Net::CIDR::cidr2range( $cidr ))[0] || $arg;
+    }
+
+    my ($sIP, $eIP);
+    if ( $arg =~ /^\s*($RE{net}{IPv4})\s*$/o ) {
+        $sIP = $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+    }
+    elsif ( $arg =~ /^\s*($RE{net}{IPv4})-($RE{net}{IPv4})\s*$/o ) {
+        $sIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
+        $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $2;
+    }
+    else {
+        return ();
+    }
+    ($sIP, $eIP) = ($eIP, $sIP) if $sIP gt $eIP;
+
+    return $sIP, $eIP;
+}
+
 
 # limit formatting "%03d.%03d.%03d.%03d"
 # "= 'sIP-eIP'" => "( >=sIP AND <=eIP)"
 # "!= 'sIP-eIP'" => "( <sIP OR >eIP)"
 # two ranges intercect when ( eIP1 >= sIP2 AND sIP1 <= eIP2 )
+require RT::Tickets;
 wrap 'RT::Tickets::_CustomFieldLimit',
     pre => sub {
         return if $_[2] && $_[2] =~ /^[<>]=?$/;
@@ -185,19 +209,11 @@
         for ( my $i = 1; $i < @_; $i += 2 ) {
             next unless $_[$i] && $_[$i] eq 'Content';
 
-            my ($sIP, $eIP);
-            if ( $_[++$i] =~ /^\s*($RE{net}{IPv4})\s*$/o ) {
-                $sIP = $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
-            }
-            elsif ( $_[$i] =~ /^\s*($RE{net}{IPv4})-($RE{net}{IPv4})\s*$/o ) {
-                $sIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $1;
-                $eIP = sprintf "%03d.%03d.%03d.%03d", split /\./, $2;
-            }
-            else {
+            my ($sIP, $eIP) = ParseIPRange( $_[++$i] );
+            unless ( $sIP && $eIP ) {
                 $_[-1] = 0;
                 return;
             }
-            ($sIP, $eIP) = ($eIP, $sIP) if $sIP gt $eIP;
             $_[$i] = $sIP;
 
             my $flag = 0;
@@ -236,4 +252,31 @@
 eval "require RT::IR_Local";
 die $@ if ($@ && $@ !~ qr{^Can't locate RT/IR_Local.pm});
 
+package RT::ObjectCustomFieldValue;
+
+use strict;
+use warnings;
+
+sub LoadByCols {
+    my $self = shift;
+    my %args = @_;
+    return $self->SUPER::LoadByCols( %args )
+        unless $args{'CustomField'} && $args{'Content'};
+
+    my $cf = RT::IR::GetCustomField( '_RTIR_IP' );
+    unless ( $cf && $cf->id ) {
+        $RT::Logger->crit("Couldn't load IP CF");
+        return $self->SUPER::LoadByCols( %args )
+    }
+    return $self->SUPER::LoadByCols( %args )
+        unless $cf->id == $args{'CustomField'};
+
+    my ($sIP, $eIP) = RT::IR::ParseIPRange( $args{'Content'} );
+    return $self->SUPER::LoadByCols( %args )
+        unless $sIP && $eIP;
+
+    return $self->SUPER::LoadByCols( %args, Content => $sIP, LargeContent => $eIP );
+}
+
+
 1;


More information about the Rt-commit mailing list