File: //usr/lib/python3/dist-packages/trac/ticket/templates/ticket_change.html
{# Copyright (C) 2010-2021 Edgewall Software
This software is licensed as described in the file COPYING, which
you should have received as part of this distribution. The terms
are also available at https://trac.edgewall.org/wiki/TracLicense.
This software consists of voluntary contributions made by many
individuals. For the exact contribution history, see the revision
history and logs, available at https://trac.edgewall.org/.
#}
## Renders a ticket comment.
{# Arguments:
- change: the change data
- hide_buttons=False: hide all buttons (Edit, Reply)
- cnum_edit=None: the comment number being edited
- edited_comment: the current value of the comment editor
- cnum_hist=None: the comment number for which to show a historical content
- can_append=False: True if the user is allowed to append to tickets
- preview=False: True if rendering a change preview
#}
# import 'macros.html' as jmacros with context
# with
# set cnum = to_unicode(change.get('cnum'))
# set hide_buttons = hide_buttons|default(false)
# set cnum_edit = cnum_edit|default('')
# set cnum_hist = cnum_hist|default('')
# set can_append = can_append|default(false)
# set comment_resource = Resource('comment', cnum, parent=ticket.resource)
# set can_edit_comment = 'TICKET_EDIT_COMMENT' in perm(comment_resource)
# set preview = preview|default(false)
# set show_editor = can_edit_comment and cnum == cnum_edit
# set show_history = cnum is equalto(cnum_hist)
# set max_version = change.comment_history|max(0)
# set comment_version = (as_int(cversion, max_version, 0, max_version) if
show_history else max_version)
# set show_buttons = (not hide_buttons and not show_editor and
comment_version == max_version)
# macro commentref(prefix, cnum, cls=none)
<a href="#comment:${cnum}" class="${cls}">${prefix}${cnum}</a>
# endmacro
## jinjacheck: "(a h3 div form div div div div )" OK
<h3 class="change"${{'id': 'comment:%s' % cnum if 'cnum' in change}|htmlattr}>
<span class="threading">
# set change_replies = replies.get(cnum, []) if 'cnum' in change else []
# if 'replyto' in change:
<span class="trac-in-reply-to">
# set refs = commentref(' '|safe, change.replyto, 'in-reply-to')
# trans refs
in reply to: ${refs}
# endtrans
{% if change_replies: %}${_(";")}{% endif %}
## don't forget french typographic rules!
## (note that there's space anyway around the ';' for now)
</span>
# endif
# if change_replies:
<span class="trac-follow-ups">
<span>${
ngettext("follow-up:", "follow-ups:", change_replies|length)}</span>
# for reply in change_replies:
${commentref(' '|safe, reply, 'follow-up')}
# endfor
</span>
# endif
</span>
# if 'cnum' in change:
<span class="cnum">${commentref('comment:', cnum)}</span>
# endif
# if 'date' in change:
${tag_("by %(author)s, %(date)s",
date = pretty_dateinfo(change.date),
author = authorinfo(change.author))}
# else:
${tag_("by %(author)s", author = authorinfo(change.author))}
# endif
# if preview or show_editor:
<span class="trac-loading"></span>
# endif
</h3>
<div class="trac-change-panel">
## Per-change controls
# if show_buttons:
<div class="trac-ticket-buttons">
# if 'cnum' in change and can_append:
<form id="reply-to-comment-${cnum}" method="get" action="#comment">
<div class="inlinebuttons">
<input type="hidden" name="replyto" value="${cnum}"/>
<input type="submit" value="${captioned_button('↳', _('Reply'))}"
title="${_('Reply to comment %(cnum)s', cnum=cnum)}" />
</div>
</form>
# endif
# if 'cnum' in change and can_edit_comment:
<form id="edit-comment-${cnum}" method="get" action="#comment:${cnum}">
<div class="inlinebuttons">
<input type="hidden" name="cnum_edit" value="${cnum}"/>
<input type="submit" value="${captioned_button('✎', _('Edit'))}"
title="${_('Edit comment %(cnum)s', cnum=cnum)}" />
</div>
</form>
# endif
</div>
# endif
## Property changes
# if change.fields:
<table class="changes">
## for field_name, field in sorted(change.fields.items(), key=lambda item: item[1].label.lower()):
# for field_name, field in change.fields.items()|sort(attribute='1.label'):
## FIXME attribute='1.label|lower'
<tr class="${classes(
'trac-field-' + field_name,
'trac-conflict' if preview and field_name in conflicts)}">
<th class="trac-field-${field_name}">${
_("%(label)s:", label=field.label)}</th>
<td>
# if field_name == 'attachment':
# set attachment_link
<a href="${href.attachment('ticket', ticket.id, field.new)}"><em>${
field.new}</em></a><a href="${href('raw-attachment', 'ticket',
ticket.id, field.new)}"
title="${_('Download')}"
class="trac-rawlink">​</a>
# endset
# trans attachment_link
${attachment_link} added
# endtrans
# else:
${field.rendered}
# endif
# if preview and field.by == 'user':
# set old = (ticket.get_default(field_name)
if field.old is sameas(empty) else field.old)
(<button type="submit" name="revert_${field_name}" class="trac-revert"
title="${_('Revert this change')}">${
_("revert")}<div id="revert-${field_name}">${
'0' if 'cc_update' in field else old}</div></button>)
# endif
</td>
</tr>
# endfor
</table>
# endif
</div>
## Comment editor
# if show_editor:
<form id="trac-comment-editor" method="post"
action="${href.ticket(ticket.id) + '#comment:' + cnum}">
${jmacros.form_token_input()}
<div>
<textarea name="edited_comment"
class="wikitext trac-fullwidth trac-resizable trac-autofocus"
rows="10" cols="78">
${edited_comment if edited_comment is not none else change.comment
}</textarea>
<input type="hidden" name="cnum_edit" value="${cnum}"/>
</div>
<div class="buttons">
<input type="submit" name="preview_comment" value="${_('Preview')}"
title="${_('Preview changes to comment %(cnum)s', cnum=cnum)}"/>
<input type="submit" name="edit_comment" value="${_('Submit changes')}"
title="${_('Submit changes to comment %(cnum)s', cnum=cnum)}"
class="trac-disable-on-submit" />
<input type="submit" name="cancel_comment" value="${_('Cancel')}"
title="${_('Cancel comment edit')}"/>
</div>
</form>
${jmacros.warnings(chrome.warnings, 'trac-preview-warning')}
# endif
## Comment display
# if cnum == cnum_edit:
<div class="comment searchable ticketdraft"${
{'style': 'display: none' if not text}|htmlattr}>
# set text = edited_comment if edited_comment is not none else change.comment
${wiki_to_html(context, text, escape_newlines=preserve_newlines)}
</div>
# elif show_history:
<div class="comment searchable">
${wiki_to_html(context, change.comment_history[comment_version].comment,
escape_newlines=preserve_newlines)}
</div>
# elif change.comment:
<div class="comment searchable">
${wiki_to_html(context, change.comment, escape_newlines=preserve_newlines)}
</div>
# endif
# if not show_editor and len(change.comment_history) is greaterthan(1):
<div${{'class': {
'trac-lastedit': true,
'trac-shade': comment_version != max_version}}|htmlattr}>
# with
# set date = pretty_dateinfo(change.comment_history[comment_version].date)
# set author = authorinfo(change.comment_history[comment_version].author)
# if comment_version != max_version:
# trans version = comment_version, date, author
Version ${version}, edited ${date} by ${author}
# endtrans
# else:
# trans date, author
Last edited ${date} by ${author}
# endtrans
# endif
# endwith
# if comment_version is greaterthan(0):
(<a href="${href.ticket(ticket.id, cnum_hist=cnum,
cversion=comment_version - 1)}#comment:${cnum}">${
_("previous")}</a>)
# endif
# if comment_version is lessthan(max_version):
(<a href="${href.ticket(ticket.id, cnum_hist=cnum,
cversion=comment_version + 1)}#comment:${cnum}">${
_("next")}</a>)
# endif
# if comment_version is greaterthan(0):
(<a href="${href.ticket(ticket.id, action='comment-diff', cnum=cnum,
version=comment_version)}">${
_("diff")}</a>)
# endif
</div>
# endif
# endwith