[rt-users] patch for SelfService upload multiple files. any better?

Allen allen+rtlist at crystalfontz.com
Mon Feb 15 14:20:52 EST 2010


I've noticed that the "Reply" form at /SelfService/Update.html does
not allow customers to submit multiple file attachments in a single
post like privileged users can do in /Ticket/Update.html

I have tried to patch the feature from Ticket/Update.html back into a
"local" SelfService/Update.html
A "local" SelfService/Display.html also needed patching because
Update.html now redirects there, like on the privileged side.

It seems to work, but I don't really know what I am doing.
Is it right? Does anyone do this better?


$ diff -u /usr/share/request-tracker3.8/html/SelfService/Update.html
Update.html
--- /usr/share/request-tracker3.8/html/SelfService/Update.html
2009-06-16 14:57:46.000000000 -0700
+++ Update.html 2010-02-11 17:41:08.000000000 -0800
@@ -51,7 +51,7 @@

 % $m->callback(CallbackName => 'BeforeForm', %ARGS, ARGSRef =>
\%ARGS, Ticket => $Ticket );

-<form action="Display.html" method="post" enctype="multipart/form-data">
+<form action="Update.html" method="post" enctype="multipart/form-data">
 <input type="hidden" class="hidden" name="UpdateType" value="response" />
 <input type="hidden" class="hidden" name="id" value="<%$Ticket->Id%>" />
 <table>
@@ -91,28 +91,48 @@
     </td>
     <td class="value">
             <input name="Attach" type="file" />
+            <input type="submit" class="button" name="AddMoreAttach"
value="<&|/l&>Add More Files</&>" />
             <input type="hidden" class="hidden" name="UpdateAttach"
value="1" />
     </td>
   </tr>
 </table>
 <& /Ticket/Elements/EditCustomFields,  TicketObj => $Ticket &>
-<& /Elements/MessageBox,
-    Name => "UpdateContent",
-    QuoteTransaction => $ARGS{QuoteTransaction}
-    &>
+
+% if (exists $ARGS{UpdateContent}) {
+% my $temp = $ARGS{'QuoteTransaction'};
+% delete $ARGS{'QuoteTransaction'};
+<& /Elements/MessageBox, Name=>"UpdateContent",
Default=>$ARGS{UpdateContent}, IncludeSignature => 0, %ARGS&>
+% $ARGS{'QuoteTransaction'} = $temp;
+% } else {
+<& /Elements/MessageBox, Name=>"UpdateContent", %ARGS &>
+% }
     <br />


-<& /Elements/Submit &>
+<& /Elements/Submit, Label => loc('Update Ticket'), Name => 'SubmitTicket' &>
   </form>

-
+<!--  add this to get Hiztory on Reply screen -->
+<& /Ticket/Elements/ShowHistory,
+      Ticket => $Ticket,
+      URIFile => "Display.html",
+      ShowHeaders => $ARGS{'ShowHeaders'},
+      DownloadableHeaders => 0,
+      AttachPath => "Attachment",
+      Attachments => $attachments,
+      UpdatePath => "Update.html"
+&>

 <%INIT>

 my $Ticket = LoadTicket($id);

-$m->callback( Ticket => $Ticket, ARGSRef => \%ARGS, CallbackName =>
'Initial' );
+# my @results;
+# $m->callback( Ticket => $Ticket, ARGSRef => \%ARGS, results =>
\@results, CallbackName => 'Initial' );
+
+# add this to get Hiztory on Reply screen
+my $attachments = $m->comp( '/Ticket/Elements/FindAttachments',
Ticket => $Ticket );
+

 my $title = loc( "Update ticket #[_1]", $Ticket->id );

@@ -123,7 +143,53 @@
   unless ( $Ticket->CurrentUserHasRight('ReplyToTicket')
     or $Ticket->CurrentUserHasRight('ModifyTicket') );

-$m->callback(CallbackName => 'BeforeDisplay', Ticket => \$Ticket,
ARGSRef => \%ARGS);
+
+# stolen from /Ticket/Update.html to process multiple attachments for 1 post
+# {{{ 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'};
+}
+# }}}
+
+$m->callback( TicketObj => $Ticket, ARGSRef => \%ARGS );
+my @results;
+
+#unless ( $ARGS{'AddMoreAttach'} ) {
+#    # Add session attachments if any to be processed by ProcessUpdateMessage
+#    $ARGS{'UpdateAttachments'} = $session{'Attachments'} if (
$session{'Attachments'} );
+#
+#    # my @results, ProcessUpdateMessage(TicketObj => $Ticket,
ARGSRef   => \%ARGS  );
+#    # Cleanup WebUI
+#    delete $session{'Attachments'};
+#}
+
+if ( exists $ARGS{'SubmitTicket'} ) {
+    $m->callback(CallbackName => 'BeforeDisplay', Ticket => \$Ticket,
ARGSRef => \%ARGS);
+    return $m->comp('Display.html', TicketObj => $Ticket, %ARGS);
+}
 </%INIT>

 <%ARGS>


diff -u /usr/share/request-tracker3.8/html/SelfService/Display.html
Display.html
--- /usr/share/request-tracker3.8/html/SelfService/Display.html
2009-06-16 14:57:46.000000000 -0700
+++ Display.html        2010-02-11 18:28:46.000000000 -0800
@@ -48,29 +48,11 @@
 <& /SelfService/Elements/Header, Title => loc('#[_1]: [_2]',
$Ticket->id, $Ticket->Subject) &>

 % $m->callback(CallbackName => 'BeforeActionList', %ARGS, Actions =>
\@results, ARGSRef => \%ARGS, Ticket => $Ticket );
-
 <& /Elements/ListActions, actions => \@results &>

-  <table width="100%" class="ticketsummary" >
-      <tr>
-        <td valign="top" width="50%" class="boxcontainer">
-          <&| /Widgets/TitleBox, title => loc('The Basics'),
-                title_class=> 'inverse',
-                color => "#993333" &>
-                <& /Ticket/Elements/ShowBasics, Ticket => $Ticket &>
-                <& /Ticket/Elements/ShowCustomFields, Ticket => $Ticket &>
-          </&>
-</td>
-        <td valign="top" width="50%" class="boxcontainer">
-          <&| /Widgets/TitleBox, title => loc("Dates"),
-                title_class=> 'inverse',
-                 color => "#663366" &>
-          <& /Ticket/Elements/ShowDates, Ticket => $Ticket, UpdatedLink => 0 &>
-          </&>
-</td>
-</tr>
-</table>
-
+<div style='margin-top: -10px; text-align: right;'>
+    <&|/l&>Status</&>: <% loc($Ticket->Status) %>
+</div>


 %#!!pape: selfservice_find_attachments.patch {{
@@ -89,9 +71,10 @@

 <%INIT>

-my ( $field, @results );
+$m->callback( TicketObj => $Ticket, ARGSRef => \%ARGS, CallbackName
=> 'Initial' );
+
+my @results;

-$m->callback( ARGSRef => \%ARGS, CallbackName => 'Initial' );

 # {{{ Load the ticket
 #If we get handed two ids, mason will make them an array. bleck.
@@ -99,22 +82,6 @@
 # to deal
 my @id = ( ref $id eq 'ARRAY' ) ? @{$id} : ($id);

-my $Ticket = new RT::Ticket( $session{'CurrentUser'} );
-
-# store the uploaded attachment in session
-if ( $ARGS{'Attach'} ) {    # attachment?
-    $session{'Attachments'} = {} unless defined $session{'Attachments'};
-
-    my $attachment = MakeMIMEEntity(
-        AttachmentFieldName => 'Attach'
-    );
-
-    my $file_path = Encode::decode_utf8("$ARGS{'Attach'}");
-    $session{'Attachments'} = {
-        %{ $session{'Attachments'} || {} },
-        $file_path => $attachment,
-    };
-}

 if ( defined ($id[0]) && $id[0] eq 'new' ) {

@@ -134,58 +101,36 @@
     }


-    ( $Ticket, @results ) =
-    CreateTicket( Attachments => $session{'Attachments'}, %ARGS,
Status => 'new' );
+    ( $Ticket, @results ) = CreateTicket(
+         Attachments => delete $session{'Attachments'}, %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'} } and
$ARGS{'UpdateAttach'} ) {
-            delete $session{'Attachments'};
-        }
-
-        # }}}
-    }
-    else {
-        unless ( $Ticket->Load( $id[0] ) ) {
-            $m->comp( 'Error.html',
-                Why => loc( "Couldn't load ticket '[_1]'", $id ) );
-            $m->abort();
-        }
-
-    my ( $code, $msg );
-
+        $m->abort();
+    }
+    # }}}

-    if (
-        $session{'Attachments'}
-        || ( defined $ARGS{'UpdateContent'}
-            && $ARGS{'UpdateContent'} ne ''
-            && $ARGS{'UpdateContent'} ne "-- \n"
-            . $session{'CurrentUser'}->UserObj->Signature )
-      )
-    {
-        $ARGS{UpdateAttachments} = $session{'Attachments'};
+} else {
+    $Ticket = new RT::Ticket( $session{'CurrentUser'} );
+
+    unless ( $Ticket->Load( $ARGS{'id'} ) ) {
+        $m->comp( 'Error.html', Why => loc( "Couldn't load ticket
'[_1]'", $id ) );
+        $m->abort();
     }
-    push @results, ProcessUpdateMessage(
+
+    $ARGS{UpdateAttachments} = $session{'Attachments'};
+    push @results,
+        ProcessUpdateMessage(
         ARGSRef   => \%ARGS,
+        results   => \@results,
         TicketObj => $Ticket
     );
-            delete $session{'Attachments'};
+    delete $session{'Attachments'};

-    # delete temporary storage entry to make WebUI clean
-    unless ( keys %{ $session{'Attachments'} } and $ARGS{'UpdateAttach'} ) {
-        delete $session{'Attachments'};
-    }

-    my @cfupdates = ProcessObjectCustomFieldUpdates(Object =>
$Ticket, ARGSRef => \%ARGS);
-    push (@results, @cfupdates);
+    push @results, ProcessObjectCustomFieldUpdates(Object => $Ticket,
ARGSRef => \%ARGS);

-    # }}}
+    my ( $code, $msg );

     #Update the status
     if (    ( defined $ARGS{'Status'} )
@@ -198,10 +143,7 @@
     # }}}


-    }
-
     # 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") );
@@ -209,7 +151,11 @@
         $m->abort();
     }

-    if (@results) {
+}
+
+
+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.
@@ -217,17 +163,17 @@
         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 );

-    $m->callback(CallbackName => 'BeforeDisplay', Ticket => \$Ticket,
ARGSRef => \%ARGS);
+$m->callback(CallbackName => 'BeforeDisplay', Ticket => \$Ticket,
ARGSRef => \%ARGS);
 </%INIT>


 <%ARGS>
 $id => undef
+$Ticket => undef
 </%ARGS>

SelfService/Create.html also only allows 1 file upload per post and
really needs a similar patch.



More information about the rt-users mailing list