diff options
Diffstat (limited to 'enter_bug.cgi')
-rwxr-xr-x | enter_bug.cgi | 252 |
1 files changed, 42 insertions, 210 deletions
diff --git a/enter_bug.cgi b/enter_bug.cgi index 5b684a965..2ee23897b 100755 --- a/enter_bug.cgi +++ b/enter_bug.cgi @@ -51,6 +51,7 @@ use Bugzilla::Keyword; use Bugzilla::Token; use Bugzilla::Field; use Bugzilla::Status; +use Bugzilla::UserAgent; my $user = Bugzilla->login(LOGIN_REQUIRED); @@ -62,9 +63,21 @@ my $dbh = Bugzilla->dbh; my $template = Bugzilla->template; my $vars = {}; +# BMO add a hook for the guided extension +Bugzilla::Hook::process('enter_bug_start', { vars => $vars }); + # All pages point to the same part of the documentation. $vars->{'doc_section'} = 'bugreports.html'; +if (!$vars->{'disable_guided'}) { + # Purpose: force guided format for newbies + $cgi->param(-name=>'format', -value=>'guided') + if !$cgi->param('format') && !$user->in_group('canconfirm'); + + $cgi->delete('format') + if ($cgi->param('format') && ($cgi->param('format') eq "__default__")); +} + my $product_name = trim($cgi->param('product') || ''); # Will contain the product object the bug is created in. my $product; @@ -74,8 +87,14 @@ if ($product_name eq '') { my @enterable_products = @{$user->get_enterable_products}; ThrowUserError('no_products') unless scalar(@enterable_products); - my $classification = Bugzilla->params->{'useclassification'} ? - scalar($cgi->param('classification')) : '__all'; + # MOZILLA CUSTOMIZATION + # skip the classification selection page + my $classification; + if (Bugzilla->params->{'useclassification'}) { + $classification = scalar($cgi->param('classification')) || '__all'; + } else { + $classification = '__all'; + } # Unless a real classification name is given, we sort products # by classification. @@ -158,6 +177,9 @@ if ($product_name eq '') { # to enter a bug against this product. $product = $user->can_enter_product($product || $product_name, THROW_ERROR); +# Preloading certain attributes such as components/versions/milestones/flags +Bugzilla::Product::preload([ $product ], 1, { is_active => 1 }); + ############################################################################## # Useful Subroutines ############################################################################## @@ -166,198 +188,6 @@ sub formvalue { return Bugzilla->cgi->param($name) || $default || ""; } -# Takes the name of a field and a list of possible values for that -# field. Returns the first value in the list that is actually a -# valid value for that field. -# The field should be named after its DB table. -# Returns undef if none of the platforms match. -sub pick_valid_field_value (@) { - my ($field, @values) = @_; - my $dbh = Bugzilla->dbh; - - foreach my $value (@values) { - return $value if $dbh->selectrow_array( - "SELECT 1 FROM $field WHERE value = ?", undef, $value); - } - return undef; -} - -sub pickplatform { - return formvalue("rep_platform") if formvalue("rep_platform"); - - my @platform; - - if (Bugzilla->params->{'defaultplatform'}) { - @platform = Bugzilla->params->{'defaultplatform'}; - } else { - # If @platform is a list, this function will return the first - # item in the list that is a valid platform choice. If - # no choice is valid, we return "Other". - for ($ENV{'HTTP_USER_AGENT'}) { - #PowerPC - /\(.*PowerPC.*\)/i && do {push @platform, ("PowerPC", "Macintosh");}; - #AMD64, Intel x86_64 - /\(.*amd64.*\)/ && do {push @platform, ("AMD64", "x86_64", "PC");}; - /\(.*x86_64.*\)/ && do {push @platform, ("AMD64", "x86_64", "PC");}; - #Intel Itanium - /\(.*IA64.*\)/ && do {push @platform, "IA64";}; - #Intel x86 - /\(.*Intel.*\)/ && do {push @platform, ("IA32", "x86", "PC");}; - /\(.*[ix0-9]86.*\)/ && do {push @platform, ("IA32", "x86", "PC");}; - #Versions of Windows that only run on Intel x86 - /\(.*Win(?:dows |)[39M].*\)/ && do {push @platform, ("IA32", "x86", "PC");}; - /\(.*Win(?:dows |)16.*\)/ && do {push @platform, ("IA32", "x86", "PC");}; - #Sparc - /\(.*sparc.*\)/ && do {push @platform, ("Sparc", "Sun");}; - /\(.*sun4.*\)/ && do {push @platform, ("Sparc", "Sun");}; - #Alpha - /\(.*AXP.*\)/i && do {push @platform, ("Alpha", "DEC");}; - /\(.*[ _]Alpha.\D/i && do {push @platform, ("Alpha", "DEC");}; - /\(.*[ _]Alpha\)/i && do {push @platform, ("Alpha", "DEC");}; - #MIPS - /\(.*IRIX.*\)/i && do {push @platform, ("MIPS", "SGI");}; - /\(.*MIPS.*\)/i && do {push @platform, ("MIPS", "SGI");}; - #68k - /\(.*68K.*\)/ && do {push @platform, ("68k", "Macintosh");}; - /\(.*680[x0]0.*\)/ && do {push @platform, ("68k", "Macintosh");}; - #HP - /\(.*9000.*\)/ && do {push @platform, ("PA-RISC", "HP");}; - #ARM - /\(.*ARM.*\)/ && do {push @platform, ("ARM", "PocketPC");}; - #PocketPC intentionally before PowerPC - /\(.*Windows CE.*PPC.*\)/ && do {push @platform, ("ARM", "PocketPC");}; - #PowerPC - /\(.*PPC.*\)/ && do {push @platform, ("PowerPC", "Macintosh");}; - /\(.*AIX.*\)/ && do {push @platform, ("PowerPC", "Macintosh");}; - #Stereotypical and broken - /\(.*Windows CE.*\)/ && do {push @platform, ("ARM", "PocketPC");}; - /\(.*Macintosh.*\)/ && do {push @platform, ("68k", "Macintosh");}; - /\(.*Mac OS [89].*\)/ && do {push @platform, ("68k", "Macintosh");}; - /\(.*Win64.*\)/ && do {push @platform, "IA64";}; - /\(Win.*\)/ && do {push @platform, ("IA32", "x86", "PC");}; - /\(.*Win(?:dows[ -])NT.*\)/ && do {push @platform, ("IA32", "x86", "PC");}; - /\(.*OSF.*\)/ && do {push @platform, ("Alpha", "DEC");}; - /\(.*HP-?UX.*\)/i && do {push @platform, ("PA-RISC", "HP");}; - /\(.*IRIX.*\)/i && do {push @platform, ("MIPS", "SGI");}; - /\(.*(SunOS|Solaris).*\)/ && do {push @platform, ("Sparc", "Sun");}; - #Braindead old browsers who didn't follow convention: - /Amiga/ && do {push @platform, ("68k", "Macintosh");}; - /WinMosaic/ && do {push @platform, ("IA32", "x86", "PC");}; - } - } - - return pick_valid_field_value('rep_platform', @platform) || "Other"; -} - -sub pickos { - if (formvalue('op_sys') ne "") { - return formvalue('op_sys'); - } - - my @os = (); - - if (Bugzilla->params->{'defaultopsys'}) { - @os = Bugzilla->params->{'defaultopsys'}; - } else { - # This function will return the first - # item in @os that is a valid platform choice. If - # no choice is valid, we return "Other". - for ($ENV{'HTTP_USER_AGENT'}) { - /\(.*IRIX.*\)/ && do {push @os, "IRIX";}; - /\(.*OSF.*\)/ && do {push @os, "OSF/1";}; - /\(.*Linux.*\)/ && do {push @os, "Linux";}; - /\(.*Solaris.*\)/ && do {push @os, "Solaris";}; - /\(.*SunOS.*\)/ && do { - /\(.*SunOS 5.11.*\)/ && do {push @os, ("OpenSolaris", "Opensolaris", "Solaris 11");}; - /\(.*SunOS 5.10.*\)/ && do {push @os, "Solaris 10";}; - /\(.*SunOS 5.9.*\)/ && do {push @os, "Solaris 9";}; - /\(.*SunOS 5.8.*\)/ && do {push @os, "Solaris 8";}; - /\(.*SunOS 5.7.*\)/ && do {push @os, "Solaris 7";}; - /\(.*SunOS 5.6.*\)/ && do {push @os, "Solaris 6";}; - /\(.*SunOS 5.5.*\)/ && do {push @os, "Solaris 5";}; - /\(.*SunOS 5.*\)/ && do {push @os, "Solaris";}; - /\(.*SunOS.*sun4u.*\)/ && do {push @os, "Solaris";}; - /\(.*SunOS.*i86pc.*\)/ && do {push @os, "Solaris";}; - /\(.*SunOS.*\)/ && do {push @os, "SunOS";}; - }; - /\(.*HP-?UX.*\)/ && do {push @os, "HP-UX";}; - /\(.*BSD.*\)/ && do { - /\(.*BSD\/(?:OS|386).*\)/ && do {push @os, "BSDI";}; - /\(.*FreeBSD.*\)/ && do {push @os, "FreeBSD";}; - /\(.*OpenBSD.*\)/ && do {push @os, "OpenBSD";}; - /\(.*NetBSD.*\)/ && do {push @os, "NetBSD";}; - }; - /\(.*BeOS.*\)/ && do {push @os, "BeOS";}; - /\(.*AIX.*\)/ && do {push @os, "AIX";}; - /\(.*OS\/2.*\)/ && do {push @os, "OS/2";}; - /\(.*QNX.*\)/ && do {push @os, "Neutrino";}; - /\(.*VMS.*\)/ && do {push @os, "OpenVMS";}; - /\(.*Win.*\)/ && do { - /\(.*Windows XP.*\)/ && do {push @os, "Windows XP";}; - /\(.*Windows NT 6\.2.*\)/ && do {push @os, "Windows 8";}; - /\(.*Windows NT 6\.1.*\)/ && do {push @os, "Windows 7";}; - /\(.*Windows NT 6\.0.*\)/ && do {push @os, "Windows Vista";}; - /\(.*Windows NT 5\.2.*\)/ && do {push @os, "Windows Server 2003";}; - /\(.*Windows NT 5\.1.*\)/ && do {push @os, "Windows XP";}; - /\(.*Windows 2000.*\)/ && do {push @os, "Windows 2000";}; - /\(.*Windows NT 5.*\)/ && do {push @os, "Windows 2000";}; - /\(.*Win.*9[8x].*4\.9.*\)/ && do {push @os, "Windows ME";}; - /\(.*Win(?:dows |)M[Ee].*\)/ && do {push @os, "Windows ME";}; - /\(.*Win(?:dows |)98.*\)/ && do {push @os, "Windows 98";}; - /\(.*Win(?:dows |)95.*\)/ && do {push @os, "Windows 95";}; - /\(.*Win(?:dows |)16.*\)/ && do {push @os, "Windows 3.1";}; - /\(.*Win(?:dows[ -]|)NT.*\)/ && do {push @os, "Windows NT";}; - /\(.*Windows.*NT.*\)/ && do {push @os, "Windows NT";}; - }; - /\(.*Mac OS X.*\)/ && do { - /\(.*Mac OS X (?:|Mach-O |\()10.8.*\)/ && do {push @os, "Mac OS X 10.8";}; - /\(.*Mac OS X (?:|Mach-O |\()10.7.*\)/ && do {push @os, "Mac OS X 10.7";}; - /\(.*Mac OS X (?:|Mach-O |\()10.6.*\)/ && do {push @os, "Mac OS X 10.6";}; - /\(.*Mac OS X (?:|Mach-O |\()10.5.*\)/ && do {push @os, "Mac OS X 10.5";}; - /\(.*Mac OS X (?:|Mach-O |\()10.4.*\)/ && do {push @os, "Mac OS X 10.4";}; - /\(.*Mac OS X (?:|Mach-O |\()10.3.*\)/ && do {push @os, "Mac OS X 10.3";}; - /\(.*Mac OS X (?:|Mach-O |\()10.2.*\)/ && do {push @os, "Mac OS X 10.2";}; - /\(.*Mac OS X (?:|Mach-O |\()10.1.*\)/ && do {push @os, "Mac OS X 10.1";}; - # Unfortunately, OS X 10.4 was the first to support Intel. This is - # fallback support because some browsers refused to include the OS - # Version. - /\(.*Intel.*Mac OS X.*\)/ && do {push @os, "Mac OS X 10.4";}; - # OS X 10.3 is the most likely default version of PowerPC Macs - # OS X 10.0 is more for configurations which didn't setup 10.x versions - /\(.*Mac OS X.*\)/ && do {push @os, ("Mac OS X 10.3", "Mac OS X 10.0", "Mac OS X");}; - }; - /\(.*32bit.*\)/ && do {push @os, "Windows 95";}; - /\(.*16bit.*\)/ && do {push @os, "Windows 3.1";}; - /\(.*Mac OS \d.*\)/ && do { - /\(.*Mac OS 9.*\)/ && do {push @os, ("Mac System 9.x", "Mac System 9.0");}; - /\(.*Mac OS 8\.6.*\)/ && do {push @os, ("Mac System 8.6", "Mac System 8.5");}; - /\(.*Mac OS 8\.5.*\)/ && do {push @os, "Mac System 8.5";}; - /\(.*Mac OS 8\.1.*\)/ && do {push @os, ("Mac System 8.1", "Mac System 8.0");}; - /\(.*Mac OS 8\.0.*\)/ && do {push @os, "Mac System 8.0";}; - /\(.*Mac OS 8[^.].*\)/ && do {push @os, "Mac System 8.0";}; - /\(.*Mac OS 8.*\)/ && do {push @os, "Mac System 8.6";}; - }; - /\(.*Darwin.*\)/ && do {push @os, ("Mac OS X 10.0", "Mac OS X");}; - # Silly - /\(.*Mac.*\)/ && do { - /\(.*Mac.*PowerPC.*\)/ && do {push @os, "Mac System 9.x";}; - /\(.*Mac.*PPC.*\)/ && do {push @os, "Mac System 9.x";}; - /\(.*Mac.*68k.*\)/ && do {push @os, "Mac System 8.0";}; - }; - # Evil - /Amiga/i && do {push @os, "Other";}; - /WinMosaic/ && do {push @os, "Windows 95";}; - /\(.*PowerPC.*\)/ && do {push @os, "Mac System 9.x";}; - /\(.*PPC.*\)/ && do {push @os, "Mac System 9.x";}; - /\(.*68K.*\)/ && do {push @os, "Mac System 8.0";}; - } - } - - push(@os, "Windows") if grep(/^Windows /, @os); - push(@os, "Mac OS") if grep(/^Mac /, @os); - - return pick_valid_field_value('op_sys', @os) || "Other"; -} ############################################################################## # End of subroutines ############################################################################## @@ -420,19 +250,20 @@ $default{'product'} = $product->name; if ($cloned_bug_id) { - $default{'component_'} = $cloned_bug->component; - $default{'priority'} = $cloned_bug->priority; - $default{'bug_severity'} = $cloned_bug->bug_severity; - $default{'rep_platform'} = $cloned_bug->rep_platform; - $default{'op_sys'} = $cloned_bug->op_sys; - - $vars->{'short_desc'} = $cloned_bug->short_desc; - $vars->{'bug_file_loc'} = $cloned_bug->bug_file_loc; - $vars->{'keywords'} = $cloned_bug->keywords; - $vars->{'dependson'} = join (", ", $cloned_bug_id, @{$cloned_bug->dependson}); - $vars->{'blocked'} = join (", ", @{$cloned_bug->blocked}); - $vars->{'deadline'} = $cloned_bug->deadline; - $vars->{'estimated_time'} = $cloned_bug->estimated_time; + $default{'component_'} = $cloned_bug->component; + $default{'priority'} = $cloned_bug->priority; + $default{'bug_severity'} = $cloned_bug->bug_severity; + $default{'rep_platform'} = $cloned_bug->rep_platform; + $default{'op_sys'} = $cloned_bug->op_sys; + + $vars->{'short_desc'} = $cloned_bug->short_desc; + $vars->{'bug_file_loc'} = $cloned_bug->bug_file_loc; + $vars->{'keywords'} = $cloned_bug->keywords; + $vars->{'dependson'} = join (", ", $cloned_bug_id, @{$cloned_bug->dependson}); + $vars->{'blocked'} = join (", ", @{$cloned_bug->blocked}); + $vars->{'deadline'} = $cloned_bug->deadline; + $vars->{'estimated_time'} = $cloned_bug->estimated_time; + $vars->{'status_whiteboard'} = $cloned_bug->status_whiteboard; if (defined $cloned_bug->cc) { $vars->{'cc'} = join (", ", @{$cloned_bug->cc}); @@ -468,12 +299,13 @@ if ($cloned_bug_id) { } # end of cloned bug entry form else { - $default{'component_'} = formvalue('component'); $default{'priority'} = formvalue('priority', Bugzilla->params->{'defaultpriority'}); $default{'bug_severity'} = formvalue('bug_severity', Bugzilla->params->{'defaultseverity'}); - $default{'rep_platform'} = pickplatform(); - $default{'op_sys'} = pickos(); + $default{'rep_platform'} = formvalue('rep_platform', + Bugzilla->params->{'defaultplatform'} || detect_platform()); + $default{'op_sys'} = formvalue('op_sys', + Bugzilla->params->{'defaultopsys'} || detect_op_sys()); $vars->{'alias'} = formvalue('alias'); $vars->{'short_desc'} = formvalue('short_desc'); |