| [%# The contents of this file are subject to the Mozilla Public |
| # License Version 1.1 (the "License"); you may not use this file |
| # except in compliance with the License. You may obtain a copy of |
| # the License at http://www.mozilla.org/MPL/ |
| # |
| # Software distributed under the License is distributed on an "AS |
| # IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or |
| # implied. See the License for the specific language governing |
| # rights and limitations under the License. |
| # |
| # The Original Code is the Bugzilla Bug Tracking System. |
| # |
| # The Initial Developer of the Original Code is Netscape Communications |
| # Corporation. Portions created by Netscape are |
| # Copyright (C) 1998 Netscape Communications Corporation. All |
| # Rights Reserved. |
| # |
| # Contributor(s): Bradley Baetz <bbaetz@student.usyd.edu.au> |
| # Colin Ogilvie <mozilla@colinogilvie.co.uk> |
| # |
| #%] |
| [% PROCESS bug/time.html.tmpl %] |
| <?xml version="1.0" [% IF Param('utf8') %]encoding="UTF-8" [% END %]standalone="yes" ?> |
| <!DOCTYPE bugzilla SYSTEM "[% urlbase FILTER html %]bugzilla.dtd"> |
| |
| <bugzilla version="[% constants.BUGZILLA_VERSION %]" |
| urlbase="[% urlbase FILTER xml %]" |
| maintainer="[% Param('maintainer') FILTER xml %]" |
| [% IF user.id %] |
| exporter="[% user.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>[% g.name FILTER xml %]</group> |
| [% END %] |
| [% END %] |
| |
| [%# Bug Flags %] |
| [% FOREACH type = bug.flag_types %] |
| [% FOREACH flag = type.flags %] |
| <flag name="[% type.name FILTER xml %]" |
| id="[% flag.id FILTER xml %]" |
| status="[% flag.status FILTER xml %]" |
| setter="[% flag.setter.login FILTER xml %]" |
| [% IF flag.requestee %] |
| requestee="[% flag.requestee.login FILTER xml %]" |
| [% END %] |
| /> |
| [% END %] |
| [% END %] |
| [% IF displayfields.long_desc %] |
| [% FOREACH c = bug.longdescs %] |
| [% NEXT IF c.isprivate && !user.in_group(Param("insidergroup")) %] |
| <long_desc isprivate="[% c.isprivate FILTER xml %]"> |
| <who name="[% c.author.name FILTER xml %]">[% c.author.email FILTER xml %]</who> |
| <bug_when>[% c.time FILTER time FILTER xml %]</bug_when> |
| [% IF user.in_group(Param('timetrackinggroup')) && (c.work_time - 0 != 0) %] |
| <work_time>[% PROCESS formattimeunit time_unit = c.work_time FILTER xml %]</work_time> |
| [% END %] |
| <thetext>[% c.body FILTER xml %]</thetext> |
| </long_desc> |
| [% END %] |
| [% END %] |
| |
| [% IF displayfields.attachment %] |
| [% FOREACH a = bug.attachments %] |
| [% NEXT IF a.isprivate && !user.in_group(Param("insidergroup")) %] |
| <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 FILTER xml %]</date> |
| <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 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 %] |
| |
| [% FOREACH flag = a.flags %] |
| <flag name="[% flag.type.name FILTER xml %]" |
| id="[% flag.id FILTER xml %]" |
| status="[% flag.status FILTER xml %]" |
| setter="[% flag.setter.email FILTER xml %]" |
| [% IF flag.status == "?" && flag.requestee %] |
| requestee="[% flag.requestee.email FILTER xml %]" |
| [% END %] |
| /> |
| [% END %] |
| </attachment> |
| [% END %] |
| [% END %] |
| |
| [% Hook.process("bug_end") %] |
| |
| </bug> |
| [% END %] |
| [% END %] |
| |
| </bugzilla> |
| |
| [% BLOCK bug_field %] |
| [% FOREACH val = bug.$field %] |
| [%# 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 %] |
| [% ELSIF field == 'creation_ts' OR field == 'delta_ts' %] |
| [% val = val FILTER time %] |
| [% END %] |
| <[% field %][% IF name != '' %] name="[% name FILTER xml %]"[% END -%]>[% val FILTER xml %]</[% field %]> |
| [% END %] |
| [% END %] |