EditAttachment
Edit Attachment
Sometimes, it becomes difficult to follow a ticket because your users do top-posting or they have a disclamer of 2 pages. It's not in RT philosophy to change an Object after his creation, even if adding this modification as a transaction and a new version can be very useful. The hack presented here won't work if you are using GPG to sign messages.
First, add this CallBack
local/html/Callbacks/AName/Ticket/Elements/ShowTransactionAttachments/AfterDownloadLinks
/ <a href="<% $AttachPath %>/Edit/<% $ticket->Id %>/<% $trans->Id %>/<% $message->Id %>"><% loc('Edit') %></a>
<%ARGS>
$AttachPath => RT->Config->Get('WebPath')."/Ticket/Attachment"
$message => $ARGS{Attachment}
$ticket => $ARGS{Ticket}
$trans => $ARGS{Transaction}
</%ARGS>
Then, add this module (You can limit this function to a special group, here "Support Group"
local/html/Ticket/Attachment/Edit/dhandler
<%perl>
my ($ticket, $trans, $attach, $filename);
my $arg = $m->dhandler_arg; # get rest of path
if ($arg =~ '^(\d+)/(\d+)/(\d+)') {
$ticket = $1;
$trans = $2;
$attach = $3;
}
else {
Abort("Corrupted attachment URL.");
}
my $ok=0;
my $BSGroup = RT::Group->new($RT::SystemUser);
$BSGroup->LoadUserDefinedGroup('Support Group');
my $principal = $session{'CurrentUser'}->PrincipalObj;
# by default, users goes to SelfService
if ($BSGroup->HasMemberRecursively($principal)) {
$ok = 1;
} elsif ($principal->HasRight(Right => 'SuperUser', Object=>$RT::System)) {
$ok = 1;
}
if (!$ok) {
Abort("You can't edit a message");
}
my $AttachmentObj = new RT::Attachment($session{'CurrentUser'});
$AttachmentObj->Load($attach) || Abort("Attachment '$attach' could not be loaded");
unless ($AttachmentObj->id) {
Abort("Bad attachment id. Couldn't find attachment '$attach'\n");
}
if ($ARGS{'content'}) {
my $dbh = DBI->connect(RT::Handle->DSN, RT->Config->Get('DatabaseUser'), RT->Config->Get('DatabasePassword'));
unless ( $dbh ) {
Abort("Can't connect to database\n");
}
my $text = $dbh->quote($ARGS{'content'});
my $old = $dbh->quote($AttachmentObj->OriginalContent);
# CREATE TABLE AttachmentsHistory (Id int, Content text, Updated TimeStamp)
$dbh->do("INSERT INTO AttachmentsHistory (Id, Content, Updated) VALUES ($attach, $old, NOW())");
$dbh->do("UPDATE Attachments SET Content=$text WHERE Id=$attach");
$dbh->disconnect();
return RT::Interface::Web::Redirect( RT->Config->Get('WebURL') . "Ticket/Display.html?id=" . $ticket . "#txn-" . $trans);
}
$r->content_type("text/html");
my $content_type = $AttachmentObj->ContentType || 'text/plain';
if ($content_type !~ /^text\/plain/i) {
Abort("Can't edit non text attachment\n");
}
if (my $enc = $AttachmentObj->OriginalEncoding) {
my $iana = Encode::find_encoding( $enc );
$iana = $iana? $iana->mime_name : $enc;
$content_type .= ";charset=$iana";
}
# unless (RT->Config->Get('TrustMIMEAttachments')) {
# $content_type = 'application/octet-stream';
# }
$m->clear_buffer();
$m->out("<html><body>Edit Attachment Id $attach<form action='?' enctype='multipart/form-data' method='post'><textarea name='content' cols='120' rows='40'>");
$m->out($AttachmentObj->OriginalContent);
$m->out("</textarea>");
if ($ARGS{'content'}) {
$m->out("<pre>");
$m->out($ARGS{'content'});
$m->out("</pre>");
}
$m->out("
<input type='submit' name='action' value='Save'></form></body></html>");
$m->abort;
</%perl>
<%attr>
AutoFlush => 0
</%attr>
<%ARGS>
$id => undef
</%ARGS>
To keep version history, you can create this table to your RT instance
CREATE TABLE AttachmentsHistory (Id int, Content text, Updated TimeStamp);
A future version can also log the current user name, and display versions in a tab.
Enjoy.