« NOD32 V4.0 | Main | NOD32 ライセンス有効期限が表示されるようになった? »

2009.07.08

Trac:文字列項目での範囲指定

すごく久しぶりのTracネタです。またしばらくの間、Tracをいじる時間がなくなる可能性もありますが(^^;

TracのTicketにおいて、「日付」の項目を追加するような場合、基本的にTEXT型でカスタムフィールドを作成するかと思うのですが、「日付の範囲指定」での抽出ができないというのが難点。

ということで、ticket/query.pyを直接いじってみました(ちとバージョンが古くてTrac0.11.1-jaです)。
編集対象となるのは、get_constraint_sql(name, value, mode, neg)関数の部分。以下の条件の場合、範囲指定での抽出を行うようにしてみます。

・カスタムクエリの条件入力としては、「~に次が含まれる」「~に次は含まれない」が選択されている
・項目にセミコロン";"が含まれている(入力値をセミコロンで区切り、下限値/上限値として処理)

value = db.like_escape(value)
if mode == '~':
    value = '%' + value + '%'

この部分を、以下のような感じで書き換え。

orgvalue = value
value = db.like_escape(value)
if mode == '~':
    if ';' in orgvalue:
        # ";"が含まれている場合、その前後で区切って「範囲指定」として処理を行う。
        (start, end) = [each.strip() for each in
                        orgvalue.split(';', 1)]
        if start and end:
            return ("%s(%s>=%%s AND %s<=%%s)" % (neg and 'NOT ' or '',
                                                col, col),
                    (start, end))
        elif start:
            return ("%s%s>=%%s" % (neg and 'NOT ' or '', col),
                    (start, ))
        elif end:
            return ("%s%s<=%%s" % (neg and 'NOT ' or '', col),
                    (end, ))
        else:
            # 実際にこの部分にくることはありえないはずであるが・・・。
            value = '%' + value + '%'
    else:
        # ";"が含まれていない場合は、従来と同じ処理
        value = '%' + value + '%'

SQLiteの場合、/_%の3文字がエスケープされるので、そのままエスケープ後のテキストを処理すると日付の部分が2009//07//08のような感じになってしまうので、あえてエスケープ前のテキストを残しておいて処理しています。本来は、もっとスマートな書き方があるはずですが・・・。

|

« NOD32 V4.0 | Main | NOD32 ライセンス有効期限が表示されるようになった? »

Subversion・Trac・etc.」カテゴリの記事

Comments

Post a comment



(Not displayed with comment.)


Comments are moderated, and will not appear on this weblog until the author has approved them.



TrackBack

TrackBack URL for this entry:
http://app.cocolog-nifty.com/t/trackback/3959/45567256

Listed below are links to weblogs that reference Trac:文字列項目での範囲指定:

« NOD32 V4.0 | Main | NOD32 ライセンス有効期限が表示されるようになった? »