Тикеты по всем проектам в Trac`e
Рубрики: Python, Trac on Sep.11, 2008
Выкладываю свой Macros для трака. Это переписанный макрос, который отображал тикеты по выбранному проекту в виде календаря.
На данный момент этот макрос выводит в список все активные тикеты по всем проектам, зашедшего в систему человека, и сортирует их по важности. В этом макросе есть возможность отследить время закрытия/создание/изменение тикетов по дате и по определенному человеку.
Код макроса:
- # Author: Vladimir Boichentsov
- import time
- import calendar
- import sys
- import string
- import Cookie
- import os
- import fileinput
- import sqlite3 as sqlite
- import operator
- from StringIO import StringIO
- from trac.wiki.api import WikiSystem
- from trac.util import *
- def execute(hdf, txt, env):
- # building the output
- buff = StringIO()
- # you type ticket
- if(hdf.getValue('args.close', 'no') == "yes"):
- plist = ['none']
- else:
- plist = ['blocker','critical','high','major','medium','minor','trivial','low']
- tickets = []
- # directory by trac projects
- DIR = '/home/pub/trac'
- o = j = c = 0
- users = ''
- #passwords for users trac projects
- for line in fileinput.input('/home/pub/svn/.htpasswd'):
- temp = line.split(':')
- if(temp[0] != 'admin'):
- users += '<a href="?user=' + temp[0] + '">' + temp[0] + '</a> '
- user = hdf.getValue('args.user', '')
- if(len(user) < 1):
- owner = hdf.getValue("trac.authname", "anonymous")
- else:
- owner = user
- buff.write('<a href="?user=' + owner + '&close=yes&time=yes">close(create time)</a> <a href="?user=' + owner + '&close=yes">close(time close)</a> | ' + users + "\n" )
- buff.write('<table class="listing tickets"><tbody>\n')
- buff.write('<thead><tr> <td class="ticket"> Ticket </a></td><td class="summary">Summary</td> <td> Project</td> <td class="owner">Owner</td> <td>Priority</td> <td>Type</td> <td class="date"> Create </td> <td class="date"> Changetime </td> </tr> </thead>\n')
- for p in plist:
- for project in os.listdir(DIR):
- con = sqlite.connect(DIR + '/' + project +'/db/trac.db')
- cur = con.cursor()
- if(p != 'none'):
- t = "and t.priority='" + p + "'"
- else:
- t = ''
- cur.execute("SELECT t.changetime,t.id,t.summary,t.owner,t.status,t.description,t.time,t.priority,t.type FROM ticket t, ticket_custom tc where tc.ticket=t.id and t.owner='" + owner +"' " + t)
- if(hdf.getValue('args.close', 'no') != "yes"):
- while (1):
- row = cur.fetchone()
- if row == None:
- break
- else:
- j = j + 1
- if(row[4] != 'closed'):
- o = o + 1
- else:
- c = c + 1
- if(row[4] != 'closed'):
- buff.write(show_ticket(row,project,env))
- else:
- while(1):
- row = cur.fetchone()
- ticket = []
- if row == None:
- break
- for t in row:
- ticket.append(t)
- ticket.append(project)
- tickets.append(ticket)
- if(hdf.getValue('args.close', 'no') == "yes"):
- if(hdf.getValue('args.time', 'no') == "yes"):
- tickets.sort(reverse=True,key=operator.itemgetter(6))
- else:
- tickets.sort(reverse=True)
- for row in tickets:
- buff.write(show_ticket(row,row[9],env))
- j = j + 1
- if(row[4] != 'closed'):
- o = o + 1
- else:
- c = c + 1
- buff.write('</tbody></table>\n')
- buff.write('<br>Ticket all: %(j)i Ticket open: %(o)i Closed ticket: %(c)i \n' % { 'j':j,
- 'o':o,
- 'c':c, })
- table = buff.getvalue()
- buff.close()
- return table
- def ticket_priority(row):
- priority = ''
- if (row[7] == 'minor'):
- priority = "background: #e7ffff; border-color: #cee; color: #099;"
- if (row[7] == 'major' or row[7] == 'medium'):
- priority = "background: #fbfbfb; border-color: #ddd; color: #444;"
- if (row[7] == 'trivial' or row[7] == 'low'):
- priority = "background: #e7eeff; border-color: #cde; color: #469;"
- if (row[7] == 'critical' or row[7] == 'high'):
- priority = "background: #ffb; border-color: #eea; color: #880;"
- if (row[7] == 'blocker'):
- priority = "background: #fdc; border-color: #e88; color: #a22;"
- if(row[4] == 'closed'):
- priority = "color: #777; background: #ddd; border-color: #ccc;"
- return priority
- def show_ticket(row,project,env):
- ticket = row[2]
- line = '<tr style="%(priority)s"> <td class="ticket"> <a href="/trac/%(project)s/ticket/%(id)i"> #%(id)i </a></td><td class="summary"><a href="/trac/%(project)s/ticket/%(id)i" title="%(description)s"> %(ticket)s </a></td><td>%(project)s</td> <td class="owner">%(owner)s</td> <td>%(prio)s</td> <td>%(type)s</td> <td class="date"> %(time)s </td> <td class="date"> %(changetime)s </td> </tr>\n' % {
- 'id' : row[1],
- 'url': env.href.ticket(row[1]),
- 'project' : project,
- 'priority' : ticket_priority(row),
- 'prio' : row[7],
- 'type' : row[8],
- 'ticket': ticket[0:100],
- 'owner': row[3],
- 'time' : time.strftime('%d/%m/%y',time.localtime(row[6])),
- 'changetime' : time.strftime('%d/%m/%y',time.localtime(row[0])),
- 'style': row[4] == 'closed' and 'font-size: 9px; color: #777777; text-decoration: line-through;' or 'font-size: 9px; color: #000000',
- 'description': " ", #replace(description, "\'", "'") == None and " " or replace(description, "\'", "'"),
- }
- return line

September 17th, 2008 on 11:29 am
Супер вещь! Прям пользуюсь и радуюсь и всем советую!
September 18th, 2008 on 12:15 am
Рад, что кому-то пригодилось!
Не забываем рейтинг ставить :)
December 22nd, 2008 on 10:33 am
Я новичок в траке. Подскажите пожалуйста как прикрутит этот макрос к траку малой кровью.
December 22nd, 2008 on 11:51 pm
Там же написанно :)
DIR - этой переменной указываем директорию, где у вас находятся проекты
в 37 строке пишется путь к файлу в котором находятся пароли и логины пользователей записанные через “:” !
Кидаем этот макрос в папку с макросами, перезапускаем трак, редактируем вики, пишем [[WikiTickets()]]
И если я ничего не забыл, то должно заработать!