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
|
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
package Bugzilla::Extension::BzAPI::Resources::Bugzilla;
use 5.10.1;
use strict;
use Bugzilla;
use Bugzilla::Constants;
use Bugzilla::Error;
use Bugzilla::Keyword;
use Bugzilla::Product;
use Bugzilla::Status;
use Bugzilla::Field;
use Digest::MD5 qw(md5_base64);
#########################
# REST Resource Methods #
#########################
BEGIN {
require Bugzilla::WebService::Bugzilla;
*Bugzilla::WebService::Bugzilla::get_configuration = \&get_configuration;
}
sub rest_handlers {
my $rest_handlers = [
qr{^/configuration$}, {
GET => {
resource => {
method => 'get_configuration'
}
}
}
];
return $rest_handlers;
}
sub get_configuration {
my ($self) = @_;
my $user = Bugzilla->user;
my $params = Bugzilla->input_params;
# Get data from the shadow DB as they don't change very often.
Bugzilla->switch_to_shadow_db;
# Pass a bunch of Bugzilla configuration to the templates.
my $vars = {};
$vars->{'priority'} = get_legal_field_values('priority');
$vars->{'severity'} = get_legal_field_values('bug_severity');
$vars->{'platform'} = get_legal_field_values('rep_platform');
$vars->{'op_sys'} = get_legal_field_values('op_sys');
$vars->{'keyword'} = [ map($_->name, Bugzilla::Keyword->get_all) ];
$vars->{'resolution'} = get_legal_field_values('resolution');
$vars->{'status'} = get_legal_field_values('bug_status');
$vars->{'custom_fields'} =
[ grep {$_->is_select} Bugzilla->active_custom_fields ];
# Include a list of product objects.
if ($params->{'product'}) {
my @products = $params->{'product'};
foreach my $product_name (@products) {
my $product = new Bugzilla::Product({ name => $product_name });
if ($product && $user->can_see_product($product->name)) {
push (@{$vars->{'products'}}, $product);
}
}
} else {
$vars->{'products'} = $user->get_selectable_products;
}
# We set the 2nd argument to 1 to also preload flag types.
Bugzilla::Product::preload($vars->{'products'}, 1, { is_active => 1 });
# Allow consumers to specify whether or not they want flag data.
if (defined $params->{'flags'}) {
$vars->{'show_flags'} = $params->{'flags'};
}
else {
# We default to sending flag data.
$vars->{'show_flags'} = 1;
}
# Create separate lists of open versus resolved statuses. This should really
# be made part of the configuration.
my @open_status;
my @closed_status;
foreach my $status (@{$vars->{'status'}}) {
is_open_state($status) ? push(@open_status, $status)
: push(@closed_status, $status);
}
$vars->{'open_status'} = \@open_status;
$vars->{'closed_status'} = \@closed_status;
# Generate a list of fields that can be queried.
my @fields = @{Bugzilla::Field->match({obsolete => 0})};
# Exclude fields the user cannot query.
if (!Bugzilla->user->is_timetracker) {
@fields = grep { $_->name !~ /^(estimated_time|remaining_time|work_time|percentage_complete|deadline)$/ } @fields;
}
$vars->{'field'} = \@fields;
my $json;
Bugzilla->template->process('config.json.tmpl', $vars, \$json);
my $result = {};
if ($json) {
$result = $self->json->decode($json);
}
return $result;
}
1;
|