[Rt-commit] r16395 - in rt/branches/3.999-DANGEROUS: lib/RT/Action

sunnavy at bestpractical.com sunnavy at bestpractical.com
Mon Oct 20 12:25:36 EDT 2008


Author: sunnavy
Date: Mon Oct 20 12:25:36 2008
New Revision: 16395

Added:
   rt/branches/3.999-DANGEROUS/lib/RT/Action/EditTicketCFs.pm
Modified:
   rt/branches/3.999-DANGEROUS/   (props changed)

Log:
 r17225 at sunnavys-mb:  sunnavy | 2008-10-21 00:20:06 +0800
 added EditTicketCFs action


Added: rt/branches/3.999-DANGEROUS/lib/RT/Action/EditTicketCFs.pm
==============================================================================
--- (empty file)
+++ rt/branches/3.999-DANGEROUS/lib/RT/Action/EditTicketCFs.pm	Mon Oct 20 12:25:36 2008
@@ -0,0 +1,141 @@
+package RT::Action::EditTicketCFs;
+use strict;
+use warnings;
+
+use constant report_detailed_messages => 1;
+
+use Jifty::Param::Schema;
+use Jifty::Action schema {};
+
+sub available_values {
+    my $self = shift;
+    my $id   = shift;
+    next unless $id =~ /^\d+$/;
+    my $cf = RT::Model::CustomField->new;
+    $cf->load($id);
+    my $values = $cf->values;
+
+    my $available = [];
+    if ( $cf->type eq 'Select' ) {
+        push @$available, { value => '', display => '(no value)' };
+    }
+
+    while ( my $v = $values->next ) {
+        push @$available,
+          {
+            value   => $v->name,
+            display => $v->name,
+          };
+    }
+    return $available;
+}
+
+=head2 take_action
+
+=cut
+
+sub take_action {
+    my $self = shift;
+
+    $self->result->content->{'detailed_messages'} ||= {};
+    if ( $self->argument_value('id') ) {
+        my $ticket =
+          RT::Model::Ticket->new( current_user => Jifty->web->current_user );
+        $ticket->load( $self->argument_value('id') );
+
+        my $args = $self->argument_values;
+
+        # deal with files to be deleted
+        my @to_be_deleted = grep { /delete_/ && $args->{$_} } keys %$args;
+        for my $tbd (@to_be_deleted) {
+            if ( $tbd =~ /delete_(\d+)/ ) {
+                my $id = $1;
+                my $ocfv =
+                  RT::Model::ObjectCustomFieldValue->new(
+                    current_user => Jifty->web->current_user );
+                $ocfv->load_by_id($id);
+                $ocfv->delete;
+            }
+        }
+
+        # deal with other types
+        my @cfids = grep { /^\d+$/ } keys %$args;
+
+        for my $cfid (@cfids) {
+            my $cf =
+              RT::Model::CustomField->new(
+                current_user => Jifty->web->current_user );
+            $cf->load_by_id($cfid);
+
+            my $values     = $ticket->custom_field_values( $cf->id );
+            my $new_values = $args->{$cfid};
+
+            if ( $cf->type =~ /text/i ) {
+                $new_values =~ s/\r+\n/\n/g;
+                $new_values =~ s/^\s+//g;
+                $new_values =~ s/\s+$//g;
+                $ticket->add_custom_field_value(
+                    field => $cfid,
+                    value => $new_values,
+                );
+            }
+            elsif ( $cf->type eq 'Binary' ) {
+                next unless $new_values;
+                my $cgi_object  = Jifty->handler->cgi;
+                my $upload_info = $cgi_object->uploadInfo($new_values);
+                my $filename    = "$new_values";
+                $filename =~ s#^.*[\\/]##;
+                binmode($new_values);
+
+                $ticket->add_custom_field_value(
+                    field         => $cfid,
+                    value         => $filename,
+                    large_content => do { local $/; scalar <$new_values> },
+                    content_type  => $upload_info->{'Content-Type'},
+                );
+            }
+            else {
+
+               # now we deal with values like 'two', 'three' or [ 'foo', 'bar' ]
+                unless ( ref $new_values ) {
+                    $new_values = [
+                        grep length,
+                        map {
+                            s/\r+\n/\n/g;
+                            s/^\s+//;
+                            s/\s+$//;
+                            $_;
+                          }
+                          grep defined,
+                        split /\r*\n/,
+                        $new_values
+                    ];
+                }
+
+                if ($values) {
+                    my $delete_flag;
+                    foreach my $old_cf ( @{ $values->items_array_ref } ) {
+                        if (   !$delete_flag
+                            && @$new_values
+                            && $old_cf->content eq $new_values->[0] )
+                        {
+                            shift @$new_values;
+                            next;
+                        }
+                        $delete_flag ||= 1;
+                        $old_cf->delete;
+                    }
+                }
+                for my $new_value (@$new_values) {
+                    $ticket->add_custom_field_value(
+                        field => $cfid,
+                        value => $new_value,
+                    );
+                }
+            }
+        }
+    }
+    return 1;
+}
+
+1;


More information about the Rt-commit mailing list