Unreviewed. Fix individual benchmark description urls to go to in-depth.html instead...
[WebKit-https.git] / Websites / bugs.webkit.org / colchange.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::Util;
18 use Bugzilla::CGI;
19 use Bugzilla::Search::Saved;
20 use Bugzilla::Error;
21 use Bugzilla::Token;
22
23 use Storable qw(dclone);
24
25 # Maps parameters that control columns to the names of columns.
26 use constant COLUMN_PARAMS => {
27     'useclassification'   => ['classification'],
28     'usetargetmilestone'  => ['target_milestone'],
29     'useqacontact'        => ['qa_contact', 'qa_contact_realname'],
30     'usestatuswhiteboard' => ['status_whiteboard'],
31     'timetrackinggroup'   => ['deadline'],
32 };
33
34 # We only show these columns if an object of this type exists in the
35 # database.
36 use constant COLUMN_CLASSES => {
37     'Bugzilla::Flag'    => 'flagtypes.name',
38     'Bugzilla::Keyword' => 'keywords',
39 };
40
41 my $user = Bugzilla->login();
42
43 my $cgi = Bugzilla->cgi;
44 my $template = Bugzilla->template;
45 my $vars = {};
46
47 my $columns = dclone(Bugzilla::Search::COLUMNS);
48
49 # You can't manually select "relevance" as a column you want to see.
50 delete $columns->{'relevance'};
51
52 foreach my $param (keys %{ COLUMN_PARAMS() }) {
53     next if Bugzilla->params->{$param};
54     foreach my $column (@{ COLUMN_PARAMS->{$param} }) {
55         delete $columns->{$column};
56     }
57 }
58
59 foreach my $class (keys %{ COLUMN_CLASSES() }) {
60     eval("use $class; 1;") || die $@;
61     my $column = COLUMN_CLASSES->{$class};
62     delete $columns->{$column} if !$class->any_exist;
63 }
64
65 if (!$user->is_timetracker) {
66     foreach my $column (TIMETRACKING_FIELDS) {
67         delete $columns->{$column};
68     }
69 }
70
71 $vars->{'columns'} = $columns;
72
73 my @collist;
74 if (defined $cgi->param('rememberedquery')) {
75     my $search;
76     if (defined $cgi->param('saved_search')) {
77         $search = new Bugzilla::Search::Saved($cgi->param('saved_search'));
78     }
79
80     my $token = $cgi->param('token');
81     if ($search) {
82         check_hash_token($token, [$search->id, $search->name]);
83     }
84     else {
85         check_hash_token($token, ['default-list']);
86     }
87
88     my $splitheader = 0;
89     if (defined $cgi->param('resetit')) {
90         @collist = DEFAULT_COLUMN_LIST;
91     } else {
92         if (defined $cgi->param("selected_columns")) {
93             @collist = grep { exists $columns->{$_} } 
94                             $cgi->param("selected_columns");
95         }
96         if (defined $cgi->param('splitheader')) {
97             $splitheader = $cgi->param('splitheader')? 1: 0;
98         }
99     }
100     my $list = join(" ", @collist);
101
102     if ($list) {
103         # Only set the cookie if this is not a saved search.
104         # Saved searches have their own column list
105         if (!$cgi->param('save_columns_for_search')) {
106             $cgi->send_cookie(-name => 'COLUMNLIST',
107                               -value => $list,
108                               -expires => 'Fri, 01-Jan-2038 00:00:00 GMT');
109         }
110     }
111     else {
112         $cgi->remove_cookie('COLUMNLIST');
113     }
114     if ($splitheader) {
115         $cgi->send_cookie(-name => 'SPLITHEADER',
116                           -value => $splitheader,
117                           -expires => 'Fri, 01-Jan-2038 00:00:00 GMT');
118     }
119     else {
120         $cgi->remove_cookie('SPLITHEADER');
121     }
122
123     $vars->{'message'} = "change_columns";
124
125     if ($cgi->param('save_columns_for_search')
126         && defined $search && $search->user->id == $user->id)
127     {
128         my $params = new Bugzilla::CGI($search->url);
129         $params->param('columnlist', join(",", @collist));
130         $search->set_url($params->query_string());
131         $search->update();
132     }
133
134     my $params = new Bugzilla::CGI($cgi->param('rememberedquery'));
135     $params->param('columnlist', join(",", @collist));
136     $vars->{'redirect_url'} = "buglist.cgi?".$params->query_string();
137
138
139     # If we're running on Microsoft IIS, $cgi->redirect discards
140     # the Set-Cookie lines. In mod_perl, $cgi->redirect with cookies
141     # causes the page to be rendered as text/plain.
142     # Workaround is to use the old-fashioned  redirection mechanism. 
143     # See bug 214466 and bug 376044 for details.
144     if ($ENV{'MOD_PERL'} 
145         || $ENV{'SERVER_SOFTWARE'} =~ /Microsoft-IIS/
146         || $ENV{'SERVER_SOFTWARE'} =~ /Sun ONE Web/)
147     {
148       print $cgi->header(-type => "text/html",
149                          -refresh => "0; URL=$vars->{'redirect_url'}");
150     }
151     else {
152       print $cgi->redirect($vars->{'redirect_url'});
153       exit;
154     }
155     
156     $template->process("global/message.html.tmpl", $vars)
157       || ThrowTemplateError($template->error());
158     exit;
159 }
160
161 if (defined $cgi->param('columnlist')) {
162     @collist = split(/[ ,]+/, $cgi->param('columnlist'));
163 } elsif (defined $cgi->cookie('COLUMNLIST')) {
164     @collist = split(/ /, $cgi->cookie('COLUMNLIST'));
165 } else {
166     @collist = DEFAULT_COLUMN_LIST;
167 }
168
169 $vars->{'collist'} = \@collist;
170 $vars->{'splitheader'} = $cgi->cookie('SPLITHEADER') ? 1 : 0;
171
172 $vars->{'buffer'} = $cgi->query_string();
173
174 my $search;
175 if (defined $cgi->param('query_based_on')) {
176     my $searches = $user->queries;
177     my ($search) = grep($_->name eq $cgi->param('query_based_on'), @$searches);
178
179     if ($search) {
180         $vars->{'saved_search'} = $search;
181     }
182 }
183
184 # Generate and return the UI (HTML page) from the appropriate template.
185 print $cgi->header();
186 $template->process("list/change-columns.html.tmpl", $vars)
187   || ThrowTemplateError($template->error());