[Rt-commit] r4356 - in rt/branches/3.7-EXPERIMENTAL: .
ruz at bestpractical.com
ruz at bestpractical.com
Sun Dec 25 04:11:44 EST 2005
Author: ruz
Date: Sun Dec 25 03:19:50 2005
New Revision: 4356
Modified:
rt/branches/3.7-EXPERIMENTAL/ (props changed)
rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm
Log:
r1578 at cubic-pc: cubic | 2005-12-25 11:23:39 +0300
r1568 at cubic-pc: cubic | 2005-12-25 11:04:30 +0300
* new IsExternalValues, ValuesClass and SetValuesClass methods
* if CF has external values then Values method returns specific class
* deleted depreacated *ForTicket methods
Modified: rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm
==============================================================================
--- rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm (original)
+++ rt/branches/3.7-EXPERIMENTAL/lib/RT/CustomField_Overlay.pm Sun Dec 25 03:19:50 2005
@@ -105,7 +105,6 @@
SeeCustomField => 'See custom fields', # loc_pair
AdminCustomField => 'Create, delete and modify custom fields', # loc_pair
ModifyCustomField => 'Add, delete and modify custom field values for objects' #loc_pair
-
};
# Tell RT::ACE that this sort of object can get acls granted
@@ -122,16 +121,12 @@
=head1 NAME
- RT::CustomField_Overlay
+ RT::CustomField_Overlay - overlay for RT::CustomField
=head1 DESCRIPTION
=head1 'CORE' METHODS
-=cut
-
-
-
=head2 Create PARAMHASH
Create takes a hash of values and creates a row in the database:
@@ -146,14 +141,11 @@
varchar(255) 'LookupType'.
smallint(6) 'Disabled'.
- 'LookupType' is generally the result of either
- RT::Ticket->CustomFieldLookupType or RT::Transaction->CustomFieldLookupType
+C<LookupType> is generally the result of either
+C<RT::Ticket->CustomFieldLookupType> or C<RT::Transaction->CustomFieldLookupType>.
=cut
-
-
-
sub Create {
my $self = shift;
my %args = (
@@ -165,8 +157,8 @@
Disabled => '0',
LookupType => '',
Repeated => '0',
-
- @_);
+ @_,
+ );
unless ($self->CurrentUser->HasRight(Object => $RT::System, Right => 'AdminCustomField')) {
return (0, $self->loc('Permission Denied'));
@@ -218,6 +210,10 @@
Repeated => $args{'Repeated'},
);
+ if ( exists $args{'ValuesClass'} ) {
+ $self->SetValuesClass( $args{'ValuesClass'} );
+ }
+
return $rv unless exists $args{'Queue'};
# Compat code -- create a new ObjectCustomField mapping
@@ -236,7 +232,6 @@
=cut
-
sub Load {
my $self = shift;
my $id = shift;
@@ -251,7 +246,7 @@
# {{{ sub LoadByName
-=head2 LoadByName (Queue => QUEUEID, Name => NAME)
+=head2 LoadByName (Queue => QUEUEID, Name => NAME)
Loads the Custom field named NAME.
@@ -279,10 +274,10 @@
);
# if we're looking for a queue by name, make it a number
- if (defined $args{'Queue'} && $args{'Queue'} !~ /^\d+$/) {
- my $QueueObj = RT::Queue->new($self->CurrentUser);
- $QueueObj->Load($args{'Queue'});
- $args{'Queue'} = $QueueObj->Id;
+ if ( defined $args{'Queue'} && $args{'Queue'} =~ /\D/ ) {
+ my $QueueObj = RT::Queue->new($self->CurrentUser);
+ $QueueObj->Load($args{'Queue'});
+ $args{'Queue'} = $QueueObj->Id;
}
# XXX - really naive implementation. Slow. - not really. still just one query
@@ -346,9 +341,34 @@
=cut
+=head2 Custom field values
+
+=head3 Values FIELD
+
+Return a object (collection) of all acceptable values for this Custom Field.
+Class of the object can vary and depends on the return value
+of the C<ValuesClass> method.
+
+=cut
+
+*ValuesObj = \&Values;
+
+sub Values {
+ my $self = shift;
+
+ my $class = $self->ValuesClass || 'RT::CustomFieldValues';
+ eval "require $class" or die "$@";
+ my $cf_values = $class->new( $self->CurrentUser );
+ # if the user has no rights, return an empty object
+ if ($self->id && $self->CurrentUserHasRight( 'SeeCustomField') ) {
+ $cf_values->LimitToCustomField( $self->Id );
+ }
+ return ($cf_values);
+}
+
# {{{ AddValue
-=head2 AddValue HASH
+=head3 AddValue HASH
Create a new value for this CustomField. Takes a paramhash containing the elements Name, Description and SortOrder
@@ -387,149 +407,41 @@
# {{{ DeleteValue
-=head2 DeleteValue ID
+=head3 DeleteValue ID
Deletes a value from this custom field by id.
-Does not remove this value for any article which has had it selected
+Does not remove this value for any article which has had it selected
=cut
sub DeleteValue {
- my $self = shift;
+ my $self = shift;
my $id = shift;
unless ($self->CurrentUserHasRight('AdminCustomField')) {
return (0, $self->loc('Permission Denied'));
}
- my $val_to_del = RT::CustomFieldValue->new($self->CurrentUser);
- $val_to_del->Load($id);
- unless ($val_to_del->Id) {
- return (0, $self->loc("Couldn't find that value"));
- }
- unless ($val_to_del->CustomField == $self->Id) {
- return (0, $self->loc("That is not a value for this custom field"));
- }
-
- my $retval = $val_to_del->Delete();
- if ($retval) {
- return ($retval, $self->loc("Custom field value deleted"));
- } else {
- return(0, $self->loc("Custom field value could not be deleted"));
+ my $val_to_del = RT::CustomFieldValue->new( $self->CurrentUser );
+ $val_to_del->Load( $id );
+ unless ($val_to_del->Id) {
+ return (0, $self->loc("Couldn't find that value"));
}
-}
-
-# }}}
-
-# {{{ Values
-
-=head2 Values FIELD
-
-Return a CustomFieldeValues object of all acceptable values for this Custom Field.
-
-
-=cut
-
-*ValuesObj = \&Values;
-
-sub Values {
- my $self = shift;
-
- my $cf_values = RT::CustomFieldValues->new($self->CurrentUser);
- # if the user has no rights, return an empty object
- if ($self->id && $self->CurrentUserHasRight( 'SeeCustomField') ) {
- $cf_values->LimitToCustomField($self->Id);
+ unless ( $val_to_del->CustomField == $self->Id ) {
+ return (0, $self->loc("That is not a value for this custom field"));
}
- return ($cf_values);
-}
-
-# }}}
-
-# }}}
-
-# {{{ Ticket related routines
-# {{{ ValuesForTicket
-
-=head2 ValuesForTicket TICKET
-
-Returns a RT::ObjectCustomFieldValues object of this Field's values for TICKET.
-TICKET is a ticket id.
-
-This is deprecated -- use ValuesForObject instead.
-
-
-=cut
-
-sub ValuesForTicket {
- my $self = shift;
- my $ticket_id = shift;
-
- $RT::Logger->debug( ref($self) . " -> ValuesForTicket deprecated in favor of ValuesForObject at (". join(":",caller).")");
- my $ticket = RT::Ticket->new($self->CurrentUser);
- $ticket->Load($ticket_id);
-
- return $self->ValuesForObject($ticket);
+ my $retval = $val_to_del->Delete;
+ unless ( $retval ) {
+ return(0, $self->loc("Custom field value could not be deleted"));
+ }
+ return ($retval, $self->loc("Custom field value deleted"));
}
# }}}
-# {{{ AddValueForTicket
-
-=head2 AddValueForTicket HASH
-
-Adds a custom field value for a ticket. Takes a param hash of Ticket and Content
-
-This is deprecated -- use AddValueForObject instead.
-
-=cut
-
-sub AddValueForTicket {
- my $self = shift;
- my %args = ( Ticket => undef,
- Content => undef,
- @_ );
- $RT::Logger->debug( ref($self) . " -> AddValueForTicket deprecated in favor of AddValueForObject at (". join(":",caller).")");
-
-
- my $ticket = RT::Ticket->new($self->CurrentUser);
- $ticket->Load($args{'Ticket'});
- return($self->AddValueForObject(Content => $args{'Content'}, Object => $ticket, at _));
-
-}
-
-
# }}}
-# {{{ DeleteValueForTicket
-
-=head2 DeleteValueForTicket HASH
-
-Adds a custom field value for a ticket. Takes a param hash of Ticket and Content
-
-This is deprecated -- use DeleteValueForObject instead.
-
-=cut
-
-sub DeleteValueForTicket {
- my $self = shift;
- my %args = ( Ticket => undef,
- Content => undef,
- @_ );
-
- $RT::Logger->debug( ref($self) . " -> DeleteValueForTicket deprecated in favor of DeleteValueForObject at (". join(":",caller).")");
-
-
- my $ticket = RT::Ticket->new($self->CurrentUser);
- $ticket->load($args{'Ticket'});
- return ($self->DeleteValueForObject(Object => $ticket, Content => $args{'Content'}, @_));
-
-}
-
-# }}}
-# }}}
-
-
=head2 ValidateQueue Queue
Make sure that the queue specified is a valid queue name
@@ -540,18 +452,14 @@
my $self = shift;
my $id = shift;
- if ($id eq '0') { # 0 means "Global" null would _not_ be ok.
- return (1);
- }
-
- my $q = RT::Queue->new($RT::SystemUser);
- $q->Load($id);
- unless ($q->id) {
- return undef;
- }
- return (1);
-
-
+ return undef unless defined $id;
+ # 0 means "Global" null would _not_ be ok.
+ return 1 if $id eq '0';
+
+ my $q = RT::Queue->new( $RT::SystemUser );
+ $q->Load( $id );
+ return undef unless $q->id;
+ return 1;
}
@@ -580,12 +488,49 @@
sub IsSelectionType {
my $self = shift;
- $self->Type =~ /(?:Select|Combobox)/;
+ my $type = @_? shift : $self->Type;
+ return undef unless $type;
+
+ $type =~ /(?:Select|Combobox)/;
}
# }}}
+=head2 IsExternalValues
+
+=cut
+
+sub IsExternalValues {
+ my $self = shift;
+ my $selectable = $self->IsSelectionType( @_ );
+ return $selectable unless $selectable;
+
+ my $class = $self->ValuesClass;
+ return 0 if $class eq 'RT::CustomFieldValues';
+ return 1;
+}
+
+sub ValuesClass {
+ my $self = shift;
+ return '' unless $self->IsSelectionType;
+
+ my $class = $self->FirstAttribute( 'ValuesClass' );
+ $class = $class->Content if $class;
+ return $class || 'RT::CustomFieldValues';
+}
+
+sub SetValuesClass {
+ my $self = shift;
+ my $class = shift || 'RT::CustomFieldValues';
+
+ if( $class eq 'RT::CustomFieldValues' ) {
+ return $self->DeleteAttribute( 'ValuesClass' );
+ }
+ return $self->SetAttribute( Name => 'ValuesClass', Content => $class );
+}
+
+
=head2 FriendlyType [TYPE, MAX_VALUES]
Returns a localized human-readable version of the custom field type.
@@ -600,7 +545,7 @@
my $max = @_ ? shift : $self->MaxValues;
if (my $friendly_type = $FieldTypes{$type}[$max>2 ? 2 : $max]) {
- return ( $self->loc( $friendly_type, $max ) );
+ return ( $self->loc( $friendly_type, $max ) );
}
else {
return ( $self->loc( $type ) );
@@ -635,11 +580,11 @@
my $type = shift;
if ($type =~ s/(?:Single|Multiple)$//) {
- $RT::Logger->warning( "Prefix 'Single' and 'Multiple' to Type deprecated, use MaxValues instead at (". join(":",caller).")");
+ $RT::Logger->warning( "Prefix 'Single' and 'Multiple' to Type deprecated, use MaxValues instead at (". join(":",caller).")");
}
if( $FieldTypes{$type}) {
- return(1);
+ return 1;
}
else {
return undef;
@@ -651,8 +596,8 @@
my $self = shift;
my $type = shift;
if ($type =~ s/(?:(Single)|Multiple)$//) {
- $RT::Logger->warning("'Single' and 'Multiple' on SetType deprecated, use SetMaxValues instead at (". join(":",caller).")");
- $self->SetMaxValues($1 ? 1 : 0);
+ $RT::Logger->warning("'Single' and 'Multiple' on SetType deprecated, use SetMaxValues instead at (". join(":",caller).")");
+ $self->SetMaxValues($1 ? 1 : 0);
}
$self->SUPER::SetType($type);
}
@@ -746,8 +691,8 @@
my $right = shift;
return $self->CurrentUser->HasRight(
- Object => $self,
- Right => $right,
+ Object => $self,
+ Right => $right,
);
}
@@ -783,7 +728,7 @@
# we need to do the rights check
unless ( $self->id && $self->CurrentUserHasRight( 'SeeCustomField') ) {
- return (undef);
+ return (undef);
}
return ( $self->__Value($field) );
@@ -845,10 +790,10 @@
my $self = shift;
my $lookup = shift;
if ($lookup ne $self->LookupType) {
- # Okay... We need to invalidate our existing relationships
- my $ObjectCustomFields = RT::ObjectCustomFields->new($self->CurrentUser);
- $ObjectCustomFields->LimitToCustomField($self->Id);
- $_->Delete foreach @{$ObjectCustomFields->ItemsArrayRef};
+ # Okay... We need to invalidate our existing relationships
+ my $ObjectCustomFields = RT::ObjectCustomFields->new($self->CurrentUser);
+ $ObjectCustomFields->LimitToCustomField($self->Id);
+ $_->Delete foreach @{$ObjectCustomFields->ItemsArrayRef};
}
$self->SUPER::SetLookupType($lookup);
}
@@ -963,7 +908,7 @@
my $id = $object->Id || 0;
unless (index($self->LookupType, ref($object)) == 0) {
- return ( 0, $self->loc('Object type mismatch') );
+ return ( 0, $self->loc('Object type mismatch') );
}
unless ( $object->CurrentUserHasRight('AssignCustomFields') ) {
@@ -1139,14 +1084,14 @@
my $oldval = RT::ObjectCustomFieldValue->new($self->CurrentUser);
if (my $id = $args{'Id'}) {
- $oldval->Load($id);
+ $oldval->Load($id);
}
unless ($oldval->id) {
- $oldval->LoadByObjectContentAndCustomField(
- Object => $args{'Object'},
- Content => $args{'Content'},
- CustomField => $self->Id,
- );
+ $oldval->LoadByObjectContentAndCustomField(
+ Object => $args{'Object'},
+ Content => $args{'Content'},
+ CustomField => $self->Id,
+ );
}
More information about the Rt-commit
mailing list