# Alexander J. Vincent <ajvincent@juno.com>
# Max Kanat-Alexander <mkanat@bugzilla.org>
# Greg Hendricks <ghendricks@novell.com>
+# Frédéric Buclin <LpSolit@gmail.com>
################################################################################
# Script Initialization
# Include the Bugzilla CGI and general utility library.
require "globals.pl";
-use Bugzilla::Config qw(:locations);
-# Use these modules to handle flags.
+use Bugzilla;
+use Bugzilla::Config qw(:locations);
use Bugzilla::Constants;
use Bugzilla::Flag;
use Bugzilla::FlagType;
use Bugzilla::Util;
use Bugzilla::Bug;
use Bugzilla::Field;
+use Bugzilla::Attachment;
Bugzilla->login();
my $cgi = Bugzilla->cgi;
+my $dbh = Bugzilla->dbh;
my $template = Bugzilla->template;
my $vars = {};
# Any user is allowed to access this page, unless the attachment
# is private and the user does not belong to the insider group.
# Validations are done later when the user submits changes.
-sub edit
-{
- # Retrieve and validate parameters
+sub edit {
my ($attach_id) = validateID();
+ my $dbh = Bugzilla->dbh;
- # Retrieve the attachment from the database.
- SendSQL("SELECT description, mimetype, filename, bug_id, ispatch, isurl,
- isobsolete, isprivate, LENGTH(thedata)
- FROM attachments
- INNER JOIN attach_data
- ON id = attach_id
- WHERE attach_id = $attach_id");
- my ($description, $contenttype, $filename, $bugid, $ispatch, $isurl, $isobsolete, $isprivate, $datasize) = FetchSQLData();
-
- my $isviewable = !$isurl && isViewable($contenttype);
- my $thedata;
- if ($isurl) {
- SendSQL("SELECT thedata FROM attach_data WHERE id = $attach_id");
- ($thedata) = FetchSQLData();
- }
+ my $attachment = Bugzilla::Attachment->get($attach_id);
+ my $isviewable = !$attachment->isurl && isViewable($attachment->contenttype);
# Retrieve a list of attachments for this bug as well as a summary of the bug
# to use in a navigation bar across the top of the screen.
- SendSQL("SELECT attach_id FROM attachments WHERE bug_id = $bugid ORDER BY attach_id");
- my @bugattachments;
- push(@bugattachments, FetchSQLData()) while (MoreSQLData());
- SendSQL("SELECT short_desc FROM bugs WHERE bug_id = $bugid");
- my ($bugsummary) = FetchSQLData();
-
+ my $bugattachments =
+ $dbh->selectcol_arrayref('SELECT attach_id FROM attachments
+ WHERE bug_id = ? ORDER BY attach_id',
+ undef, $attachment->bug_id);
+
+ my ($bugsummary, $product_id, $component_id) =
+ $dbh->selectrow_array('SELECT short_desc, product_id, component_id
+ FROM bugs
+ WHERE bug_id = ?', undef, $attachment->bug_id);
+
# Get a list of flag types that can be set for this attachment.
- SendSQL("SELECT product_id, component_id FROM bugs WHERE bug_id = $bugid");
- my ($product_id, $component_id) = FetchSQLData();
my $flag_types = Bugzilla::FlagType::match({ 'target_type' => 'attachment' ,
'product_id' => $product_id ,
'component_id' => $component_id });
foreach my $flag_type (@$flag_types) {
$flag_type->{'flags'} = Bugzilla::Flag::match({ 'type_id' => $flag_type->{'id'},
- 'attach_id' => $attach_id,
+ 'attach_id' => $attachment->id,
'is_active' => 1 });
}
$vars->{'flag_types'} = $flag_types;
$vars->{'any_flags_requesteeble'} = grep($_->{'is_requesteeble'}, @$flag_types);
-
- # Define the variables and functions that will be passed to the UI template.
- $vars->{'attachid'} = $attach_id;
- $vars->{'description'} = $description;
- $vars->{'contenttype'} = $contenttype;
- $vars->{'filename'} = $filename;
- $vars->{'bugid'} = $bugid;
+ $vars->{'attachment'} = $attachment;
$vars->{'bugsummary'} = $bugsummary;
- $vars->{'ispatch'} = $ispatch;
- $vars->{'isurl'} = $isurl;
- $vars->{'isobsolete'} = $isobsolete;
- $vars->{'isprivate'} = $isprivate;
- $vars->{'datasize'} = $datasize;
- $vars->{'thedata'} = $thedata;
$vars->{'isviewable'} = $isviewable;
- $vars->{'attachments'} = \@bugattachments;
+ $vars->{'attachments'} = $bugattachments;
$vars->{'GetBugLink'} = \&GetBugLink;
# Determine if PatchReader is installed
# Rights Reserved.
#
# Contributor(s): Myk Melez <myk@mozilla.org>
+ # Frédéric Buclin <LpSolit@gmail.com>
#%]
[% PROCESS global/variables.none.tmpl %]
[%# Define strings that will serve as the title and header of this page %]
-[% title = BLOCK %]Edit Attachment #[% attachid %] for [% terms.Bug %] #[% bugid %][% END %]
-[% h1 = BLOCK %]Edit Attachment #[% attachid %] for
- [%+ GetBugLink(bugid, "$terms.Bug $bugid") %][% END %]
+[% title = BLOCK %]
+ Edit Attachment [% attachment.id %] for [% terms.Bug %] [%+ attachment.bug_id %]
+[% END %]
+[% h1 = BLOCK %]
+ Edit Attachment [% attachment.id %] for
+ [%+ GetBugLink(attachment.bug_id, "$terms.Bug ${attachment.bug_id}") %]
+[% END %]
[% h2 = BLOCK %][% bugsummary FILTER html %][% END %]
[% PROCESS global/header.html.tmpl
if (!has_viewed_as_diff) {
var viewDiffFrame = document.getElementById('viewDiffFrame');
viewDiffFrame.src =
- 'attachment.cgi?id=[% attachid %]&action=diff&headers=0';
+ 'attachment.cgi?id=[% attachment.id %]&action=diff&headers=0';
has_viewed_as_diff = 1;
}
}
</script>
<form method="post" action="attachment.cgi" onsubmit="normalizeComments();">
- <input type="hidden" name="id" value="[% attachid %]">
+ <input type="hidden" name="id" value="[% attachment.id %]">
<input type="hidden" name="action" value="update">
<input type="hidden" name="contenttypemethod" value="manual">
<td width="25%">
<small>
<b>Description:</b><br>
- <textarea rows="3" cols="25" name="description" wrap="soft">[% description FILTER html %]</textarea><br>
-
- [% IF isurl %]
- <input type="hidden" name="filename" value="[% filename FILTER html %]"><br>
- <input type="hidden" name="contenttypeentry" value="[% contenttype FILTER html %]"><br>
+ <textarea rows="3" cols="25" name="description" wrap="soft">
+ [%- attachment.description FILTER html %]</textarea><br>
+
+ [% IF attachment.isurl %]
+ <input type="hidden" name="filename"
+ value="[% attachment.filename FILTER html %]"><br>
+ <input type="hidden" name="contenttypeentry"
+ value="[% attachment.contenttype FILTER html %]"><br>
[% ELSE %]
<b>Filename:</b><br>
- <input type="text" size="20" name="filename" value="[% filename FILTER html %]"><br>
- <b>Size: </b>[% datasize FILTER unitconvert %]<br>
+ <input type="text" size="20" name="filename"
+ value="[% attachment.filename FILTER html %]"><br>
+ <b>Size: </b>[% attachment.datasize FILTER unitconvert %]<br>
<b>MIME Type:</b><br>
- <input type="text" size="20" name="contenttypeentry" value="[% contenttype FILTER html %]"><br>
+ <input type="text" size="20" name="contenttypeentry"
+ value="[% attachment.contenttype FILTER html %]"><br>
<input type="checkbox" id="ispatch" name="ispatch" value="1"
- [% 'checked="checked"' IF ispatch %]>
+ [% 'checked="checked"' IF attachment.ispatch %]>
<label for="ispatch">patch</label>
[% END %]
<input type="checkbox" id="isobsolete" name="isobsolete" value="1"
- [% 'checked="checked"' IF isobsolete %]>
+ [% 'checked="checked"' IF attachment.isobsolete %]>
<label for="isobsolete">obsolete</label><br>
[% IF (Param("insidergroup") && UserInGroup(Param("insidergroup"))) %]
- <input type="checkbox" name="isprivate" value="1"[% " checked" IF isprivate %]> private<br><br>
+ <input type="checkbox" name="isprivate" value="1"
+ [% " checked" IF attachment.isprivate %]> private<br><br>
[% ELSE %]<br>
[% END %]
[% IF flag_types.size > 0 %]
- [% PROCESS "flag/list.html.tmpl" bug_id=bugid attach_id=attachid %]<br>
+ [% PROCESS "flag/list.html.tmpl" bug_id = attachment.bug_id
+ attach_id = attachment.id %]<br>
[% END %]
<div id="smallCommentFrame">
<input type="submit" value="Submit"><br><br>
<strong>Actions:</strong>
- <a href="attachment.cgi?id=[% attachid %]">View</a>
- [% IF ispatch && patchviewerinstalled %]
- | <a href="attachment.cgi?id=[% attachid %]&action=diff">Diff</a>
+ <a href="attachment.cgi?id=[% attachment.id %]">View</a>
+ [% IF attachment.ispatch && patchviewerinstalled %]
+ | <a href="attachment.cgi?id=[% attachment.id %]&action=diff">Diff</a>
[% END %]
</small>
</td>
[% IF isviewable %]
<td width="75%">
- <textarea id="editFrame" name="comment" style="height: 400px; width: 100%; display: none;" cols="80" wrap="soft"></textarea>
- <iframe id="viewFrame" src="attachment.cgi?id=[% attachid %]" style="height: 400px; width: 100%;">
+ <textarea id="editFrame" name="comment" wrap="soft" cols="80"
+ style="height: 400px; width: 100%; display: none;"></textarea>
+ <iframe id="viewFrame" src="attachment.cgi?id=[% attachment.id %]" style="height: 400px; width: 100%;">
<b>You cannot view the attachment while editing it because your browser does not support IFRAMEs.
- <a href="attachment.cgi?id=[% attachid %]">View the attachment on a separate page</a>.</b>
+ <a href="attachment.cgi?id=[% attachment.id %]">View the attachment on a separate page</a>.</b>
</iframe>
<script type="text/javascript">
<!--
//-->
</script>
</td>
- [% ELSIF isurl %]
+ [% ELSIF attachment.isurl %]
<td width="75%">
- <a href="[% thedata FILTER html %]">
- [% IF datasize < 120 %]
- [% thedata FILTER html %]
+ <a href="[% attachment.data FILTER html %]">
+ [% IF attachment.datasize < 120 %]
+ [% attachment.data FILTER html %]
[% ELSE %]
- [% thedata FILTER truncate(80) FILTER html %]
+ [% attachment.data FILTER truncate(80) FILTER html %]
...
- [% thedata.match(".*(.{20})$").0 FILTER html %]
+ [% attachment.data.match(".*(.{20})$").0 FILTER html %]
[% END %]
</a>
</td>
<td id="noview" width="50%">
<p><b>
Attachment is not viewable in your browser because its MIME type
- ([% contenttype FILTER html %]) is not one that your browser is
+ ([% attachment.contenttype FILTER html %]) is not one that your browser is
able to display.
</b></p>
<p><b>
- <a href="attachment.cgi?id=[% attachid %]">Download the attachment</a>.
+ <a href="attachment.cgi?id=[% attachment.id %]">Download the attachment</a>.
</b></p>
</td>
[% END %]
Attachments on this [% terms.Bug %]:
[% FOREACH a = attachments %]
- [% IF a == attachid %]
- #[% a %]
+ [% IF a == attachment.id %]
+ [% a %]
[% ELSE %]
- <a href="attachment.cgi?id=[% a %]&action=edit">#[% a %]</a>
+ <a href="attachment.cgi?id=[% a %]&action=edit">[% a %]</a>
[% END %]
[% " |" UNLESS loop.last() %]
[% END %]