Hello
On 11.12.2018 22:22, Clemens Feige wrote:
Hello
How can one display a list of all ticket numbers which are mentioned
in the current ticket (i.e. in description text, ticket comments,
ticket fields and ticket custom fields)?
It might be something like the [[TicketQuery]] macro, but it shall
work only on the current ticket, instead on all tickets.
Background:
Relations between tickets are important. If for example the user views
ticket X, then he or she may also want to know about related tickets Y
and Z. The related tickets are mentioned somewhere deep in the long
description text of the current ticket. Now the user likes to see a
distilled list of all mentioned tickets.
Once again please note that I am talking about data extraction within
the same ticket, not globally across all tickets.
I am aware of the PageTicketsMacro:
"wiki macro that expands to a TicketQuery of tickets mentioned on the
current wiki page."
https://trac-hacks.org/wiki/PageTicketsMacro
Unfortunately the PageTicketsMacro does not work on tickets, only on
wiki pages. Otherwise it is more or less what I want.
Do you have any suggestions?
Maybe something like this:
import re
from trac.core import *
from trac.util.html import tag
from trac.web.api import IRequestFilter
author = "Lucid"
version = "1.0 ($Rev$)"
license = "BSD"
url = "https://trac-hacks.org/wiki/MentionedTickets"
class MentionedTickets(Component):
"""List all tickets mentioned in the current ticket."""
implements(IRequestFilter)
tickets_re = re.compile('(?:#|(?:ticket:|bug:))(\d+)')
def pre_process_request(self, req, handler):
return handler
def post_process_request(self, req, template, data, content_type):
path = req.path_info
if path.startswith('/ticket/'):
if data and 'ticket' in data and 'fields' in data:
self._append_related_tickets(req, data)
return template, data, content_type
def _append_related_tickets(self, req, data):
rendered = ''
ticket = data['ticket']
comments = [c[4] for c in ticket.get_changelog()
if c[2] == 'comment']
text_fields = [field['name'] for field in ticket.fields
if field['type'] == 'textarea']
values = [ticket[name] for name in text_fields] + comments
mentions = [int(match) for value in values
if value is not None
for match in
MentionedTickets.tickets_re.findall(value)]
if mentions:
ticket.values['Mentioned Tickets'] = True # Activates field
results = []
for id in sorted(set(mentions)):
label = '#%s' % (id,)
href = req.href.ticket(id)
link = tag.a(label, href=href)
results.append(link)
rendered = tag.span(*[e for pair in zip(results, [' '] *
len(results)) for e in pair][:-1])
data['fields'].append({
'name': 'Mentioned Tickets',
'rendered': rendered,
'type': 'textarea', # Full row
})
(It's not a macro. It just adds the mentioned tickets to the box.)
Cheers!
--
You received this message because you are subscribed to the Google Groups "Trac
Users" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/trac-users.
For more options, visit https://groups.google.com/d/optout.