Commit working changes from build.webkit.org
[WebKit-https.git] / Websites / bugs.webkit.org / editclassifications.cgi
1 #!/usr/bin/env perl -wT
2 # -*- Mode: perl; indent-tabs-mode: nil; cperl-indent-level: 4 -*-
3 #
4 # The contents of this file are subject to the Mozilla Public
5 # License Version 1.1 (the "License"); you may not use this file
6 # except in compliance with the License. You may obtain a copy of
7 # the License at http://www.mozilla.org/MPL/
8 #
9 # Software distributed under the License is distributed on an "AS
10 # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
11 # implied. See the License for the specific language governing
12 # rights and limitations under the License.
13 #
14 # The Original Code is the Bugzilla Bug Tracking System.
15 #
16 # The Initial Developer of the Original Code is Albert Ting
17 #
18 # Contributor(s): Albert Ting <alt@sonic.net>
19 #                 Max Kanat-Alexander <mkanat@bugzilla.org>
20 #                 Frédéric Buclin <LpSolit@gmail.com>
21
22
23 use strict;
24 use lib qw(. lib);
25
26 use Bugzilla;
27 use Bugzilla::Constants;
28 use Bugzilla::Util;
29 use Bugzilla::Error;
30 use Bugzilla::Classification;
31 use Bugzilla::Token;
32
33 my $dbh = Bugzilla->dbh;
34 my $cgi = Bugzilla->cgi;
35 my $template = Bugzilla->template;
36 local our $vars = {};
37
38 sub LoadTemplate {
39     my $action = shift;
40     my $cgi = Bugzilla->cgi;
41     my $template = Bugzilla->template;
42
43     $vars->{'classifications'} = [Bugzilla::Classification->get_all]
44       if ($action eq 'select');
45     # There is currently only one section about classifications,
46     # so all pages point to it. Let's define it here.
47     $vars->{'doc_section'} = 'classifications.html';
48
49     $action =~ /(\w+)/;
50     $action = $1;
51     print $cgi->header();
52     $template->process("admin/classifications/$action.html.tmpl", $vars)
53       || ThrowTemplateError($template->error());
54     exit;
55 }
56
57 #
58 # Preliminary checks:
59 #
60
61 Bugzilla->login(LOGIN_REQUIRED);
62
63 print $cgi->header();
64
65 Bugzilla->user->in_group('editclassifications')
66   || ThrowUserError("auth_failure", {group  => "editclassifications",
67                                      action => "edit",
68                                      object => "classifications"});
69
70 ThrowUserError("auth_classification_not_enabled") 
71     unless Bugzilla->params->{"useclassification"};
72
73 #
74 # often used variables
75 #
76 my $action     = trim($cgi->param('action')         || '');
77 my $class_name = trim($cgi->param('classification') || '');
78 my $token      = $cgi->param('token');
79
80 #
81 # action='' -> Show nice list of classifications
82 #
83 LoadTemplate('select') unless $action;
84
85 #
86 # action='add' -> present form for parameters for new classification
87 #
88 # (next action will be 'new')
89 #
90
91 if ($action eq 'add') {
92     $vars->{'token'} = issue_session_token('add_classification');
93     LoadTemplate($action);
94 }
95
96 #
97 # action='new' -> add classification entered in the 'action=add' screen
98 #
99
100 if ($action eq 'new') {
101     check_token_data($token, 'add_classification');
102
103     my $classification =
104       Bugzilla::Classification->create({name        => $class_name,
105                                         description => scalar $cgi->param('description'),
106                                         sortkey     => scalar $cgi->param('sortkey')});
107
108     delete_token($token);
109
110     $vars->{'message'} = 'classification_created';
111     $vars->{'classification'} = $classification;
112     $vars->{'classifications'} = [Bugzilla::Classification->get_all];
113     $vars->{'token'} = issue_session_token('reclassify_classifications');
114     LoadTemplate('reclassify');
115 }
116
117 #
118 # action='del' -> ask if user really wants to delete
119 #
120 # (next action would be 'delete')
121 #
122
123 if ($action eq 'del') {
124
125     my $classification = Bugzilla::Classification->check($class_name);
126
127     if ($classification->id == 1) {
128         ThrowUserError("classification_not_deletable");
129     }
130
131     if ($classification->product_count()) {
132         ThrowUserError("classification_has_products");
133     }
134
135     $vars->{'classification'} = $classification;
136     $vars->{'token'} = issue_session_token('delete_classification');
137
138     LoadTemplate($action);
139 }
140
141 #
142 # action='delete' -> really delete the classification
143 #
144
145 if ($action eq 'delete') {
146     check_token_data($token, 'delete_classification');
147
148     my $classification = Bugzilla::Classification->check($class_name);
149     $classification->remove_from_db;
150     delete_token($token);
151
152     $vars->{'message'} = 'classification_deleted';
153     $vars->{'classification'} = $classification;
154     LoadTemplate('select');
155 }
156
157 #
158 # action='edit' -> present the edit classifications from
159 #
160 # (next action would be 'update')
161 #
162
163 if ($action eq 'edit') {
164     my $classification = Bugzilla::Classification->check($class_name);
165
166     $vars->{'classification'} = $classification;
167     $vars->{'token'} = issue_session_token('edit_classification');
168
169     LoadTemplate($action);
170 }
171
172 #
173 # action='update' -> update the classification
174 #
175
176 if ($action eq 'update') {
177     check_token_data($token, 'edit_classification');
178
179     my $class_old_name = trim($cgi->param('classificationold') || '');
180     my $classification = Bugzilla::Classification->check($class_old_name);
181
182     $classification->set_name($class_name);
183     $classification->set_description(scalar $cgi->param('description'));
184     $classification->set_sortkey(scalar $cgi->param('sortkey'));
185
186     my $changes = $classification->update;
187     delete_token($token);
188
189     $vars->{'message'} = 'classification_updated';
190     $vars->{'classification'} = $classification;
191     $vars->{'changes'} = $changes;
192     LoadTemplate('select');
193 }
194
195 #
196 # action='reclassify' -> reclassify products for the classification
197 #
198
199 if ($action eq 'reclassify') {
200     my $classification = Bugzilla::Classification->check($class_name);
201    
202     my $sth = $dbh->prepare("UPDATE products SET classification_id = ?
203                              WHERE name = ?");
204
205     if (defined $cgi->param('add_products')) {
206         check_token_data($token, 'reclassify_classifications');
207         if (defined $cgi->param('prodlist')) {
208             foreach my $prod ($cgi->param("prodlist")) {
209                 trick_taint($prod);
210                 $sth->execute($classification->id, $prod);
211             }
212         }
213         delete_token($token);
214     } elsif (defined $cgi->param('remove_products')) {
215         check_token_data($token, 'reclassify_classifications');
216         if (defined $cgi->param('myprodlist')) {
217             foreach my $prod ($cgi->param("myprodlist")) {
218                 trick_taint($prod);
219                 $sth->execute(1,$prod);
220             }
221         }
222         delete_token($token);
223     }
224
225     $vars->{'classifications'} = [Bugzilla::Classification->get_all];
226     $vars->{'classification'} = $classification;
227     $vars->{'token'} = issue_session_token('reclassify_classifications');
228
229     LoadTemplate($action);
230 }
231
232 #
233 # No valid action found
234 #
235
236 ThrowUserError('unknown_action', {action => $action});