[Rt-commit] rt branch, 4.2/web-attachs-processing, updated. rt-3.9.7-1234-gcb5ff36

Ruslan Zakirov ruz at bestpractical.com
Sat Jan 22 09:50:20 EST 2011


The branch, 4.2/web-attachs-processing has been updated
       via  cb5ff367d24a7bd6f25f01f882f53a453de173ad (commit)
       via  1c705e20c4b6f8de4573ff396b85debc1785e96d (commit)
       via  6710d8b81a21227bf247389eaaa4a1d90fdfcb98 (commit)
       via  f468779e3681c05f715308cd81ddc7a51a062496 (commit)
       via  8a3c2774b4733c4f2b18536e31827989dc6e5cdb (commit)
       via  06a5b1acc5b8e07d364b9a600902d30d2a903812 (commit)
       via  60081ba2970bfd5cb05f66f4e2dced673abd3332 (commit)
       via  688c3be3225ed9cbb7e9de22d7e8b33b99bfb70b (commit)
      from  41c47e09eedd22f046b8dc5c0cb45b166730cbff (commit)

Summary of changes:
 lib/RT/Interface/Web.pm                   |   70 +++++++++++++++----
 share/html/Search/Bulk.html               |   37 ++--------
 share/html/SelfService/Display.html       |  111 +++++++----------------------
 share/html/Ticket/Create.html             |   24 +------
 share/html/Ticket/Display.html            |   11 +--
 share/html/Ticket/Elements/AddAttachments |    2 +-
 share/html/Ticket/ModifyAll.html          |   33 +--------
 share/html/Ticket/Update.html             |   25 +------
 share/html/m/ticket/create                |   34 ++-------
 share/html/m/ticket/reply                 |   28 +-------
 share/html/m/ticket/show                  |    7 +--
 11 files changed, 107 insertions(+), 275 deletions(-)

- Log -----------------------------------------------------------------
commit 688c3be3225ed9cbb7e9de22d7e8b33b99bfb70b
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 02:34:55 2011 +0300

    process attachments in CreateTicket and UpdateMessage

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index 6062aca..34800b4 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -1178,18 +1178,21 @@ sub CreateTicket {
         Type    => $ARGS{'ContentType'},
     );
 
-    if ( $ARGS{'Attachments'} ) {
-        my $rv = $MIMEObj->make_multipart;
-        $RT::Logger->error("Couldn't make multipart message")
-            if !$rv || $rv !~ /^(?:DONE|ALREADY)$/;
+    my @attachments;
+    if ( my $tmp = $session{'Attachments'}{ $ARGS{'Token'} || '' } ) {
+        push @attachments, grep $_, values %$tmp;
 
-        foreach ( values %{ $ARGS{'Attachments'} } ) {
-            unless ($_) {
-                $RT::Logger->error("Couldn't add empty attachemnt");
-                next;
-            }
-            $MIMEObj->add_part($_);
-        }
+        delete $session{'Attachments'}{ $ARGS{'Token'} || '' }
+            unless $ARGS{'KeepAttachments'};
+        $session{'Attachment'} = $session{'Attachment'}
+            if @attachments;
+    }
+    if ( $ARGS{'Attachments'} ) {
+        push @attachments, grep $_, values %{ $ARGS{'Attachments'} };
+    }
+    if ( @attachments ) {
+        $MIMEObj->make_multipart;
+        $MIMEObj->add_part( $_ ) foreach @attachments;
     }
 
     foreach my $argument (qw(Encrypt Sign)) {
@@ -1414,9 +1417,21 @@ sub ProcessUpdateMessage {
         );
     }
 
-    if ( $args{ARGSRef}->{'UpdateAttachments'} ) {
+    my @attachments;
+    if ( my $tmp = $session{'Attachments'}{ $args{'ARGSRef'}{'Token'} || '' } ) {
+        push @attachments, grep $_, values %$tmp;
+
+        delete $session{'Attachments'}{ $args{'ARGSRef'}{'Token'} || '' }
+            unless $args{'KeepAttachments'};
+        $session{'Attachment'} = $session{'Attachment'}
+            if @attachments;
+    }
+    if ( $args{ARGSRef}{'UpdateAttachments'} ) {
+        push @attachments, grep $_, values %{ $args{ARGSRef}{'UpdateAttachments'} };
+    }
+    if ( @attachments ) {
         $Message->make_multipart;
-        $Message->add_part($_) foreach values %{ $args{ARGSRef}->{'UpdateAttachments'} };
+        $Message->add_part( $_ ) foreach @attachments;
     }
 
     if ( $args{ARGSRef}->{'AttachTickets'} ) {

commit 60081ba2970bfd5cb05f66f4e2dced673abd3332
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 02:36:38 2011 +0300

    ProcessAttachments function in ::Interface::Web

diff --git a/lib/RT/Interface/Web.pm b/lib/RT/Interface/Web.pm
index 34800b4..15b33e3 100644
--- a/lib/RT/Interface/Web.pm
+++ b/lib/RT/Interface/Web.pm
@@ -1518,7 +1518,36 @@ sub _ProcessUpdateMessageRecipients {
     }
 }
 
+sub ProcessAttachments {
+    my %args = (
+        ARGSRef => {},
+        Token   => '',
+        @_
+    );
+
+    my $token = $args{'Token'};
+
+    my $update_session = 0;
+
+    # deal with deleting uploaded attachments
+    if ( my $del = $args{'ARGSRef'}{'DeleteAttach'} ) {
+        delete $session{'Attachments'}{ $token }{ $_ }
+            foreach ref $del? @$del : ($del);
 
+        $update_session = 1;
+    }
+
+    # store the uploaded attachment in session
+    if ( my $new = $args{'ARGSRef'}{'Attach'} ) {            # attachment?
+        my $attachment = MakeMIMEEntity(
+            AttachmentFieldName => 'Attach'
+        );
+
+        my $file_path = Encode::decode_utf8("$new");
+        $session{'Attachments'}{ $token }{ $file_path } = $attachment;
+    }
+    $session{'Attachments'} = $session{'Attachments'} if $update_session;
+}
 
 =head2 MakeMIMEEntity PARAMHASH
 

commit 06a5b1acc5b8e07d364b9a600902d30d2a903812
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 02:37:38 2011 +0300

    use ProcessAttachments and shrink repeated code

diff --git a/share/html/Search/Bulk.html b/share/html/Search/Bulk.html
index c8ee552..ea946e6 100755
--- a/share/html/Search/Bulk.html
+++ b/share/html/Search/Bulk.html
@@ -230,30 +230,7 @@ my (@results);
 
 $ARGS{'Token'} ||= $Token ||= Digest::MD5::md5_hex( rand(1024) );
 
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
-    if ($key =~ m/^DeleteAttach-(.+)$/) {
-        delete $session{'Attachments'}{ $Token }{ $1 };
-    }
-    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ($ARGS{'Attach'}) {            # attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    # force session save
-    $session{'Attachments'} = $session{'Attachments'} || {};
-    $session{'Attachments'}{ $Token }{ $file_path } = $attachment;
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}{ $Token }} and $ARGS{'UpdateAttach'}) {
-    delete $session{'Attachments'}{ $Token };
-}
+ProcessAttachments( ARGSRef => \%ARGS, Token => $Token );
 
 $Page ||= 1;
 
@@ -310,10 +287,6 @@ my $cf_add_keys;
 @$cf_add_keys = grep { /^Bulk-Add-CustomField/ } keys %ARGS;
 
 unless ( $ARGS{'AddMoreAttach'} ) {
-    # Add session attachments if any to be processed by ProcessUpdateMessage
-    $ARGS{'UpdateAttachments'} = $session{'Attachments'}{ $Token }
-        if $session{'Attachments'}{ $Token };
-
     while ( my $Ticket = $Tickets->Next ) {
         next unless ( $ARGS{ "UpdateTicket" . $Ticket->Id } );
 
@@ -322,9 +295,10 @@ unless ( $ARGS{'AddMoreAttach'} ) {
         $queues{ $Ticket->QueueObj->Id }++;
 
         my @updateresults = ProcessUpdateMessage(
-                TicketObj => $Ticket,
-                ARGSRef   => \%ARGS,
-            );
+            TicketObj       => $Ticket,
+            ARGSRef         => \%ARGS,
+            KeepAttachments => 1,
+        );
 
         #Update the basics.
         my @basicresults =
@@ -417,7 +391,6 @@ unless ( $ARGS{'AddMoreAttach'} ) {
         @results = ( @results, @tempresults );
     }
 
-    # Cleanup WebUI
     delete $session{'Attachments'}{ $Token };
 }
 
diff --git a/share/html/Ticket/Create.html b/share/html/Ticket/Create.html
index 24c7561..f8085e7 100755
--- a/share/html/Ticket/Create.html
+++ b/share/html/Ticket/Create.html
@@ -375,29 +375,7 @@ my $ValidCFs = $m->comp(
 
 $ARGS{'Token'} ||= $Token ||= Digest::MD5::md5_hex( rand(1024) );
 
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
-    if ($key =~ m/^DeleteAttach-(.+)$/) {
-	delete $session{'Attachments'}{ $Token }{$1};
-    }
-    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ($ARGS{'Attach'}) {			# attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    $session{'Attachments'} = $session{'Attachments'} || {};
-    $session{'Attachments'}{ $Token }{ $file_path } = $attachment;
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}{$Token}} and $ARGS{'id'} eq 'new') {
-    delete $session{'Attachments'}{$Token};
-}
+ProcessAttachments( ARGSRef => \%ARGS, Token => $Token );
 
 my $checks_failure = 0;
 
diff --git a/share/html/Ticket/Display.html b/share/html/Ticket/Display.html
index 9bc3ad0..37f35cb 100755
--- a/share/html/Ticket/Display.html
+++ b/share/html/Ticket/Display.html
@@ -124,10 +124,7 @@ if ($ARGS{'id'} eq 'new') {
         Abort('You have no permission to create tickets in that queue.');
     }
 
-    ($TicketObj, @Actions) = CreateTicket(
-        Attachments => delete $session{'Attachments'}{ $ARGS{'Token'} || '' },
-        %ARGS,
-    );
+    ($TicketObj, @Actions) = CreateTicket( %ARGS );
     unless ( $TicketObj->CurrentUserHasRight('ShowTicket') ) {
         Abort("No permission to view newly created ticket #".$TicketObj->id.".");
     }
@@ -152,13 +149,11 @@ if ($ARGS{'id'} eq 'new') {
             ARGSRef => \%ARGS, 
             Actions => \@Actions);
     
-    $ARGS{UpdateAttachments} = delete $session{'Attachments'}{ $ARGS{'Token'} || '' };
-    push @Actions,
-        ProcessUpdateMessage(
+    push @Actions, ProcessUpdateMessage(
         ARGSRef   => \%ARGS,
         Actions   => \@Actions,
         TicketObj => $TicketObj,
-        );
+    );
 
     #Process status updates
     push @Actions, ProcessTicketWatchers(ARGSRef => \%ARGS, TicketObj => $TicketObj );
diff --git a/share/html/Ticket/Elements/AddAttachments b/share/html/Ticket/Elements/AddAttachments
index db4c659..d0a8b53 100644
--- a/share/html/Ticket/Elements/AddAttachments
+++ b/share/html/Ticket/Elements/AddAttachments
@@ -50,7 +50,7 @@
 <td>
 <&|/l&>Check box to delete</&><br />
 % foreach my $attach_name ( keys %$attachments ) {
-<input type="checkbox" class="checkbox" name="DeleteAttach-<%$attach_name%>" value="1" /><%$attach_name%><br />
+<input type="checkbox" class="checkbox" name="DeleteAttach" value="<% $attach_name %>" /><% $attach_name %><br />
 % } # end of foreach
 </td>
 </tr>
diff --git a/share/html/Ticket/ModifyAll.html b/share/html/Ticket/ModifyAll.html
index af703a4..436b7cf 100755
--- a/share/html/Ticket/ModifyAll.html
+++ b/share/html/Ticket/ModifyAll.html
@@ -154,31 +154,7 @@ $CanComment = 1 if ( $Ticket->CurrentUserHasRight('CommentOnTicket') or
 
 $ARGS{'Token'} ||= $Token ||= Digest::MD5::md5_hex( rand(1024) );
 
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
-    if ($key =~ m/^DeleteAttach-(.+)$/) {
-        delete $session{'Attachments'}{$Token}{$1};
-    }
-    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ($ARGS{'Attach'}) {            # attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    # force session save
-    $session{'Attachments'} = $session{'Attachments'} || {};
-    $session{'Attachments'}{ $Token }{ $file_path } = $attachment;
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}{$Token}} and $ARGS{'UpdateAttach'}) {
-    delete $session{'Attachments'}{ $Token };
-}
-
+ProcessAttachments( ARGSRef => \%ARGS, Token => $Token );
 
 $m->callback( TicketObj => $Ticket, ARGSRef => \%ARGS );
 my @results;
@@ -197,14 +173,7 @@ unless ($OnlySearchForPeople or $OnlySearchForGroup or $ARGS{'AddMoreAttach'} )
     push @results, ProcessTicketWatchers( TicketObj => $Ticket, ARGSRef => \%ARGS);
     push @results, ProcessObjectCustomFieldUpdates( Object => $Ticket, ARGSRef => \%ARGS);
     push @results, ProcessTicketDates( TicketObj => $Ticket, ARGSRef => \%ARGS);
-    
-    # Add session attachments if any to be processed by ProcessUpdateMessage
-    $ARGS{'UpdateAttachments'} = $session{'Attachments'}{ $Token }
-        if $session{'Attachments'}{ $Token };
     push @results, ProcessUpdateMessage( TicketObj => $Ticket, ARGSRef=>\%ARGS );
-    # Cleanup WebUI
-    delete $session{'Attachments'}{ $Token };
-
     push @results, ProcessTicketBasics( TicketObj => $Ticket, ARGSRef => \%ARGS );
     push @results, ProcessTicketLinks( TicketObj => $Ticket, ARGSRef => \%ARGS);
 }
diff --git a/share/html/Ticket/Update.html b/share/html/Ticket/Update.html
index ae49c11..6d39be0 100755
--- a/share/html/Ticket/Update.html
+++ b/share/html/Ticket/Update.html
@@ -243,30 +243,7 @@ $CanComment = 1 if ( $TicketObj->CurrentUserHasRight('CommentOnTicket') or
 
 $ARGS{'Token'} ||= $Token ||= Digest::MD5::md5_hex( rand(1024) );
 
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
-    if ($key =~ m/^DeleteAttach-(.+)$/) {
-        delete $session{'Attachments'}{$Token}{$1};
-    }
-    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ($ARGS{'Attach'}) {            # attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    # force session save
-    $session{'Attachments'} = $session{'Attachments'} || {};
-    $session{'Attachments'}{ $Token }{ $file_path } = $attachment;
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}{$Token}} and $ARGS{'UpdateAttach'}) {
-    delete $session{'Attachments'}{ $Token };
-}
+ProcessAttachments( ARGSRef => \%ARGS, Token => $Token );
 
 my $gnupg_widget = $m->comp('/Elements/GnuPG/SignEncryptWidget:new', Arguments => \%ARGS );
 $m->comp( '/Elements/GnuPG/SignEncryptWidget:Process',

commit 8a3c2774b4733c4f2b18536e31827989dc6e5cdb
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 03:15:04 2011 +0300

    indent

diff --git a/share/html/SelfService/Display.html b/share/html/SelfService/Display.html
index 3223aac..8ebec1f 100755
--- a/share/html/SelfService/Display.html
+++ b/share/html/SelfService/Display.html
@@ -112,9 +112,7 @@ if ( $ARGS{'Attach'} ) {    # attachment?
     $session{'Attachments'}{ $Token }{ $file_path } = $attachment;
 }
 
-if ( defined ($id[0]) && $id[0] eq 'new' ) {
-
-    # {{{ Create a new ticket
+if ( ($id[0]||'') eq 'new' ) {
 
     my $Queue = RT::Queue->new( $session{'CurrentUser'} );
     unless ( $Queue->Load( $ARGS{'Queue'} ) ) {
@@ -135,22 +133,22 @@ if ( defined ($id[0]) && $id[0] eq 'new' ) {
 
     unless ( $Ticket->id ) {
         $m->comp( 'Error.html', Why => join( "\n", @results ));
-              $m->abort();
-        }
+        $m->abort();
+    }
 
 
-        # delete temporary storage entry to make WebUI clean
-        unless ( keys %{ $session{'Attachments'}{ $Token } } and $ARGS{'UpdateAttach'} ) {
-            delete $session{'Attachments'}{ $Token };
-        }
+    # delete temporary storage entry to make WebUI clean
+    unless ( keys %{ $session{'Attachments'}{ $Token } } and $ARGS{'UpdateAttach'} ) {
+        delete $session{'Attachments'}{ $Token };
+    }
 
+}
+else {
+    unless ( $Ticket->Load( $id[0] ) ) {
+        $m->comp( 'Error.html',
+            Why => loc( "Couldn't load ticket '[_1]'", $id ) );
+        $m->abort();
     }
-    else {
-        unless ( $Ticket->Load( $id[0] ) ) {
-            $m->comp( 'Error.html',
-                Why => loc( "Couldn't load ticket '[_1]'", $id ) );
-            $m->abort();
-        }
 
     my ( $code, $msg );
 
@@ -190,36 +188,35 @@ if ( defined ($id[0]) && $id[0] eq 'new' ) {
     }
 
 
-    }
+}
 
-    # This code does automatic redirection if any updates happen.
+# This code does automatic redirection if any updates happen.
 
-    unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
-        $m->comp( 'Error.html',
-            Why => loc("No permission to display that ticket") );
-        # XXX: Why abort? then we loose footer //ruz
-        $m->abort();
-    }
+unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
+    $m->comp( 'Error.html',
+        Why => loc("No permission to display that ticket") );
+    # XXX: Why abort? then we loose footer //ruz
+    $m->abort();
+}
 
-    if (@results) {
-        # We've done something, so we need to clear the decks to avoid
-        # resubmission on refresh.
-        # But we need to store Actions somewhere too, so we don't lose them.
-        my $key = Digest::MD5::md5_hex(rand(1024));
-        push @{ $session{"Actions"}->{$key}  ||= [] }, @results;
-        $session{'i'}++;
-        RT::Interface::Web::Redirect( RT->Config->Get('WebURL') ."SelfService/Display.html?id=". $Ticket->id."&results=".$key);
-    }
+if (@results) {
+    # We've done something, so we need to clear the decks to avoid
+    # resubmission on refresh.
+    # But we need to store Actions somewhere too, so we don't lose them.
+    my $key = Digest::MD5::md5_hex(rand(1024));
+    push @{ $session{"Actions"}->{$key}  ||= [] }, @results;
+    $session{'i'}++;
+    RT::Interface::Web::Redirect( RT->Config->Get('WebURL') ."SelfService/Display.html?id=". $Ticket->id."&results=".$key);
+}
 
-    my $Transactions = $Ticket->Transactions;
+my $Transactions = $Ticket->Transactions;
 
-    my $attachments =
-      $m->comp( '/Ticket/Elements/FindAttachments', Ticket => $Ticket );
+my $attachments = $m->comp( '/Ticket/Elements/FindAttachments', Ticket => $Ticket );
 
-    my $LinkBasicsTitle = $Ticket->CurrentUserHasRight('ModifyTicket')
-                          || $Ticket->CurrentUserHasRight('ReplyToTicket');
-    my $title_box_link = RT->Config->Get('WebPath')."/SelfService/Update.html?id=".$Ticket->Id;
-    $m->callback(CallbackName => 'BeforeDisplay', Ticket => \$Ticket, ARGSRef => \%ARGS, title_box_link => \$title_box_link);
+my $LinkBasicsTitle = $Ticket->CurrentUserHasRight('ModifyTicket')
+                      || $Ticket->CurrentUserHasRight('ReplyToTicket');
+my $title_box_link = RT->Config->Get('WebPath')."/SelfService/Update.html?id=".$Ticket->Id;
+$m->callback(CallbackName => 'BeforeDisplay', Ticket => \$Ticket, ARGSRef => \%ARGS, title_box_link => \$title_box_link);
 </%INIT>
 
 

commit f468779e3681c05f715308cd81ddc7a51a062496
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 03:20:49 2011 +0300

    switch SelfService/Display.html over new attachments processing

diff --git a/share/html/SelfService/Display.html b/share/html/SelfService/Display.html
index 8ebec1f..5aa7c57 100755
--- a/share/html/SelfService/Display.html
+++ b/share/html/SelfService/Display.html
@@ -100,17 +100,7 @@ my @id = ( ref $id eq 'ARRAY' ) ? @{$id} : ($id);
 
 my $Ticket = RT::Ticket->new( $session{'CurrentUser'} );
 
-# store the uploaded attachment in session
-if ( $ARGS{'Attach'} ) {    # attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    # force session save
-    $session{'Attachments'} = $session{'Attachments'} || {};
-    $session{'Attachments'}{ $Token }{ $file_path } = $attachment;
-}
+ProcessAttachments( Token => $Token, ARGSRef => \%ARGS );
 
 if ( ($id[0]||'') eq 'new' ) {
 
@@ -128,20 +118,12 @@ if ( ($id[0]||'') eq 'new' ) {
     }
 
 
-    ( $Ticket, @results ) =
-    CreateTicket( Attachments => $session{'Attachments'}{$Token}, %ARGS, Status => 'new' );
+    ( $Ticket, @results ) = CreateTicket( %ARGS, Status => 'new' );
 
     unless ( $Ticket->id ) {
         $m->comp( 'Error.html', Why => join( "\n", @results ));
         $m->abort();
     }
-
-
-    # delete temporary storage entry to make WebUI clean
-    unless ( keys %{ $session{'Attachments'}{ $Token } } and $ARGS{'UpdateAttach'} ) {
-        delete $session{'Attachments'}{ $Token };
-    }
-
 }
 else {
     unless ( $Ticket->Load( $id[0] ) ) {
@@ -150,44 +132,23 @@ else {
         $m->abort();
     }
 
-    my ( $code, $msg );
-
-
-    if (
-        $session{'Attachments'}{ $Token }
-        || ( defined $ARGS{'UpdateContent'}
-            && $ARGS{'UpdateContent'} ne ''
-            && $ARGS{'UpdateContent'} ne "-- \n"
-            . $session{'CurrentUser'}->UserObj->Signature )
-      )
-    {
-        $ARGS{UpdateAttachments} = $session{'Attachments'}{ $Token };
-    }
     push @results, ProcessUpdateMessage(
         ARGSRef   => \%ARGS,
         TicketObj => $Ticket
     );
-            delete $session{'Attachments'}{ $Token };
-
-    # delete temporary storage entry to make WebUI clean
-    unless ( keys %{ $session{'Attachments'}{ $Token } } and $ARGS{'UpdateAttach'} ) {
-        delete $session{'Attachments'}{ $Token };
-    }
 
     my @cfupdates = ProcessObjectCustomFieldUpdates(Object => $Ticket, ARGSRef => \%ARGS);
     push (@results, @cfupdates);
 
-
     #Update the status
     if (    ( defined $ARGS{'Status'} )
         and $ARGS{'Status'}
         and ( $ARGS{'Status'} ne $Ticket->Status ) )
     {
-        ( $code, $msg ) = $Ticket->SetStatus( $ARGS{'Status'} );
+        my ($code, $msg) = $Ticket->SetStatus( $ARGS{'Status'} );
         push @results, "$msg";
     }
 
-
 }
 
 # This code does automatic redirection if any updates happen.

commit 6710d8b81a21227bf247389eaaa4a1d90fdfcb98
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 03:26:30 2011 +0300

    use may be redirect

diff --git a/share/html/SelfService/Display.html b/share/html/SelfService/Display.html
index 5aa7c57..cb49e35 100755
--- a/share/html/SelfService/Display.html
+++ b/share/html/SelfService/Display.html
@@ -160,15 +160,10 @@ unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
     $m->abort();
 }
 
-if (@results) {
-    # We've done something, so we need to clear the decks to avoid
-    # resubmission on refresh.
-    # But we need to store Actions somewhere too, so we don't lose them.
-    my $key = Digest::MD5::md5_hex(rand(1024));
-    push @{ $session{"Actions"}->{$key}  ||= [] }, @results;
-    $session{'i'}++;
-    RT::Interface::Web::Redirect( RT->Config->Get('WebURL') ."SelfService/Display.html?id=". $Ticket->id."&results=".$key);
-}
+MaybeRedirectForResults(
+    Actions => \@results,
+    Arguments => { 'id' => $Ticket->id },
+);
 
 my $Transactions = $Ticket->Transactions;
 

commit 1c705e20c4b6f8de4573ff396b85debc1785e96d
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 16:05:59 2011 +0300

    use Abort()

diff --git a/share/html/SelfService/Display.html b/share/html/SelfService/Display.html
index cb49e35..6b0f724 100755
--- a/share/html/SelfService/Display.html
+++ b/share/html/SelfService/Display.html
@@ -106,30 +106,23 @@ if ( ($id[0]||'') eq 'new' ) {
 
     my $Queue = RT::Queue->new( $session{'CurrentUser'} );
     unless ( $Queue->Load( $ARGS{'Queue'} ) ) {
-        $m->comp( 'Error.html', Why => loc('Queue not found') );
-        $m->abort;
+        Abort( loc('Queue not found') );
     }
 
     unless ( $Queue->CurrentUserHasRight('CreateTicket') ) {
-        $m->comp( 'Error.html',
-            Why =>
-              loc('You have no permission to create tickets in that queue.') );
-        $m->abort;
+        Abort( loc('You have no permission to create tickets in that queue.') );
     }
 
 
     ( $Ticket, @results ) = CreateTicket( %ARGS, Status => 'new' );
 
     unless ( $Ticket->id ) {
-        $m->comp( 'Error.html', Why => join( "\n", @results ));
-        $m->abort();
+        Abort( join "\n", @results );
     }
 }
 else {
     unless ( $Ticket->Load( $id[0] ) ) {
-        $m->comp( 'Error.html',
-            Why => loc( "Couldn't load ticket '[_1]'", $id ) );
-        $m->abort();
+        Abort( loc( "Couldn't load ticket '[_1]'", $id ) );
     }
 
     push @results, ProcessUpdateMessage(
@@ -154,10 +147,7 @@ else {
 # This code does automatic redirection if any updates happen.
 
 unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
-    $m->comp( 'Error.html',
-        Why => loc("No permission to display that ticket") );
-    # XXX: Why abort? then we loose footer //ruz
-    $m->abort();
+    Abort( loc("No permission to display that ticket") );
 }
 
 MaybeRedirectForResults(

commit cb5ff367d24a7bd6f25f01f882f53a453de173ad
Author: Ruslan Zakirov <ruz at bestpractical.com>
Date:   Sat Jan 22 16:17:49 2011 +0300

    process attachments in mobile UI

diff --git a/share/html/m/ticket/create b/share/html/m/ticket/create
index 994108e..de0b6bd 100644
--- a/share/html/m/ticket/create
+++ b/share/html/m/ticket/create
@@ -46,6 +46,7 @@
 %#
 %# END BPS TAGGED BLOCK }}}
 <%ARGS>
+$Token => ''
 $QuoteTransaction => undef
 $CloneTicket => undef
 </%ARGS>
@@ -165,31 +166,9 @@ my $ValidCFs = $m->comp(
     ARGSRef => \%ARGS
 );
 
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
-    if ($key =~ m/^DeleteAttach-(.+)$/) {
-	delete $session{'Attachments'}{$1};
-    }
-    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ($ARGS{'Attach'}) {			# attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
+$ARGS{'Token'} ||= $Token ||= Digest::MD5::md5_hex( rand(1024) );
 
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    $session{'Attachments'} = {
-        %{$session{'Attachments'} || {}},
-	$file_path => $attachment,
-    };
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}} and $ARGS{'id'} eq 'new') {
-    delete $session{'Attachments'};
-}
+ProcessAttachments( ARGSRef => \%ARGS, Token => $Token );
 
 my $checks_failure = 0;
 
@@ -252,6 +231,7 @@ if ((!exists $ARGS{'AddMoreAttach'}) and (defined($ARGS{'id'}) and $ARGS{'id'} e
 <& /Elements/ListActions, actions => \@results  &>
 <form action="<% RT->Config->Get('WebPath') %>/m/ticket/create" method="post" enctype="multipart/form-data" name="TicketCreate" id="ticket-create">
 <input type="hidden" class="hidden" name="id" value="new" />
+<input type="hidden" class="hidden" name="Token" value="<% $Token %>" />
 % $m->callback( CallbackName => 'FormStart', QueueObj => $QueueObj, ARGSRef => \%ARGS );
 % if ($gnupg_widget) {
 <& /Elements/GnuPG/SignEncryptWidget:ShowIssues, self => $gnupg_widget &>
@@ -339,13 +319,13 @@ $m->comp("/Ticket/Elements/EditCustomFields", %ARGS, QueueObj => $QueueObj );
 $m->comp("/Ticket/Elements/EditTransactionCustomFields", %ARGS, QueueObj => $QueueObj );
 
 </%perl>
-% if (exists $session{'Attachments'}) {
+% if ( my $attachments = $session{'Attachments'}{'Token'}) {
 
 <%loc("Attached file") %>
 
 <%loc("Check box to delete")%><br />
-% foreach my $attach_name (keys %{$session{'Attachments'}}) {
-<input type="checkbox" class="checkbox" name="DeleteAttach-<%$attach_name%>" value="1" /><%$attach_name%><br />
+% foreach my $attach_name ( keys %$attachments ) {
+<input type="checkbox" class="checkbox" name="DeleteAttach" value="<% $attach_name %>" /><%$attach_name%><br />
 % } # end of foreach
 
 
diff --git a/share/html/m/ticket/reply b/share/html/m/ticket/reply
index 67856fb..f581c5c 100644
--- a/share/html/m/ticket/reply
+++ b/share/html/m/ticket/reply
@@ -160,32 +160,9 @@ $CanRespond = 1 if ( $t->CurrentUserHasRight('ReplyToTicket') or
 $CanComment = 1 if ( $t->CurrentUserHasRight('CommentOnTicket') or
                      $t->CurrentUserHasRight('ModifyTicket') ); 
 
+$ARGS{'Token'} ||= $Token ||= Digest::MD5::md5_hex( rand(1024) );
 
-# deal with deleting uploaded attachments
-foreach my $key (keys %ARGS) {
-    if ($key =~ m/^DeleteAttach-(.+)$/) {
-        delete $session{'Attachments'}{$1};
-    }
-    $session{'Attachments'} = { %{$session{'Attachments'} || {}} };
-}
-
-# store the uploaded attachment in session
-if ($ARGS{'Attach'}) {            # attachment?
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    $session{'Attachments'} = {
-        %{$session{'Attachments'} || {}},
-        $file_path => $attachment,
-    };
-}
-
-# delete temporary storage entry to make WebUI clean
-unless (keys %{$session{'Attachments'}} and $ARGS{'UpdateAttach'}) {
-    delete $session{'Attachments'};
-}
+ProcessAttachments( ARGSRef => \%ARGS, Token => $Token );
 
 # check email addresses for RT's
 {
@@ -210,6 +187,7 @@ if ( !$checks_failure && exists $ARGS{SubmitTicket} ) {
 
 <%ARGS>
 $id => undef
+$Token => ''
 $Action => 'Respond'
 $DefaultStatus => undef
 </%ARGS>
diff --git a/share/html/m/ticket/show b/share/html/m/ticket/show
index 14933f6..d11fbf5 100644
--- a/share/html/m/ticket/show
+++ b/share/html/m/ticket/show
@@ -69,10 +69,7 @@ if ($ARGS{'id'} eq 'new') {
         Abort('You have no permission to create tickets in that queue.');
     }
 
-    ($Ticket, @Actions) = CreateTicket(
-        Attachments => delete $session{'Attachments'},
-        %ARGS,
-    );
+    ($Ticket, @Actions) = CreateTicket( %ARGS );
     unless ( $Ticket->CurrentUserHasRight('ShowTicket') ) {
         Abort("No permission to view newly created ticket #".$Ticket->id.".");
     }
@@ -95,14 +92,12 @@ if ($ARGS{'id'} eq 'new') {
             ARGSRef => \%ARGS, 
             Actions => \@Actions);
     
-    $ARGS{UpdateAttachments} = $session{'Attachments'};
     push @Actions,
         ProcessUpdateMessage(
         ARGSRef   => \%ARGS,
         Actions   => \@Actions,
         TicketObj => $Ticket,
         );
-    delete $session{'Attachments'};
 
     #Process status updates
     push @Actions, ProcessTicketWatchers(ARGSRef => \%ARGS, TicketObj => $Ticket );

-----------------------------------------------------------------------


More information about the Rt-commit mailing list