# -*- Mode: perl; indent-tabs-mode: nil -*- # # The contents of this file are subject to the Mozilla Public # License Version 1.1 (the "License"); you may not use this file # except in compliance with the License. You may obtain a copy of # the License at http://www.mozilla.org/MPL/ # # Software distributed under the License is distributed on an "AS # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or # implied. See the License for the specific language governing # rights and limitations under the License. # # The Original Code is the Bugzilla Bug Tracking System. # # The Initial Developer of the Original Code is Netscape Communications # Corporation. Portions created by Netscape are # Copyright (C) 1998 Netscape Communications Corporation. All # Rights Reserved. # # Contributor(s): Terry Weissman # Dave Miller use diagnostics; use strict; use RelationSet; # Shut up misguided -w warnings about "used only once". For some reason, # "use vars" chokes on me when I try it here. sub bug_form_pl_sillyness { my $zz; $zz = %::FORM; $zz = %::components; $zz = %::proddesc; $zz = %::prodmaxvotes; $zz = %::versions; $zz = @::legal_keywords; $zz = @::legal_opsys; $zz = @::legal_platform; $zz = @::legal_priority; $zz = @::settable_resolution; $zz = @::legal_severity; $zz = %::target_milestone; } my $loginok = quietly_check_login(); my $id = $::FORM{'id'}; my $query = " select bugs.bug_id, product, version, rep_platform, op_sys, bug_status, resolution, priority, bug_severity, component, assigned_to, reporter, bug_file_loc, short_desc, target_milestone, qa_contact, status_whiteboard, date_format(creation_ts,'%Y-%m-%d %H:%i'), groupset, delta_ts, sum(votes.count) from bugs left join votes using(bug_id) where bugs.bug_id = $id group by bugs.bug_id"; SendSQL($query); my %bug; my @row; @row = FetchSQLData(); my $count = 0; foreach my $field ("bug_id", "product", "version", "rep_platform", "op_sys", "bug_status", "resolution", "priority", "bug_severity", "component", "assigned_to", "reporter", "bug_file_loc", "short_desc", "target_milestone", "qa_contact", "status_whiteboard", "creation_ts", "groupset", "delta_ts", "votes") { $bug{$field} = shift @row; if (!defined $bug{$field}) { $bug{$field} = ""; } $count++; } my $assignedtoid = $bug{'assigned_to'}; my $reporterid = $bug{'reporter'}; my $qacontactid = $bug{'qa_contact'}; $bug{'assigned_to_email'} = DBID_to_name($assignedtoid); $bug{'assigned_to'} = DBID_to_real_or_loginname($bug{'assigned_to'}); $bug{'reporter'} = DBID_to_real_or_loginname($bug{'reporter'}); print qq{
\n}; # foreach my $i (sort(keys(%bug))) { # my $q = value_quote($bug{$i}); # print qq{\n}; # } $bug{'long_desc'} = GetLongDescriptionAsHTML($id); my $longdesclength = length($bug{'long_desc'}); GetVersionTable(); # # These should be read from the database ... # my $platform_popup = make_options(\@::legal_platform, $bug{'rep_platform'}); my $priority_popup = make_options(\@::legal_priority, $bug{'priority'}); my $sev_popup = make_options(\@::legal_severity, $bug{'bug_severity'}); my $component_popup = make_options($::components{$bug{'product'}}, $bug{'component'}); my $ccSet = new RelationSet; $ccSet->mergeFromDB("select who from cc where bug_id=$id"); my @ccList = $ccSet->toArrayOfStrings(); my $cc_element = ""; if (scalar(@ccList) > 0) { $cc_element = "
\n" . "Remove selected CCs
\n"; } my $URL = value_quote($bug{'bug_file_loc'}); if (defined $URL && $URL ne "none" && $URL ne "NULL" && $URL ne "") { $URL = "URL:"; } else { $URL = "URL:"; } # # Make a list of products the user has access to # my (@prodlist, $product_popup); foreach my $p (sort(keys %::versions)) { if ($p eq $bug{'product'}) { # if it's the product the bug is already in, it's ALWAYS in # the popup, period, whether the user can see it or not, and # regardless of the disallownew setting. push(@prodlist, $p); next; } if (defined $::proddesc{$p} && $::proddesc{$p} eq '0') { # Special hack. If we stuffed a "0" into proddesc, that means # that disallownew was set for this bug, and so we don't want # to allow people to specify that product here. next; } if(Param("usebuggroupsentry") && GroupExists($p) && !UserInGroup($p)) { # If we're using bug groups to restrict entry on products, and # this product has a bug group, and the user is not in that # group, we don't want to include that product in this list. next; } push(@prodlist, $p); } # If the user has access to multiple products, display a popup, otherwise # display the current product. if (1 < @prodlist) { $product_popup = ""; } else { $product_popup = $bug{'product'} . ""; } print " "; if (Param("usetargetmilestone")) { my $url = ""; if (defined $::milestoneurl{$bug{'product'}}) { $url = $::milestoneurl{$bug{'product'}}; } if ($url eq "") { $url = "notargetmilestone.html"; } if ($bug{'target_milestone'} eq "") { $bug{'target_milestone'} = " "; } print " "; } else { print ""; } print " "; if (Param("useqacontact")) { my $name = $bug{'qa_contact'} > 0 ? DBID_to_name($bug{'qa_contact'}) : ""; print " "; } print " "; if (Param("usestatuswhiteboard")) { print " "; } if (@::legal_keywords) { SendSQL("SELECT keyworddefs.name FROM keyworddefs, keywords WHERE keywords.bug_id = $id AND keyworddefs.id = keywords.keywordid ORDER BY keyworddefs.name"); my @list; while (MoreSQLData()) { push(@list, FetchOneColumn()); } my $value = value_quote(join(', ', @list)); print qq{ }; } # 2001-05-16 myk@mozilla.org: use the attachment tracker to display attachments # if this installation has enabled use of the attachment tracker. if (Param('useattachmenttracker')) { print "
Bug#:$bug{'bug_id'}   Platform:   Reporter:$bug{'reporter'}
Product: $product_popup   OS:   Add CC:
Component:   Version:   CC: $cc_element
Status: $bug{'bug_status'}   Priority:  
Resolution: $bug{'resolution'}   Severity:  
Assigned To: $bug{'assigned_to'}  Target Milestone:   
QA Contact:
$URL
Summary:
Status Whiteboard:
Keywords:
\n"; use Attachment; &Attachment::list($id); } else { print "Attachments:\n"; SendSQL("select attach_id, creation_ts, mimetype, description from attachments where bug_id = $id"); while (MoreSQLData()) { my ($attachid, $date, $mimetype, $desc) = (FetchSQLData()); if ($date =~ /^(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)(\d\d)$/) { $date = "$3/$4/$2 $5:$6"; } my $link = "showattachment.cgi?attach_id=$attachid"; $desc = value_quote($desc); $mimetype = html_quote($mimetype); print qq{$date$desc   ($mimetype)}; } print "Create a new attachment (proposed patch, testcase, etc.)\n"; } sub EmitDependList { my ($desc, $myfield, $targetfield) = (@_); print "$desc:"; my @list; SendSQL("select $targetfield from dependencies where $myfield = $id order by $targetfield"); while (MoreSQLData()) { my ($i) = (FetchSQLData()); push(@list, $i); print GetBugLink($i, $i); print " "; } print "\n"; } if (Param("usedependencies")) { print "\n"; EmitDependList("Bug $id depends on", "blocked", "dependson"); print qq{ "; EmitDependList("Bug $id blocks", "dependson", "blocked"); print "
Show dependency tree }; if (Param("webdotbase") ne "") { print qq{
Show dependency graph }; } print "
\n"; } if ($::prodmaxvotes{$bug{'product'}}) { print qq{
Votes: $bug{'votes'}    Show votes for this bug    Vote for this bug
}; } print "
Additional Comments:

"; if ($::usergroupset ne '0' || $bug{'groupset'} ne '0') { SendSQL("select bit, name, description, (bit & $bug{'groupset'} != 0), " . "(bit & $::usergroupset != 0) from groups where isbuggroup != 0 " . # Include active groups as well as inactive groups to which # the bug already belongs. This way the bug can be removed # from an inactive group but can only be added to active ones. "and ((isactive = 1 and (bit & $::usergroupset != 0)) or " . "(bit & $bug{'groupset'} != 0)) " . "order by description"); # We only print out a header bit for this section if there are any # results. my $groupFound = 0; my $inAllGroups = 1; while (MoreSQLData()) { my ($bit, $name, $description, $ison, $ingroup) = (FetchSQLData()); # For product groups, we only want to display the checkbox if either # (1) The bit is already set, or # (2) The user is in the group, but either: # (a) The group is a product group for the current product, or # (b) The group name isn't a product name # This measns that all product groups will be skipped, but non-product # bug groups will still be displayed. if($ison || ($ingroup && (($name eq $bug{'product'}) || (!defined $::proddesc{$name})))) { if(!$groupFound) { print "
Only users in the selected groups can view this bug:
\n"; print "(Unchecking all boxes makes this a public bug.)

\n"; $groupFound = 1; } if(!$ingroup) { $inAllGroups = 0; } # Modifying this to use checkboxes instead my $checked = $ison ? " CHECKED" : ""; my $disabled = $ingroup ? "" : " DISABLED=\"disabled\""; # indent these a bit print "    "; print "\n"; print "$description
\n"; } } if (!$inAllGroups) { print "Only members of a group can change the visibility of a bug for that group
"; } # If the bug is restricted to a group, display checkboxes that allow # the user to set whether or not the reporter, assignee, QA contact, # and cc list can see the bug even if they are not members of all # groups to which the bug is restricted. if ( $bug{'groupset'} != 0 ) { # Determine whether or not the bug is always accessible by the reporter, # QA contact, and/or users on the cc: list. SendSQL("SELECT reporter_accessible , assignee_accessible , qacontact_accessible , cclist_accessible FROM bugs WHERE bug_id = $id "); my ($reporter_accessible, $assignee_accessible, $qacontact_accessible, $cclist_accessible) = FetchSQLData(); # Convert boolean data about which roles always have access to the bug # into "checked" attributes for the HTML checkboxes by which users # set and change these values. my $reporter_checked = $reporter_accessible ? " checked" : ""; my $assignee_checked = $assignee_accessible ? " checked" : ""; my $qacontact_checked = $qacontact_accessible ? " checked" : ""; my $cclist_checked = $cclist_accessible ? " checked" : ""; # Display interface for changing the values. print qq|

But users in the roles selected below can always view this bug:
(Does not take effect unless the bug is restricted to at least one group.)

Reporter Assignee QA Contact CC List

|; } } print "
Leave as $bug{'bug_status'} $bug{'resolution'}
"; # knum is which knob number we're generating, in javascript terms. my $knum = 1; my $status = $bug{'bug_status'}; # In the below, if the person hasn't logged in ($::userid == 0), then # we treat them as if they can do anything. That's because we don't # know why they haven't logged in; it may just be because they don't # use cookies. Display everything as if they have all the permissions # in the world; their permissions will get checked when they log in # and actually try to make the change. my $canedit = UserInGroup("editbugs") || ($::userid == 0); my $canconfirm; if ($status eq $::unconfirmedstate) { $canconfirm = UserInGroup("canconfirm") || ($::userid == 0); if ($canedit || $canconfirm) { print ""; print "Confirm bug (change status to NEW)
"; $knum++; } } my $movers = Param("movers"); $movers =~ s/\s?,\s?/|/g; $movers =~ s/@/\@/g; if ($canedit || $::userid == $assignedtoid || $::userid == $reporterid || $::userid == $qacontactid) { if (IsOpenedState($status)) { if ($status ne "ASSIGNED") { print ""; my $extra = ""; if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) { $extra = "confirm bug, "; } print "Accept bug (${extra}change status to ASSIGNED)
"; $knum++; } if ($bug{'resolution'} ne "") { print "\n"; print "Clear the resolution (remove the current resolution of\n"; print "$bug{'resolution'})
\n"; $knum++; } my $resolution_popup = make_options(\@::settable_resolution, $bug{'resolution'}); print " Resolve bug, changing resolution to
\n"; $knum++; print " Resolve bug, mark it as duplicate of bug #
\n"; $knum++; my $assign_element = ""; print " Reassign bug to $assign_element
\n"; if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) { print "     and confirm bug (change status to NEW)
"; } $knum++; print " Reassign bug to owner "; if (Param("useqacontact")) { print "and QA contact "; } print "of selected component
\n"; if ($status eq $::unconfirmedstate && ($canconfirm || $canedit)) { print "     and confirm bug (change status to NEW)
"; } $knum++; } elsif ( Param("move-enabled") && ($bug{'resolution'} eq "MOVED") ) { if ( (defined $::COOKIE{"Bugzilla_login"}) && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){ print " Reopen bug
\n"; $knum++; if ($status eq "RESOLVED") { print " Mark bug as VERIFIED
\n"; $knum++; } if ($status ne "CLOSED") { print " Mark bug as CLOSED
\n"; $knum++; } } } else { print " Reopen bug
\n"; $knum++; if ($status eq "RESOLVED") { print " Mark bug as VERIFIED
\n"; $knum++; } if ($status ne "CLOSED") { print " Mark bug as CLOSED
\n"; $knum++; } } } print "

View Bug Activity   |   Format For Printing "; if ( Param("move-enabled") && (defined $::COOKIE{"Bugzilla_login"}) && ($::COOKIE{"Bugzilla_login"} =~ /($movers)/) ){ print "  |  " ."\n"; } print "

"; print qq|
Description: Opened: $bug{'creation_ts'}

|; print $bug{'long_desc'}; print "
\n"; # To add back option of editing the long description, insert after the above # long_list.cgi line: # Edit Long Description navigation_header(); PutFooter(); 1;