| [%# 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[% IF a.attacher.name != '' %] name="[% a.attacher.name FILTER xml %]"[% END -%]> |
| [% 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 %] |