blob: 9964cd800f91604976a8ed8b0fbb4efc2044ed96 (
plain)
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
|
[%# 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.
#%]
[% PROCESS bug/time.html.tmpl %]
[% USE Bugzilla %]
[% cgi = Bugzilla.cgi %]
<?xml version="1.0" [% IF Param('utf8') %]encoding="UTF-8" [% END %]standalone="yes" ?>
<!DOCTYPE bugzilla [% IF cgi.param('dtd') %][[% PROCESS pages/bugzilla.dtd.tmpl %]][% ELSE %]SYSTEM "[% urlbase FILTER xml %]page.cgi?id=bugzilla.dtd"[% END %]>
<bugzilla version="[% constants.BUGZILLA_VERSION %]"
urlbase="[% urlbase FILTER xml %]"
[%# Note that the maintainer's email is not filtered,
# intentionally. Even logged-out users should be able
# to see that, since it will be in error messages anyway.
%]
maintainer="[% Param('maintainer') FILTER xml %]"
[% IF user.id %]
exporter="[% user.email FILTER email FILTER xml %]"
[% END %]
>
[% FOREACH bug = bugs %]
[% IF bug.error %]
<bug error="[% bug.error FILTER xml %]">
<bug_id>[% bug.bug_id FILTER xml %]</bug_id>
</bug>
[% ELSE %]
<bug>
[% FOREACH field = bug.fields %]
[% IF displayfields.$field %]
[%+ PROCESS bug_field %]
[% END %]
[% END %]
[%# This is here so automated clients can still use process_bug.cgi %]
[% IF displayfields.token && user.id %]
<token>[% issue_hash_token([bug.id, bug.delta_ts]) FILTER xml %]</token>
[% END %]
[%# Now handle 'special' fields #%]
[% IF displayfields.group %]
[% FOREACH g = bug.groups %]
[% NEXT UNLESS g.ison %]
<group id="[% g.bit FILTER xml %]">[% g.name FILTER xml %]</group>
[% END %]
[% END %]
[%# Bug Flags %]
[% PROCESS section_flags obj => bug %]
[% IF displayfields.long_desc %]
[% sort_order = user.settings.comment_sort_order.value %]
<comment_sort_order>[% sort_order FILTER xml %]</comment_sort_order>
[% FOREACH c = bug.comments %]
[% PROCESS a_comment %]
[% END %]
[% END %]
[% IF displayfields.attachment %]
[% FOREACH a = bug.attachments %]
[% NEXT IF a.isprivate && !user.is_insider %]
<attachment
isobsolete="[% a.isobsolete FILTER xml %]"
ispatch="[% a.ispatch FILTER xml %]"
isprivate="[% a.isprivate FILTER xml %]"
>
<attachid>[% a.id %]</attachid>
<date>[% a.attached FILTER time("%Y-%m-%d %T %z") FILTER xml %]</date>
<delta_ts>[% a.modification_time FILTER time("%Y-%m-%d %T %z") FILTER xml %]</delta_ts>
<desc>[% a.description FILTER xml %]</desc>
<filename>[% a.filename FILTER xml %]</filename>
<type>[% a.contenttype FILTER xml %]</type>
<size>[% a.datasize FILTER xml %]</size>
<attacher>[% a.attacher.email FILTER email FILTER xml %]</attacher>
[%# This is here so automated clients can still use attachment.cgi %]
[% IF displayfields.token && user.id %]
<token>[% issue_hash_token([a.id, a.modification_time]) FILTER xml %]</token>
[% END %]
[% IF displayfields.attachmentdata %]
<data encoding="base64">[% a.data FILTER base64 %]</data>
[% END %]
[% PROCESS section_flags obj => a %]
</attachment>
[% END %]
[% END %]
[% Hook.process("bug_end") %]
</bug>
[% END %]
[% END %]
</bugzilla>
[% BLOCK bug_field %]
[% field_values = bug.$field %]
[%# Work around TT bug https://rt.cpan.org/Public/Bug/Display.html?id=9802 %]
[% IF bug.$field.size == 1 %]
[% field_values = [bug.$field.first] %]
[% END %]
[% FOREACH val = field_values %]
[%# We need to handle some fields differently. This should become
# nicer once we have custfields, and a type attribute for the fields
#%]
[% name = '' %]
[% IF field == 'reporter' OR field == 'assigned_to' OR
field == 'qa_contact' %]
[% name = val.name %]
[% val = val.email FILTER email %]
[% ELSIF field == 'cc' %]
[% val = val FILTER email %]
[% ELSIF field == 'creation_ts' OR field == 'delta_ts' %]
[% val = val FILTER time("%Y-%m-%d %T %z") %]
[% ELSIF field == "see_also" %]
[% val = val.name %]
[% END %]
<[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]>
[%- val FILTER xml %]</[% field %]>
[% END %]
[% END %]
[% BLOCK section_flags %]
[% RETURN UNLESS displayfields.flag %]
[% FOREACH flag = obj.flags %]
<flag name="[% flag.type.name FILTER xml %]"
id="[% flag.id FILTER xml %]"
type_id="[% flag.type_id FILTER xml %]"
status="[% flag.status FILTER xml %]"
setter="[% flag.setter.email FILTER email FILTER xml %]"
[% IF flag.status == "?" && flag.requestee %]
requestee="[% flag.requestee.email FILTER email FILTER xml %]"
[% END %]
/>
[% END %]
[% END %]
[% BLOCK a_comment %]
[% RETURN IF c.is_private && !user.is_insider %]
<long_desc isprivate="[% c.is_private FILTER xml %]" >
<commentid>[% c.id FILTER xml %]</commentid>
<comment_count>[% c.count FILTER xml %]</comment_count>
[% IF c.is_about_attachment %]
<attachid>[% c.extra_data FILTER xml %]</attachid>
[% END %]
<who name="[% c.author.name FILTER xml %]">[% c.author.email FILTER email FILTER xml %]</who>
<bug_when>[% c.creation_ts FILTER time("%Y-%m-%d %T %z") FILTER xml %]</bug_when>
[% IF user.is_timetracker && (c.work_time - 0 != 0) %]
<work_time>[% PROCESS formattimeunit time_unit = c.work_time FILTER xml %]</work_time>
[% END %]
<thetext>[% c.body_full FILTER xml %]</thetext>
</long_desc>
[% END %]
|