2010-08-30 Alejandro G. Castro <alex@igalia.com>
[WebKit-https.git] / BugsSite / editmilestones.cgi
1 #!/usr/bin/env perl -wT
2 # -*- Mode: perl; indent-tabs-mode: nil -*-
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 Initial Developer of the Original Code is Matt Masson.
15 # Portions created by Matt Masson are Copyright (C) 2000 Matt Masson.
16 # All Rights Reserved.
17 #
18 # Contributors : Matt Masson <matthew@zeroknowledge.com>
19 #                Gavin Shelley <bugzilla@chimpychompy.org>
20 #                Frédéric Buclin <LpSolit@gmail.com>
21
22 use strict;
23 use lib qw(. lib);
24
25 use Bugzilla;
26 use Bugzilla::Constants;
27 use Bugzilla::Util;
28 use Bugzilla::Error;
29 use Bugzilla::Milestone;
30 use Bugzilla::Token;
31
32 my $cgi = Bugzilla->cgi;
33 my $dbh = Bugzilla->dbh;
34 my $template = Bugzilla->template;
35 my $vars = {};
36 # There is only one section about milestones in the documentation,
37 # so all actions point to the same page.
38 $vars->{'doc_section'} = 'milestones.html';
39
40 #
41 # Preliminary checks:
42 #
43
44 my $user = Bugzilla->login(LOGIN_REQUIRED);
45
46 print $cgi->header();
47
48 $user->in_group('editcomponents')
49   || scalar(@{$user->get_products_by_permission('editcomponents')})
50   || ThrowUserError("auth_failure", {group  => "editcomponents",
51                                      action => "edit",
52                                      object => "milestones"});
53
54 #
55 # often used variables
56 #
57 my $product_name   = trim($cgi->param('product')     || '');
58 my $milestone_name = trim($cgi->param('milestone')   || '');
59 my $sortkey        = trim($cgi->param('sortkey')     || 0);
60 my $action         = trim($cgi->param('action')      || '');
61 my $showbugcounts = (defined $cgi->param('showbugcounts'));
62 my $token          = $cgi->param('token');
63
64 #
65 # product = '' -> Show nice list of products
66 #
67
68 unless ($product_name) {
69     my $selectable_products = $user->get_selectable_products;
70     # If the user has editcomponents privs for some products only,
71     # we have to restrict the list of products to display.
72     unless ($user->in_group('editcomponents')) {
73         $selectable_products = $user->get_products_by_permission('editcomponents');
74     }
75     $vars->{'products'} = $selectable_products;
76     $vars->{'showbugcounts'} = $showbugcounts;
77
78     $template->process("admin/milestones/select-product.html.tmpl", $vars)
79       || ThrowTemplateError($template->error());
80     exit;
81 }
82
83 my $product = $user->check_can_admin_product($product_name);
84
85 #
86 # action='' -> Show nice list of milestones
87 #
88
89 unless ($action) {
90
91     $vars->{'showbugcounts'} = $showbugcounts;
92     $vars->{'product'} = $product;
93     $template->process("admin/milestones/list.html.tmpl", $vars)
94       || ThrowTemplateError($template->error());
95     exit;
96 }
97
98 #
99 # action='add' -> present form for parameters for new milestone
100 #
101 # (next action will be 'new')
102 #
103
104 if ($action eq 'add') {
105     $vars->{'token'} = issue_session_token('add_milestone');
106     $vars->{'product'} = $product;
107     $template->process("admin/milestones/create.html.tmpl", $vars)
108       || ThrowTemplateError($template->error());
109     exit;
110 }
111
112 #
113 # action='new' -> add milestone entered in the 'action=add' screen
114 #
115
116 if ($action eq 'new') {
117     check_token_data($token, 'add_milestone');
118     my $milestone = Bugzilla::Milestone->create({ name    => $milestone_name,
119                                                   product => $product,
120                                                   sortkey => $sortkey });
121     delete_token($token);
122
123     $vars->{'message'} = 'milestone_created';
124     $vars->{'milestone'} = $milestone;
125     $vars->{'product'} = $product;
126     $template->process("admin/milestones/list.html.tmpl", $vars)
127       || ThrowTemplateError($template->error());
128     exit;
129 }
130
131 #
132 # action='del' -> ask if user really wants to delete
133 #
134 # (next action would be 'delete')
135 #
136
137 if ($action eq 'del') {
138     my $milestone = Bugzilla::Milestone->check({ product => $product,
139                                                  name    => $milestone_name });
140     
141     $vars->{'milestone'} = $milestone;
142     $vars->{'product'} = $product;
143
144     # The default milestone cannot be deleted.
145     if ($product->default_milestone eq $milestone->name) {
146         ThrowUserError("milestone_is_default", { milestone => $milestone });
147     }
148     $vars->{'token'} = issue_session_token('delete_milestone');
149
150     $template->process("admin/milestones/confirm-delete.html.tmpl", $vars)
151       || ThrowTemplateError($template->error());
152     exit;
153 }
154
155 #
156 # action='delete' -> really delete the milestone
157 #
158
159 if ($action eq 'delete') {
160     check_token_data($token, 'delete_milestone');
161     my $milestone = Bugzilla::Milestone->check({ product => $product,
162                                                  name    => $milestone_name });
163     $milestone->remove_from_db;
164     delete_token($token);
165
166     $vars->{'message'} = 'milestone_deleted';
167     $vars->{'milestone'} = $milestone;
168     $vars->{'product'} = $product;
169     $vars->{'no_edit_milestone_link'} = 1;
170
171     $template->process("admin/milestones/list.html.tmpl", $vars)
172       || ThrowTemplateError($template->error());
173     exit;
174 }
175
176 #
177 # action='edit' -> present the edit milestone form
178 #
179 # (next action would be 'update')
180 #
181
182 if ($action eq 'edit') {
183
184     my $milestone = Bugzilla::Milestone->check({ product => $product,
185                                                  name    => $milestone_name });
186
187     $vars->{'milestone'} = $milestone;
188     $vars->{'product'} = $product;
189     $vars->{'token'} = issue_session_token('edit_milestone');
190
191     $template->process("admin/milestones/edit.html.tmpl", $vars)
192       || ThrowTemplateError($template->error());
193     exit;
194 }
195
196 #
197 # action='update' -> update the milestone
198 #
199
200 if ($action eq 'update') {
201     check_token_data($token, 'edit_milestone');
202     my $milestone_old_name = trim($cgi->param('milestoneold') || '');
203     my $milestone = Bugzilla::Milestone->check({ product => $product,
204                                                  name    => $milestone_old_name });
205
206     $milestone->set_name($milestone_name);
207     $milestone->set_sortkey($sortkey);
208     my $changes = $milestone->update();
209
210     delete_token($token);
211
212     $vars->{'message'} = 'milestone_updated';
213     $vars->{'milestone'} = $milestone;
214     $vars->{'product'} = $product;
215     $vars->{'changes'} = $changes;
216     $template->process("admin/milestones/list.html.tmpl", $vars)
217       || ThrowTemplateError($template->error());
218     exit;
219 }
220
221 #
222 # No valid action found
223 #
224 ThrowUserError('no_valid_action', {'field' => "target_milestone"});