Trac:修订间差异

来自Gea-Suan Lin's Wiki
跳到导航 跳到搜索
此页面具有访问限制。如果您看见此消息,则说明您没有权限访问此页面。
→‎CSS
第93行: 第93行:
=== site.html ===
=== site.html ===
 在<code>templates/site.html</code>裡做了一些事情進行客製化。
 在<code>templates/site.html</code>裡做了一些事情進行客製化。
對於外部引用,不要 洩漏<code>Referrer</code>:
<syntaxhighlight lang="html">
<head>
<meta name="referrer" content="no-referrer" />
</head>
</syntaxhighlight>


==== CSS ====
==== CSS ====

2018年4月24日 (二) 04:58的版本

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

目前有安装的

除了基本安装外,还会安装这些套件:

以前有安装的

以前会安装,但现在因为自己用而没有装上(没有需求或是不想装):

设定

权限

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

参考资料

外部连结