Trac
Trac是一套问题追踪系统(英语:Issue tracking system)。
简介
优点
- 简单,专注在事情的记录上,而不是限制行为上。
缺点
- 目前还是不支援Python 3。
安装
用pip
安装以下套件:
$ pip install Trac
$ pip install Pygments
$ pip install mysql-python
使用MySQL作为后端资料库时,建议用utf8mb4作为基础,这样资料库可以存所有范围的Unicode字元[1],另外建立独立的使用者供Trac使用:
CREATE DATABASE trac DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;
GRANT ALL ON trac.* TO `trac`@`localhost` IDENTIFIED BY 'password_here';
这样在安装Trac时的连线设定会是mysql://trac:password_here@localhost/trac
(需要自己修改对应栏位)。
在安装套件时,软体本体常常会放在Subversion的伺服器内,在透过pip
或是easy_install
时会呼叫Subversion,所以会需要安装对应的软体:
# apt install subversion
另外要建立目录,并且让Trac可以写入:
# mkdir trac/files
# chown x:y trac/files
目前有安装的
除了基本安装外,还会安装这些套件:
- GraphvizPlugin – Trac Hacks - Plugins Macros etc.
- Graphviz可以拿来画各类图,我自己最常用的是Dot图。
- SubticketsPlugin – Trac Hacks - Plugins Macros etc.
- 子母票的延伸套件,基本上是必备项目。
- TracCronPlugin – Trac Hacks - Plugins Macros etc.
- 定时跑任务,但其实没很好用... 目前主要是拿来每天寄信通知有哪些票过期。
- TracDragDropPlugin – Trac Hacks - Plugins Macros etc.
- 拖拉就可以上传附件的套件。
- TracWysiwygPlugin – Trac Hacks - Plugins Macros etc.
- 可以针对Textarea区块使用WYSIWYG界面,对于非技术类的使用者来说会方便不少(因为不需要学Trac的Wiki语法)。另外有不少文件可以直接剪下贴上(虽然还是会掉不少效果,但比起完全不能剪下贴上来说已经方便不少)。
- XmlRpcPlugin – Trac Hacks - Plugins Macros etc.
- 让使用者可以透过API操作Trac。
以前有安装的
以前会安装,但现在因为自己用而没有装上(没有需求或是不想装):
- AccountManagerPlugin – Trac Hacks - Plugins Macros etc.
- 说明提到可以吃HTML Form Login,而不局限在HTTP authentication。
- AutocompleteUsersPlugin – Trac Hacks - Plugins Macros etc.
- 让使用者帐号名称可以autocomplete,在Cc栏位与Owner栏位会很好用。
- DefaultCcPlugin – Trac Hacks - Plugins Macros etc.
- 针对不同的Component自动加上Cc列表。
- 对于企业内还蛮有用的。像是专案可以开
Proj.
开头的Component,而组织可以开Org.
开头的Component,这些类型可以设定对应的Cc列表。
- LDAPAcctMngrPlugin – Trac Hacks - Plugins Macros etc.
- 可以使用LDAP管理帐号,是AccountManagerPlugin的延伸套件。
- gslin/trac-addtocc-plugin: Add participator to cc list automatically.
- 自动把参与者加到Cc列表内,这样才会收到后续的更新。
- gslin/trac-secret-checkbox-ticket: Add ticket security policy for Trac.
- 将票设定为秘密,只有Reporter(开票人)、Owner(目前有票的人)、Cc列表内的人可以读。
- 这对于企业内有些需求很好用(像是还在进行中的计画,或是一些不会对全公司公开的数据)。
- TracTicketReferencePlugin – Trac Hacks - Plugins Macros etc.
- 可以设定相关连的票,不过我很少用到这个功能(更多是子母票)。
- 这个套件在Trac 1.2上因为使用了在jQuery 1.9被拔掉的
.live()
(Trac 1.2使用jQuery 1.12.4),所以需要手动处理才能用。
设定
权限
Trac预设的权限设定过于严格,只给内部使用的情境下,建议对authenticated
群组加上:
TICKET_EDIT_CC
TICKET_EDIT_DESCRIPTION
trac.ini
让系统吃code.jquery.com
所提供的jQuery以及jQuery UI[2],稍微降低伺服器的负载,另外也有机会与外部网站共用cache。目前的Trac 1.2.2版本可以这样设:
[trac]
jquery_location = https://code.jquery.com/jquery-1.12.4.min.js
jquery_ui_location = https://code.jquery.com/ui/1.12.1/jquery-ui.min.js
jquery_ui_theme_location = https://code.jquery.com/ui/1.12.1/themes/start/jquery-ui.css
另外因为我们不太用Trac内建的Wiki,但又关不掉,所以只能针对没找到的页面就不要产生连结了:
[wiki]
ignore_missing_pages = enabled
site.html
在templates/site.html
里做了一些事情进行客制化。
对于外部引用,不要 泄漏Referrer
:
<head>
<meta name="referrer" content="no-referrer" />
...
</head>
CSS
- 全部使用sans-serif字型。
- 修正button因为CSS效果而有时会按不到的问题。
- 针对今天到期与过期的票用不同的标示标出(配合下方的JavaScript)。
- 将已经关掉的票变淡(配合下方的JavaScript)。
- 让编辑区域使用等宽字型。
- 让可用范围变宽。
- 让图片不要超过萤幕宽度。
<style type="text/css">
<!--
body, th, tr {
font-family: sans-serif;
}
input[type=button]:active, input[type=submit]:active,
input[type=reset]:active {
position: relative;
top: 0;
left: 0;
}
table.tickets tr.duedate_overdue {
font-weight: bold;
}
table.tickets tr.duedate_today {
border: 2px solid;
}
table.subtickets tr.ticket_closed, .closed.ticket {
opacity: 0.5;
}
textarea {
font-family: monospace;
}
#content.ticket {
width: 78em;
}
#main img {
max-width: 100%;
}
-->
</style>
JavaScript
- 用JavaScript针对今天到期以及过期的票增加CSS。
- 将新票里的Due Date改为零点零分零秒。
- 将票里的attachments与modify内容展开。
- 将日历选择器中,关闭动画效果[3],另外将每周的第一天设为星期天[3],并且允许选择其他月份的日期[3]。
在head
的地方先加入strftime
套件,后面会用到:
<script src="https://cdn.jsdelivr.net/npm/strftime@0.10.0/strftime.min.js"></script>
<script>
<!--
// Run immediately.
(function($) {
// Due date css handling
var d = new Date();
var today = (new Date(d.getTime() - d.getTimezoneOffset() * 60000)).toISOString().slice(0, 10);
document.querySelectorAll('table.tickets td.due_date').forEach(function(el) {
var due = el.innerText.trim();
if (due < today) {
el.parentElement.classList.add('duedate_overdue');
} else if (due === today) {
el.parentElement.classList.add('duedate_today');
}
});
// Due date (newticket) set to 00:00:00 (in UTC)
if ($('form[action$="/newticket#ticket"]').length > 0) {
do {
let el = $('#field-due_date');
let t = el.val();
if ('Z' === t.slice(-1)) {
console.log(t);
t = new Date(Date.parse(t) + 86400000);
t = strftime('%Y-%m-%dT00:00:00Z', t);
el.val(t);
break;
}
let a = t.match(/\+(\d\d:\d\d)$/);
if (null !== a) {
let tz = a[1];
let new_str = 'T' + tz + ':00+' + tz;
t = new Date(Date.parse(t) + 86400000);
t = strftime('%Y-%m-%d' + new_str, t);
el.val(t);
break;
}
} while (false);
}
// Closed tickets handling
$('tr:has(a.closed)').addClass('ticket_closed');
})(jQuery);
// Run after content loaded.
jQuery(function() {
// Layout
jQuery('#attachments').removeClass('collapsed');
jQuery('#modify').parent().removeClass('collapsed');
// Datepicker
if ($.datepicker) {
$.datepicker.setDefaults({
firstDay: 0,
selectOtherMonths: true,
showAnim: '',
showOtherMonths: true
});
}
});
//-->
</script>
著名使用单位
- Django
- FFmpeg
- Tor
- WebKit
- WordPress
- jQuery
相关连结
参考资料
- ↑ MySqlDb – The Trac Project. [2018-03-01].
- ↑ TracIni – The Trac Project. [2018-02-28].
- ↑ 3.0 3.1 3.2 Datepicker Widget | jQuery UI API Documentation. [2018-02-28].