X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=rt%2Flib%2FRT%2FObjectCustomField.pm;h=b21543bfa007bb56c0137562fd09b41df22b8cd3;hp=e7f350a5af4135034ab863f0cf57ac45d60eedfa;hb=9aee669886202be7035e6c6049fc71bc99dd3013;hpb=7588a4ac90a9b07c08a3107cd1107d773be1c991 diff --git a/rt/lib/RT/ObjectCustomField.pm b/rt/lib/RT/ObjectCustomField.pm index e7f350a5a..b21543bfa 100644 --- a/rt/lib/RT/ObjectCustomField.pm +++ b/rt/lib/RT/ObjectCustomField.pm @@ -2,7 +2,7 @@ # # COPYRIGHT: # -# This software is Copyright (c) 1996-2013 Best Practical Solutions, LLC +# This software is Copyright (c) 1996-2015 Best Practical Solutions, LLC # # # (Except where explicitly superseded by other copyright notices) @@ -46,92 +46,29 @@ # # END BPS TAGGED BLOCK }}} -package RT::ObjectCustomField; - use strict; use warnings; +package RT::ObjectCustomField; +use base 'RT::Record::AddAndSort'; use RT::CustomField; -use base 'RT::Record'; +use RT::ObjectCustomFields; sub Table {'ObjectCustomFields'} - - - - - -sub Create { +sub ObjectCollectionClass { my $self = shift; - my %args = ( - CustomField => 0, - ObjectId => 0, - SortOrder => undef, - @_ - ); - - my $cf = $self->CustomFieldObj( $args{'CustomField'} ); - unless ( $cf->id ) { - $RT::Logger->error("Couldn't load '$args{'CustomField'}' custom field"); - return 0; - } - - #XXX: Where is ACL check for 'AssignCustomFields'? - - my $ObjectCFs = RT::ObjectCustomFields->new($self->CurrentUser); - $ObjectCFs->LimitToObjectId( $args{'ObjectId'} ); - $ObjectCFs->LimitToCustomField( $cf->id ); - $ObjectCFs->LimitToLookupType( $cf->LookupType ); - if ( my $first = $ObjectCFs->First ) { - $self->Load( $first->id ); - return $first->id; - } - - unless ( defined $args{'SortOrder'} ) { - my $ObjectCFs = RT::ObjectCustomFields->new( RT->SystemUser ); - $ObjectCFs->LimitToObjectId( $args{'ObjectId'} ); - $ObjectCFs->LimitToObjectId( 0 ) if $args{'ObjectId'}; - $ObjectCFs->LimitToLookupType( $cf->LookupType ); - $ObjectCFs->OrderBy( FIELD => 'SortOrder', ORDER => 'DESC' ); - if ( my $first = $ObjectCFs->First ) { - $args{'SortOrder'} = $first->SortOrder + 1; - } else { - $args{'SortOrder'} = 0; - } - } - - return $self->SUPER::Create( - CustomField => $args{'CustomField'}, - ObjectId => $args{'ObjectId'}, - SortOrder => $args{'SortOrder'}, - ); -} - -sub Delete { - my $self = shift; - - my $ObjectCFs = RT::ObjectCustomFields->new($self->CurrentUser); - $ObjectCFs->LimitToObjectId($self->ObjectId); - $ObjectCFs->LimitToLookupType($self->CustomFieldObj->LookupType); - - # Move everything below us up - my $sort_order = $self->SortOrder; - while (my $OCF = $ObjectCFs->Next) { - my $this_order = $OCF->SortOrder; - next if $this_order <= $sort_order; - $OCF->SetSortOrder($this_order - 1); - } - - $self->SUPER::Delete; + my %args = (@_); + return $args{'CustomField'}->CollectionClassFromLookupType; } +# XXX: Where is ACL check when we create a record? =head2 CustomFieldObj Returns the CustomField Object which has the id returned by CustomField - =cut sub CustomFieldObj { @@ -154,148 +91,17 @@ sub CustomFieldObj { return $CF; } -=head2 Sorting custom fields applications - -Custom fields sorted on multiple layers. First of all custom -fields with different lookup type are sorted independently. All -global custom fields have fixed order for all objects, but you -can insert object specific custom fields between them. Object -specific custom fields can be applied to several objects and -be on different place. For example you have GCF1, GCF2, LCF1, -LCF2 and LCF3 that applies to tickets. You can place GCF2 -above GCF1, but they will be in the same order in all queues. -However, LCF1 and other local can be placed at any place -for particular queue: above global, between them or below. - -=head3 MoveUp - -Moves custom field up. See . - -=cut - -sub MoveUp { - my $self = shift; - - my $ocfs = RT::ObjectCustomFields->new( $self->CurrentUser ); - - my $oid = $self->ObjectId; - $ocfs->LimitToObjectId( $oid ); - if ( $oid ) { - $ocfs->LimitToObjectId( 0 ); - } - - my $cf = $self->CustomFieldObj; - $ocfs->LimitToLookupType( $cf->LookupType ); - - $ocfs->Limit( FIELD => 'SortOrder', OPERATOR => '<', VALUE => $self->SortOrder ); - $ocfs->OrderByCols( { FIELD => 'SortOrder', ORDER => 'DESC' } ); - - my @above = ($ocfs->Next, $ocfs->Next); - unless ($above[0]) { - return (0, "Can not move up. It's already at the top"); - } - - my $new_sort_order; - if ( $above[0]->ObjectId == $self->ObjectId ) { - $new_sort_order = $above[0]->SortOrder; - my ($status, $msg) = $above[0]->SetSortOrder( $self->SortOrder ); - unless ( $status ) { - return (0, "Couldn't move custom field"); - } - } - elsif ( $above[1] && $above[0]->SortOrder == $above[1]->SortOrder + 1 ) { - my $move_ocfs = RT::ObjectCustomFields->new( RT->SystemUser ); - $move_ocfs->LimitToLookupType( $cf->LookupType ); - $move_ocfs->Limit( - FIELD => 'SortOrder', - OPERATOR => '>=', - VALUE => $above[0]->SortOrder, - ); - $move_ocfs->OrderByCols( { FIELD => 'SortOrder', ORDER => 'DESC' } ); - while ( my $record = $move_ocfs->Next ) { - my ($status, $msg) = $record->SetSortOrder( $record->SortOrder + 1 ); - unless ( $status ) { - return (0, "Couldn't move custom field"); - } - } - $new_sort_order = $above[0]->SortOrder; - } else { - $new_sort_order = $above[0]->SortOrder - 1; - } - - my ($status, $msg) = $self->SetSortOrder( $new_sort_order ); - unless ( $status ) { - return (0, "Couldn't move custom field"); - } - - return (1,"Moved custom field up"); -} - -=head3 MoveDown - -Moves custom field down. See . - -=cut - -sub MoveDown { +sub Neighbors { my $self = shift; + my %args = @_; - my $ocfs = RT::ObjectCustomFields->new( $self->CurrentUser ); - - my $oid = $self->ObjectId; - $ocfs->LimitToObjectId( $oid ); - if ( $oid ) { - $ocfs->LimitToObjectId( 0 ); - } - - my $cf = $self->CustomFieldObj; - $ocfs->LimitToLookupType( $cf->LookupType ); - - $ocfs->Limit( FIELD => 'SortOrder', OPERATOR => '>', VALUE => $self->SortOrder ); - $ocfs->OrderByCols( { FIELD => 'SortOrder', ORDER => 'ASC' } ); - - my @below = ($ocfs->Next, $ocfs->Next); - unless ($below[0]) { - return (0, "Can not move down. It's already at the bottom"); - } - - my $new_sort_order; - if ( $below[0]->ObjectId == $self->ObjectId ) { - $new_sort_order = $below[0]->SortOrder; - my ($status, $msg) = $below[0]->SetSortOrder( $self->SortOrder ); - unless ( $status ) { - return (0, "Couldn't move custom field"); - } - } - elsif ( $below[1] && $below[0]->SortOrder + 1 == $below[1]->SortOrder ) { - my $move_ocfs = RT::ObjectCustomFields->new( RT->SystemUser ); - $move_ocfs->LimitToLookupType( $cf->LookupType ); - $move_ocfs->Limit( - FIELD => 'SortOrder', - OPERATOR => '<=', - VALUE => $below[0]->SortOrder, - ); - $move_ocfs->OrderByCols( { FIELD => 'SortOrder', ORDER => 'ASC' } ); - while ( my $record = $move_ocfs->Next ) { - my ($status, $msg) = $record->SetSortOrder( $record->SortOrder - 1 ); - unless ( $status ) { - return (0, "Couldn't move custom field"); - } - } - $new_sort_order = $below[0]->SortOrder; - } else { - $new_sort_order = $below[0]->SortOrder + 1; - } - - my ($status, $msg) = $self->SetSortOrder( $new_sort_order ); - unless ( $status ) { - return (0, "Couldn't move custom field"); - } - - return (1,"Moved custom field down"); + my $res = $self->CollectionClass->new( $self->CurrentUser ); + $res->LimitToLookupType( + ($args{'CustomField'} || $self->CustomFieldObj)->LookupType + ); + return $res; } - =head2 id Returns the current value of id. @@ -400,25 +206,56 @@ sub _CoreAccessible { { id => - {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, CustomField => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, ObjectId => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, + {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => ''}, SortOrder => - {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, write => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, Creator => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, Created => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, LastUpdatedBy => - {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, + {read => 1, auto => 1, sql_type => 4, length => 11, is_blob => 0, is_numeric => 1, type => 'int(11)', default => '0'}, LastUpdated => - {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, + {read => 1, auto => 1, sql_type => 11, length => 0, is_blob => 0, is_numeric => 0, type => 'datetime', default => ''}, } }; +sub FindDependencies { + my $self = shift; + my ($walker, $deps) = @_; + + $self->SUPER::FindDependencies($walker, $deps); + + $deps->Add( out => $self->CustomFieldObj ); + + if ($self->ObjectId) { + my $class = $self->CustomFieldObj->RecordClassFromLookupType; + my $obj = $class->new( $self->CurrentUser ); + $obj->Load( $self->ObjectId ); + $deps->Add( out => $obj ); + } +} + +sub Serialize { + my $self = shift; + my %args = (@_); + my %store = $self->SUPER::Serialize(@_); + + if ($store{ObjectId}) { + my $class = $self->CustomFieldObj->RecordClassFromLookupType; + my $obj = $class->new( RT->SystemUser ); + $obj->Load( $store{ObjectId} ); + $store{ObjectId} = \($obj->UID); + } + return %store; +} + + RT::Base->_ImportOverlays(); 1;