summaryrefslogtreecommitdiffstats
path: root/extensions/GuidedBugEntry/Extension.pm
blob: 796c1ad3bfa9fcd1976e4bbcf202f378ed7d679f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# -*- 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 GuidedBugEntry Bugzilla Extension.
#
# The Initial Developer of the Original Code is the Mozilla Foundation
# Portions created by the Initial Developer are Copyright (C) 2011 the
# Initial Developer. All Rights Reserved.
#
# Contributor(s):
#   Byron Jones <glob@mozilla.com>

package Bugzilla::Extension::GuidedBugEntry;
use strict;
use base qw(Bugzilla::Extension);

use Bugzilla::Token;
use Bugzilla::Error;
use Bugzilla::Status;
use Bugzilla::Util 'url_quote';
use Bugzilla::UserAgent;

our $VERSION = '1';

sub enter_bug_start {
    my ($self, $args) = @_;
    my $vars = $args->{vars};
    my $template = Bugzilla->template;
    my $cgi = Bugzilla->cgi;
    my $user = Bugzilla->user;

    # hack for skipping old guided code when enabled
    $vars->{'disable_guided'} = 1;

    # force guided format for new users
    my $format = $cgi->param('format') || '';
    if (
        $format eq 'guided' ||
        (
            $format eq '' &&
            !$user->in_group('canconfirm')
        )
    ) {
        # skip the first step if a product is provided
        if ($cgi->param('product')) {
            print $cgi->redirect('enter_bug.cgi?format=guided#h=dupes|' .
                url_quote($cgi->param('product')));
            exit;
        }

        $self->_init_vars($vars);
        print $cgi->header();
        $template->process('guided/guided.html.tmpl', $vars)
          || ThrowTemplateError($template->error());          
        exit;       
    }

    # we use the __default__ format to bypass the guided entry
    # it isn't understood upstream, so remove it once a product
    # has been selected.
    if (
        ($cgi->param('format') && $cgi->param('format') eq "__default__")
        && ($cgi->param('product') && $cgi->param('product') ne '')
    ) {
        $cgi->delete('format') 
    }
}

sub _init_vars {
    my ($self, $vars) = @_;
    my $user = Bugzilla->user;

    my @enterable_products = @{$user->get_enterable_products};
    ThrowUserError('no_products') unless scalar(@enterable_products);

    my @classifications = ({object => undef, products => \@enterable_products});

    my $class;
    foreach my $product (@enterable_products) {
        $class->{$product->classification_id}->{'object'} ||=
            new Bugzilla::Classification($product->classification_id);
        push(@{$class->{$product->classification_id}->{'products'}}, $product);
    }
    @classifications =
        sort {
            $a->{'object'}->sortkey <=> $b->{'object'}->sortkey
            || lc($a->{'object'}->name) cmp lc($b->{'object'}->name)
        } (values %$class);
    $vars->{'classifications'} = \@classifications;

    my @open_states = BUG_STATE_OPEN();
    $vars->{'open_states'} = \@open_states;

    $vars->{'token'} = issue_session_token('create_bug');

    $vars->{'platform'} = detect_platform();
    $vars->{'op_sys'} = detect_op_sys();
}

sub page_before_template {
    my ($self, $args) = @_;
    my $page = $args->{'page_id'};
    my $vars = $args->{'vars'};

    return unless $page eq 'guided_products.js';

    # import product -> security group mappings from the BMO ext

    our %product_sec_groups;
    eval q#use Bugzilla::Extension::BMO::Data '%product_sec_groups'#;
    return if $@;

    $vars->{'products'} = \%product_sec_groups;
}

__PACKAGE__->NAME;