X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FCustomField.pm;h=e71bbf78adb50f1517bd59d60dbf1cf21619856b;hp=263bde87746623499d73d9452024fffb1e83544b;hb=e9e0cf0989259b94d9758eceff448666a2e5a5cc;hpb=c24d6e2242ae0e026684b8f95decf156aba6e75e diff --git a/rt/lib/RT/CustomField.pm b/rt/lib/RT/CustomField.pm index 263bde877..e71bbf78a 100644 --- a/rt/lib/RT/CustomField.pm +++ b/rt/lib/RT/CustomField.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2012 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'; @@ -170,11 +170,15 @@ our %FieldTypes = ( 'Select up to [_1] datetimes', # loc ] }, - TimeValue => [ - 'Enter multiple time values (UNSUPPORTED)', - 'Enter a time value', - 'Enter [_1] time values (UNSUPPORTED)', - ], + TimeValue => { + sort_order => 105, + selection_type => 0, + labels => [ + 'Enter multiple time values (UNSUPPORTED)', + 'Enter a time value', + 'Enter [_1] time values (UNSUPPORTED)', + ] + }, IPAddress => { sort_order => 110, @@ -406,6 +410,10 @@ sub Create { $self->SetUILocation( $args{'UILocation'} ); } + if ( exists $args{'NoClone'} ) { + $self->SetNoClone( $args{'NoClone'} ); + } + return ($rv, $msg) unless exists $args{'Queue'}; # Compat code -- create a new ObjectCustomField mapping @@ -702,7 +710,7 @@ sub ValidateValuesClass { my $self = shift; my $class = shift; - return 1 if !defined $class || $class eq 'RT::CustomFieldValues'; + return 1 if !$class || $class eq 'RT::CustomFieldValues'; return 1 if grep $class eq $_, RT->Config->Get('CustomFieldValuesSources'); return undef; } @@ -1103,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, @_ ); } @@ -1185,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 = ( @@ -1214,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; @@ -1548,9 +1594,8 @@ sub _CanonicalizeValueDate { my $DateObj = RT::Date->new( $self->CurrentUser ); $DateObj->Set( Format => 'unknown', Value => $args->{'Content'}, - Timezone => 'UTC', ); - $args->{'Content'} = $DateObj->Date( Timezone => 'UTC' ); + $args->{'Content'} = $DateObj->Date( Timezone => 'user' ); } =head2 MatchPattern STRING @@ -1658,14 +1703,13 @@ sub ValuesForObject { my $object = shift; my $values = RT::ObjectCustomFieldValues->new($self->CurrentUser); - unless ($self->CurrentUserHasRight('SeeCustomField')) { + unless ($self->id and $self->CurrentUserHasRight('SeeCustomField')) { # Return an empty object if they have no rights to see + $values->Limit( FIELD => "id", VALUE => 0, SUBCLAUSE => "ACL" ); return ($values); } - - + $values->LimitToCustomField($self->Id); - $values->LimitToEnabled(); $values->LimitToObject($object); return ($values); @@ -1682,6 +1726,7 @@ Examples: 'RT::Queue-RT::Ticket-RT::Transaction' => "Ticket Transactions", # loc 'RT::User' => "Users", # loc 'RT::Group' => "Groups", # loc + 'RT::Queue' => "Queues", # loc This is a class method. @@ -1818,9 +1863,20 @@ sub SetUILocation { } } +sub NoClone { + my $self = shift; + $self->FirstAttribute('NoClone') ? 1 : ''; +} - - +sub SetNoClone { + my $self = shift; + my $value = shift; + if ( $value ) { + return $self->SetAttribute( Name => 'NoClone', Content => 1 ); + } else { + return $self->DeleteAttribute('NoClone'); + } +} =head2 id @@ -2084,6 +2140,8 @@ sub _CoreAccessible { {read => 1, write => 1, sql_type => -4, length => 0, is_blob => 1, is_numeric => 0, type => 'text', default => ''}, Repeated => {read => 1, write => 1, sql_type => 5, length => 6, is_blob => 0, is_numeric => 1, type => 'smallint(6)', default => '0'}, + ValuesClass => + {read => 1, write => 1, sql_type => 12, length => 64, is_blob => 0, is_numeric => 0, type => 'varchar(64)', default => ''}, BasedOn => {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, Description =>