[%# 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" encoding="UTF-8" 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 %]