Trac
Trac是一套問題追蹤系統(英語:Issue tracking system)。
簡介
優點
- 簡單,專住在事情的記錄上,而不是限制行為上。
缺點
- 目前還是不支援Python 3。
安裝
除了基本安裝外,還會安裝這些套件:
- 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。
以前會安裝的:
- DefaultCcPlugin – Trac Hacks - Plugins Macros etc.
- 針對不同的Component設定Cc列表,對於企業內還蠻有用的。像是專案可以開
Proj.
開頭的Component,而組織可以開Org.
開頭的Component,這些類型可以設定對應的Cc列表。
- 針對不同的Component設定Cc列表,對於企業內還蠻有用的。像是專案可以開
看過但還沒用過的:
- AccountManagerPlugin – Trac Hacks - Plugins Macros etc.
- 說明提到可以吃HTML Form Login,而不侷限在HTTP authentication。
設定
在trac.ini
裡改了一些設定。
讓系統吃code.jquery.com
所提供的jQuery以及jQuery UI:
[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
在templates/site.html
裡做了一些事情進行客製化。
CSS
- 全部使用sans-serif字型。
- 修正button因為CSS效果而有時會按不到的問題。
- 針對今天到期與過期的票用不同的標示標出。
- 將已經關掉的票變淡。
- 讓編輯區域使用等寬字型。
- 讓可用範圍變寬。
<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; } --> </style>
JavaScript
- 用JavaScript針對今天到期以及過期的票增加CSS。
- 將新票裡的Due Date改為零點零分零秒。
- 將票裡的attachments與modify內容展開。
- 將日曆選擇器中,每週的第一天設為星期天。另外允許選擇其他月份的日期。
<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 if ('/newticket' === document.location.pathname) { var el = jQuery('#field-due_date'); el.val(el.val().replace(/T.+Z/, 'T00:00:00Z')); } // Closed tickets handling jQuery('tr:has(a.closed)').addClass('ticket_closed'); // Datepicker jQuery.datepicker.setDefaults({firstDay: 0, selectOtherMonths: true, showOtherMonths: true}); })(); // Run after content loaded. jQuery(function() { // Layout jQuery('#attachments').removeClass('collapsed'); jQuery('#modify').parent().removeClass('collapsed'); }); //--> </script>