[Rt-commit] r6049 - in rt/branches/QUEBEC-EXPERIMENTAL: lib/RT/Interface

ruz at bestpractical.com ruz at bestpractical.com
Tue Sep 26 20:15:13 EDT 2006


Author: ruz
Date: Tue Sep 26 20:15:12 2006
New Revision: 6049

Modified:
   rt/branches/QUEBEC-EXPERIMENTAL/   (props changed)
   rt/branches/QUEBEC-EXPERIMENTAL/lib/RT/Interface/Web.pm

Log:
 r3696 at cubic-pc (orig r5856):  ruz | 2006-09-04 23:17:14 +0400
 * split function ProcessObjectCustomFieldUpdates into two
 * call RedoSearch on object's custom fields values collection
   after {Add,Delete}CustomFieldValues operations


Modified: rt/branches/QUEBEC-EXPERIMENTAL/lib/RT/Interface/Web.pm
==============================================================================
--- rt/branches/QUEBEC-EXPERIMENTAL/lib/RT/Interface/Web.pm	(original)
+++ rt/branches/QUEBEC-EXPERIMENTAL/lib/RT/Interface/Web.pm	Tue Sep 26 20:15:12 2006
@@ -1142,161 +1142,174 @@
     # Build up a list of objects that we want to work with
     my %custom_fields_to_mod;
     foreach my $arg ( keys %$ARGSRef ) {
-        if ( $arg =~ /^Object-([\w:]+)-(\d*)-CustomField-(\d+)-/ ) {
-            # For each of those objects, find out what custom fields we want to work with.
-            $custom_fields_to_mod{$1}{$2 || $args{'Object'}->Id}{$3} = 1;
-        }
+        # format: Object-<object class>-<object id>-CustomField-<CF id>-<commands>
+        next unless $arg =~ /^Object-([\w:]+)-(\d*)-CustomField-(\d+)-(.*)$/;
+
+        # For each of those objects, find out what custom fields we want to work with.
+        $custom_fields_to_mod{ $1 }{ $2 || 0 }{ $3 }{ $4 } = $ARGSRef->{ $arg };
     }
 
     # For each of those objects
     foreach my $class ( keys %custom_fields_to_mod ) {
         foreach my $id ( keys %{$custom_fields_to_mod{$class}} ) {
             my $Object = $args{'Object'};
-            if (!$Object or ref($Object) ne $class or $Object->id != $id) {
-                $Object = $class->new( $session{'CurrentUser'} );
-                $Object->Load($id);
-            }
-
-            # For each custom field  
-            foreach my $cf ( keys %{ $custom_fields_to_mod{$class}{$id} } ) {
-                my $CustomFieldObj = RT::CustomField->new($session{'CurrentUser'});
-                $CustomFieldObj->LoadById($cf);
-
-                foreach my $arg ( keys %{$ARGSRef} ) {
-                    # Only interested in args for the current CF:
-                    next unless ( $arg =~ /^Object-$class-(?:$id)?-CustomField-$cf-/ );
-
-                    # since http won't pass in a form element with a null value, we need
-                    # to fake it
-                    if ($arg =~ /^(.*?)-Values-Magic$/ ) {
-                        # We don't care about the magic, if there's really a values element;
-                        next if ($ARGSRef->{$1.'-Value'} || $ARGSRef->{$1.'-Values'}) ;
-
-                        # "Empty" values does not mean anything for Image and Binary fields
-                        next if $CustomFieldObj->Type =~ /^(?:Image|Binary)$/;
-
-                        $arg = $1."-Values";
-                        $ARGSRef->{$1."-Values"} = undef;
-                    
-                    }
-                    my @values = ();
-                    if (ref( $ARGSRef->{$arg} ) eq 'ARRAY' ) {
-                        @values = @{ $ARGSRef->{$arg} };
-                    } elsif ($CustomFieldObj->Type =~ /text/i) { # Both Text and Wikitext
-                        @values = ($ARGSRef->{$arg});
-                    } else {
-                        @values = split /\n/, $ARGSRef->{$arg};
-                    }
-                    
-                    if ( ($CustomFieldObj->Type eq 'Freeform' 
-                          && ! $CustomFieldObj->SingleValue) ||
-                          $CustomFieldObj->Type =~ /text/i) {
-                        foreach my $val (@values) {
-                            $val =~ s/\r//g;
-                        }
-                    }
-
-                    if ( ( $arg =~ /-AddValue$/ ) || ( $arg =~ /-Value$/ ) ) {
-                        foreach my $value (@values) {
-                            next unless length($value);
-                            my ( $val, $msg ) = $Object->AddCustomFieldValue(
-                                Field => $cf,
-                                Value => $value
-                            );
-                            push ( @results, $msg );
-                        }
-                    }
-                    elsif ( $arg =~ /-Upload$/ ) {
-                        my $value_hash = _UploadedFile($arg) or next;
-
-                        my ( $val, $msg ) = $Object->AddCustomFieldValue(
-                            %$value_hash,
-                            Field => $cf,
-                        );
-                        push ( @results, $msg );
-                    }
-                    elsif ( $arg =~ /-DeleteValues$/ ) {
-                        foreach my $value (@values) {
-                            next unless length($value);
-                            my ( $val, $msg ) = $Object->DeleteCustomFieldValue(
-                                Field => $cf,
-                                Value => $value
-                            );
-                            push ( @results, $msg );
-                        }
-                    }
-                    elsif ( $arg =~ /-DeleteValueIds$/ ) {
-                        foreach my $value (@values) {
-                            next unless length($value);
-                            my ( $val, $msg ) = $Object->DeleteCustomFieldValue(
-                                Field => $cf,
-                                ValueId => $value,
-                            );
-                            push ( @results, $msg );
-                        }
-                    }
-                    elsif ( $arg =~ /-Values$/ and !$CustomFieldObj->Repeated) {
-                        my $cf_values = $Object->CustomFieldValues($cf);
-
-                        my %values_hash;
-                        foreach my $value (@values) {
-                            next unless length($value);
-
-                            # build up a hash of values that the new set has
-                            $values_hash{$value} = 1;
-
-                            unless ( $cf_values->HasEntry($value) ) {
-                                my ( $val, $msg ) = $Object->AddCustomFieldValue(
-                                    Field => $cf,
-                                    Value => $value
-                                );
-                                push ( @results, $msg );
-                            }
-
-                        }
-                        while ( my $cf_value = $cf_values->Next ) {
-                            unless ( $values_hash{ $cf_value->Content } == 1 ) {
-                                my ( $val, $msg ) = $Object->DeleteCustomFieldValue(
-                                    Field => $cf,
-                                    Value => $cf_value->Content
-                                );
-                                push ( @results, $msg);
-
-                            }
-                        }
-                    }
-                    elsif ( $arg =~ /-Values$/ ) {
-                        my $cf_values = $Object->CustomFieldValues($cf);
-
-                        # keep everything up to the point of difference, delete the rest
-                        my $delete_flag;
-                        foreach my $old_cf (@{$cf_values->ItemsArrayRef}) {
-                            if (!$delete_flag and @values and $old_cf->Content eq $values[0]) {
-                                shift @values;
-                                next;
-                            }
-
-                            $delete_flag ||= 1;
-                            $old_cf->Delete;
-                        }
-
-                        # now add/replace extra things, if any
-                        foreach my $value (@values) {
-                            my ( $val, $msg ) = $Object->AddCustomFieldValue(
-                                Field => $cf,
-                                Value => $value
-                            );
-                            push ( @results, $msg );
-                        }
-                    }
-                    else {
-                        push ( @results, loc("User asked for an unknown update type for custom field [_1] for [_2] object #[_3]", $cf->Name, $class, $Object->id ) );
-                    }
+            $Object = $class->new( $session{'CurrentUser'} )
+                unless $Object && ref $Object eq $class;
+
+            $Object->Load( $id ) unless ($Object->id || 0) == $id;
+            unless ( $Object->id ) {
+                $RT::Logger->warning("Couldn't load object $class #$id");
+                next;
+            }
+
+            foreach my $cf ( keys %{ $custom_fields_to_mod{ $class }{ $id } } ) {
+                my $CustomFieldObj = RT::CustomField->new( $session{'CurrentUser'} );
+                $CustomFieldObj->LoadById( $cf );
+                unless ( $CustomFieldObj->id ) {
+                    $RT::Logger->warning("Couldn't load custom field #$id");
+                    next;
                 }
+                push @results, _ProcessObjectCustomFieldUpdates(
+                    Prefix      => "Object-$class-$id-CustomField-$cf-",
+                    Object      => $Object,
+                    CustomField => $CustomFieldObj,
+                    ARGS        => $custom_fields_to_mod{$class}{$id}{$cf},
+                );
             }
-            return (@results);
         }
     }
+    return @results;
+}
+
+sub _ProcessObjectCustomFieldUpdates {
+    my %args = @_;
+    my $cf = $args{'CustomField'};
+    my $cf_type = $cf->Type;
+
+    my @results;
+    foreach my $arg ( keys %{ $args{'ARGS'} } ) {
+
+        # since http won't pass in a form element with a null value, we need
+        # to fake it
+        if ( $arg eq 'Values-Magic' ) {
+            # We don't care about the magic, if there's really a values element;
+            next if $args{'ARGS'}->{'Value'} || $args{'ARGS'}->{'Values'};
+
+            # "Empty" values does not mean anything for Image and Binary fields
+            next if $cf_type =~ /^(?:Image|Binary)$/;
+
+            $arg = 'Values';
+            $args{'ARGS'}->{'Values'} = undef;
+        }
+
+        my @values = ();
+        if ( ref $args{'ARGS'}->{ $arg } eq 'ARRAY' ) {
+            @values = @{ $args{'ARGS'}->{$arg} };
+        } elsif ( $cf_type =~ /text/i ) { # Both Text and Wikitext
+            @values = ($args{'ARGS'}->{$arg});
+        } else {
+            @values = split /\n/, $args{'ARGS'}->{ $arg };
+        }
+        
+        if ( ( $cf_type eq 'Freeform' && !$cf->SingleValue ) || $cf_type =~ /text/i ) {
+            s/\r//g foreach @values;
+        }
+        @values = grep defined && $_ ne '', @values;
+
+        if ( $arg eq 'AddValue' || $arg eq 'Value' ) {
+            foreach my $value (@values) {
+                my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue(
+                    Field => $cf->id,
+                    Value => $value
+                );
+                push ( @results, $msg );
+            }
+        }
+        elsif ( $arg eq 'Upload' ) {
+            my $value_hash = _UploadedFile( $args{'Prefix'} . $arg ) or next;
+            my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue(
+                %$value_hash,
+                Field => $cf,
+            );
+            push ( @results, $msg );
+        }
+        elsif ( $arg eq 'DeleteValues' ) {
+            foreach my $value ( @values ) {
+                my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue(
+                    Field => $cf,
+                    Value => $value,
+                );
+                push ( @results, $msg );
+            }
+        }
+        elsif ( $arg eq 'DeleteValueIds' ) {
+            foreach my $value ( @values ) {
+                my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue(
+                    Field   => $cf,
+                    ValueId => $value,
+                );
+                push ( @results, $msg );
+            }
+        }
+        elsif ( $arg eq 'Values' && !$cf->Repeated ) {
+            my $cf_values = $args{'Object'}->CustomFieldValues( $cf->id );
+
+            my %values_hash;
+            foreach my $value ( @values ) {
+                # build up a hash of values that the new set has
+                $values_hash{$value} = 1;
+                next if $cf_values->HasEntry( $value );
+
+                my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue(
+                    Field => $cf,
+                    Value => $value
+                );
+                push ( @results, $msg );
+            }
+
+            $cf_values->RedoSearch;
+            while ( my $cf_value = $cf_values->Next ) {
+                next if $values_hash{ $cf_value->Content };
+
+                my ( $val, $msg ) = $args{'Object'}->DeleteCustomFieldValue(
+                    Field => $cf,
+                    Value => $cf_value->Content
+                );
+                push ( @results, $msg);
+            }
+        }
+        elsif ( $arg eq 'Values' ) {
+            my $cf_values = $args{'Object'}->CustomFieldValues( $cf->id );
+
+            # keep everything up to the point of difference, delete the rest
+            my $delete_flag;
+            foreach my $old_cf (@{$cf_values->ItemsArrayRef}) {
+                if (!$delete_flag and @values and $old_cf->Content eq $values[0]) {
+                    shift @values;
+                    next;
+                }
+
+                $delete_flag ||= 1;
+                $old_cf->Delete;
+            }
+
+            # now add/replace extra things, if any
+            foreach my $value ( @values ) {
+                my ( $val, $msg ) = $args{'Object'}->AddCustomFieldValue(
+                    Field => $cf,
+                    Value => $value
+                );
+                push ( @results, $msg );
+            }
+        }
+        else {
+            push ( @results, loc("User asked for an unknown update type"
+                ." for custom field [_1] for [_2] object #[_3]",
+                $cf->Name, ref $args{'Object'}, $args{'Object'}->id )
+            );
+        }
+    }
+    return @results;
 }
 
 # {{{ sub ProcessTicketWatchers


More information about the Rt-commit mailing list