X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=rt%2Flib%2FRT%2FCustomField.pm;h=ff1eec9b3fee2a94c24af078a55ae30ba28dff86;hb=9931f703daa44a56da2382fd823271eff138959a;hp=01b4970c4faf20b5b0262beca42c63ecce12083b;hpb=679854b8bbc65d112071111bbd7f34a6a481fb30;p=freeside.git diff --git a/rt/lib/RT/CustomField.pm b/rt/lib/RT/CustomField.pm index 01b4970c4..ff1eec9b3 100644 --- a/rt/lib/RT/CustomField.pm +++ b/rt/lib/RT/CustomField.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2014 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -51,7 +51,7 @@ package RT::CustomField; use strict; use warnings; - +use Scalar::Util 'blessed'; use base 'RT::Record'; @@ -1111,11 +1111,6 @@ sub SetRenderType { $self->FriendlyType)); } - # XXX: Remove this restriction once we support lists and cascaded selects - if ( $self->BasedOnObj->id and $type =~ /List/ ) { - return (0, $self->loc("We can't currently render as a List when basing categories on another custom field. Please use another render type.")); - } - return $self->_Set( Field => 'RenderType', Value => $type, @_ ); } @@ -1193,7 +1188,7 @@ Returns an array of LookupTypes available sub LookupTypes { my $self = shift; - return keys %FRIENDLY_OBJECT_TYPES; + return sort keys %FRIENDLY_OBJECT_TYPES; } my @FriendlyObjectTypes = ( @@ -1222,14 +1217,57 @@ sub FriendlyLookupType { return ( $self->loc( $FriendlyObjectTypes[$#types], @types ) ); } +=head1 RecordClassFromLookupType + +Returns the type of Object referred to by ObjectCustomFields' ObjectId column + +Optionally takes a LookupType to use instead of using the value on the loaded +record. In this case, the method may be called on the class instead of an +object. + +=cut + sub RecordClassFromLookupType { my $self = shift; - my ($class) = ($self->LookupType =~ /^([^-]+)/); + my $type = shift || $self->LookupType; + my ($class) = ($type =~ /^([^-]+)/); unless ( $class ) { - $RT::Logger->error( - "Custom Field #". $self->id - ." has incorrect LookupType '". $self->LookupType ."'" - ); + if (blessed($self) and $self->LookupType eq $type) { + $RT::Logger->error( + "Custom Field #". $self->id + ." has incorrect LookupType '$type'" + ); + } else { + RT->Logger->error("Invalid LookupType passed as argument: $type"); + } + return undef; + } + return $class; +} + +=head1 ObjectTypeFromLookupType + +Returns the ObjectType used in ObjectCustomFieldValues rows for this CF + +Optionally takes a LookupType to use instead of using the value on the loaded +record. In this case, the method may be called on the class instead of an +object. + +=cut + +sub ObjectTypeFromLookupType { + my $self = shift; + my $type = shift || $self->LookupType; + my ($class) = ($type =~ /([^-]+)$/); + unless ( $class ) { + if (blessed($self) and $self->LookupType eq $type) { + $RT::Logger->error( + "Custom Field #". $self->id + ." has incorrect LookupType '$type'" + ); + } else { + RT->Logger->error("Invalid LookupType passed as argument: $type"); + } return undef; } return $class; @@ -1509,12 +1547,6 @@ sub AddValueForObject { } } - if (my $canonicalizer = $self->can('_CanonicalizeValue'.$self->Type)) { - $canonicalizer->($self, \%args); - } - - - my $newval = RT::ObjectCustomFieldValue->new( $self->CurrentUser ); my ($val, $msg) = $newval->Create( ObjectType => ref($obj), @@ -1536,6 +1568,17 @@ sub AddValueForObject { } +sub _CanonicalizeValue { + my $self = shift; + my $args = shift; + + my $type = $self->_Value('Type'); + return 1 unless $type; + + my $method = '_CanonicalizeValue'. $type; + return 1 unless $self->can($method); + $self->$method($args); +} sub _CanonicalizeValueDateTime { my $self = shift; @@ -1544,6 +1587,7 @@ sub _CanonicalizeValueDateTime { $DateObj->Set( Format => 'unknown', Value => $args->{'Content'} ); $args->{'Content'} = $DateObj->ISO; + return 1; } # For date, we need to store Content as ISO date @@ -1558,6 +1602,33 @@ sub _CanonicalizeValueDate { Value => $args->{'Content'}, ); $args->{'Content'} = $DateObj->Date( Timezone => 'user' ); + return 1; +} + +sub _CanonicalizeValueIPAddress { + my $self = shift; + my $args = shift; + + $args->{Content} = RT::ObjectCustomFieldValue->ParseIP( $args->{Content} ); + return (0, $self->loc("Content is not a valid IP address")) + unless $args->{Content}; + return 1; +} + +sub _CanonicalizeValueIPAddressRange { + my $self = shift; + my $args = shift; + + my $content = $args->{Content}; + $content .= "-".$args->{LargeContent} if $args->{LargeContent}; + + ($args->{Content}, $args->{LargeContent}) + = RT::ObjectCustomFieldValue->ParseIPRange( $content ); + + $args->{ContentType} = 'text/plain'; + return (0, $self->loc("Content is not a valid IP address range")) + unless $args->{Content}; + return 1; } =head2 MatchPattern STRING