import rt 3.8.7
[freeside.git] / rt / lib / RT / ObjectCustomField_Overlay.pm
index c4eb437..e95161b 100644 (file)
@@ -1,8 +1,8 @@
 # BEGIN BPS TAGGED BLOCK {{{
 # 
 # COPYRIGHT:
-#  
-# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC 
+# 
+# This software is Copyright (c) 1996-2009 Best Practical Solutions, LLC
 #                                          <jesse@bestpractical.com>
 # 
 # (Except where explicitly superseded by other copyright notices)
 # those contributions and any derivatives thereof.
 # 
 # END BPS TAGGED BLOCK }}}
+
 package RT::ObjectCustomField;
 
 use strict;
+use warnings;
 no warnings qw(redefine);
 
 sub Create {
     my $self = shift;
-    my %args = ( 
-                CustomField => '0',
-                ObjectId => '0',
-               SortOrder => undef,
-                 @_);
+    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;
+    }
 
-    if (!defined $args{SortOrder}) {
-       my $CF = $self->CustomFieldObj($args{'CustomField'});
-       my $ObjectCFs = RT::ObjectCustomFields->new($self->CurrentUser);
-       $ObjectCFs->LimitToObjectId($args{'ObjectId'});
-       $ObjectCFs->LimitToLookupType($CF->LookupType);
+    #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;
+    }
 
-       $args{SortOrder} = $ObjectCFs->Count + 1;
+    unless ( defined $args{'SortOrder'} ) {
+        my $ObjectCFs = RT::ObjectCustomFields->new( $RT::SystemUser );
+        $ObjectCFs->LimitToObjectId( $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;
+        }
     }
 
-    $self->SUPER::Create(
-                         CustomField => $args{'CustomField'},
-                         ObjectId => $args{'ObjectId'},
-                         SortOrder => $args{'SortOrder'},
-                    );
+    return $self->SUPER::Create(
+        CustomField => $args{'CustomField'},
+        ObjectId    => $args{'ObjectId'},
+        SortOrder   => $args{'SortOrder'},
+    );
 }
 
 sub Delete {
@@ -84,9 +107,9 @@ sub Delete {
     # 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);
+        my $this_order = $OCF->SortOrder;
+        next if $this_order <= $sort_order; 
+        $OCF->SetSortOrder($this_order - 1);
     }
 
     $self->SUPER::Delete;
@@ -95,8 +118,8 @@ sub Delete {
 sub CustomFieldObj {
     my $self = shift;
     my $id = shift || $self->CustomField;
-    my $CF = RT::CustomField->new($self->CurrentUser);
-    $CF->Load($id) or die "Cannot load CustomField $id";
+    my $CF = RT::CustomField->new( $self->CurrentUser );
+    $CF->Load( $id );
     return $CF;
 }