REGRESSION (r243153): [iOS] TestWebKitAPI.FocusPreservationTests.ChangingFocusedNodeR...
[WebKit-https.git] / Websites / bugs.webkit.org / editworkflow.cgi
1 #!/usr/bin/perl -T
2 # This Source Code Form is subject to the terms of the Mozilla Public
3 # License, v. 2.0. If a copy of the MPL was not distributed with this
4 # file, You can obtain one at http://mozilla.org/MPL/2.0/.
5 #
6 # This Source Code Form is "Incompatible With Secondary Licenses", as
7 # defined by the Mozilla Public License, v. 2.0.
8
9 use 5.10.1;
10 use strict;
11 use warnings;
12
13 use lib qw(. lib);
14
15 use Bugzilla;
16 use Bugzilla::Constants;
17 use Bugzilla::Error;
18 use Bugzilla::Token;
19 use Bugzilla::Status;
20
21 my $cgi = Bugzilla->cgi;
22 my $dbh = Bugzilla->dbh;
23 my $user = Bugzilla->login(LOGIN_REQUIRED);
24
25 print $cgi->header();
26
27 $user->in_group('admin')
28   || ThrowUserError('auth_failure', {group  => 'admin',
29                                      action => 'modify',
30                                      object => 'workflow'});
31
32 my $action = $cgi->param('action') || 'edit';
33 my $token = $cgi->param('token');
34
35 sub get_workflow {
36     my $dbh = Bugzilla->dbh;
37     my $workflow = $dbh->selectall_arrayref('SELECT old_status, new_status, require_comment
38                                              FROM status_workflow');
39     my %workflow;
40     foreach my $row (@$workflow) {
41         my ($old, $new, $type) = @$row;
42         $workflow{$old || 0}{$new} = $type;
43     }
44     return \%workflow;
45 }
46
47 sub load_template {
48     my ($filename, $message) = @_;
49     my $template = Bugzilla->template;
50     my $vars = {};
51
52     $vars->{'statuses'} = [Bugzilla::Status->get_all];
53     $vars->{'workflow'} = get_workflow();
54     $vars->{'token'} = issue_session_token("workflow_$filename");
55     $vars->{'message'} = $message;
56
57     $template->process("admin/workflow/$filename.html.tmpl", $vars)
58       || ThrowTemplateError($template->error());
59     exit;
60 }
61
62 if ($action eq 'edit') {
63     load_template('edit');
64 }
65 elsif ($action eq 'update') {
66     check_token_data($token, 'workflow_edit');
67     my $statuses = [Bugzilla::Status->get_all];
68     my $workflow = get_workflow();
69
70     my $sth_insert = $dbh->prepare('INSERT INTO status_workflow (old_status, new_status)
71                                     VALUES (?, ?)');
72     my $sth_delete = $dbh->prepare('DELETE FROM status_workflow
73                                     WHERE old_status = ? AND new_status = ?');
74     my $sth_delnul = $dbh->prepare('DELETE FROM status_workflow
75                                     WHERE old_status IS NULL AND new_status = ?');
76
77     # Part 1: Initial bug statuses.
78     foreach my $new (@$statuses) {
79         if ($cgi->param('w_0_' . $new->id)) {
80             $sth_insert->execute(undef, $new->id)
81               unless defined $workflow->{0}->{$new->id};
82         }
83         else {
84             $sth_delnul->execute($new->id);
85         }
86     }
87
88     # Part 2: Bug status changes.
89     foreach my $old (@$statuses) {
90         foreach my $new (@$statuses) {
91             next if $old->id == $new->id;
92
93             # All transitions to 'duplicate_or_move_bug_status' must be valid.
94             if ($cgi->param('w_' . $old->id . '_' . $new->id)
95                 || ($new->name eq Bugzilla->params->{'duplicate_or_move_bug_status'}))
96             {
97                 $sth_insert->execute($old->id, $new->id)
98                   unless defined $workflow->{$old->id}->{$new->id};
99             }
100             else {
101                 $sth_delete->execute($old->id, $new->id);
102             }
103         }
104     }
105     delete_token($token);
106     load_template('edit', 'workflow_updated');
107 }
108 elsif ($action eq 'edit_comment') {
109     load_template('comment');
110 }
111 elsif ($action eq 'update_comment') {
112     check_token_data($token, 'workflow_comment');
113     my $workflow = get_workflow();
114
115     my $sth_update = $dbh->prepare('UPDATE status_workflow SET require_comment = ?
116                                     WHERE old_status = ? AND new_status = ?');
117     my $sth_updnul = $dbh->prepare('UPDATE status_workflow SET require_comment = ?
118                                     WHERE old_status IS NULL AND new_status = ?');
119
120     foreach my $old (keys %$workflow) {
121         # Hashes cannot have undef as a key, so we use 0. But the DB
122         # must store undef, for referential integrity.
123         my $old_id_for_db = $old || undef;
124         foreach my $new (keys %{$workflow->{$old}}) {
125             my $comment_required = $cgi->param("c_${old}_$new") ? 1 : 0;
126             next if ($workflow->{$old}->{$new} == $comment_required);
127             if ($old_id_for_db) {
128                 $sth_update->execute($comment_required, $old_id_for_db, $new);
129             }
130             else {
131                 $sth_updnul->execute($comment_required, $new);
132             }
133         }
134     }
135     delete_token($token);
136     load_template('comment', 'workflow_updated');
137 }
138 else {
139     ThrowUserError('unknown_action', {action => $action});
140 }