« Tracの情報をもとにExcelで作ったレポートをPDF化し,Tracのチケットに添付してしまうところまでを自動化したい. | トップページ | TracのデータからバーンダウンチャートをExcelで作る »

2009年10月12日 (月)

TracのXMLRPCを拡張してみる

レポートの登録までできるようになったので,いろいろなレポートをつくろうということで,ガントチャートの作成時の効率化や,バーンダウンチャートを作成するためにTracを拡張してみました.そのメモです.

やるべきことは

1. IXMLRPCHandlerをインプリしたクラスを作る

XMLRPCプラグインのticket.pyとWorklogプラグインのxmlrpc.pyを参照

2. xmlrpc_methodsにメソッドを追加と必要なメソッド追加

(マップ型の)リストを返す,引数がチケット番号(int)のgetWorkHoursメソッドを追加するために次のようにしてメソッドを追加する.

    def __init__(self):
        pass

    def xmlrpc_namespace(self):
        return 'dependency'

    def xmlrpc_methods(self):
        yield ('TICKET_VIEW', ((list, int),), self.getWorkHours)

3. 実際のメソッドを追加

時間関連のカスタムフィールドを変更時間が一致したものを1レコードにまとめて返すようにする.

ticket.pyのgetRecentChangesを参考にすると,ふつうにSQLは実行できそう.今回は権限はTICKET_VIEWなのでSELECTだけなら問題ないでしょう.問題となるのはNoneがあるとエラーになるので,JOINを使う場合は要注意.Excelで使うことしか考えていないので,””を返すようにしました.

    def getWorkHours(self, req, id):
        """Returns a table of changetime records"""
        #
        db = self.env.get_db_cnx()
        cursor = db.cursor()
        sql="SELECT DISTINCT t.time, t1.newvalue, t2.newvalue, t3.newvalue FROM ticket_change t"
        sql = sql + " LEFT JOIN ticket_change t1 ON t1.time = t.time AND t1.field='totalhours'"
        sql = sql + " LEFT JOIN ticket_change t2 ON t2.time = t.time AND t2.field='estimatedhours'"
        sql = sql + " LEFT JOIN ticket_change t3 ON t3.time = t.time AND t3.field='baseline_cost'"
        sql = sql + " WHERE t.ticket='%s'" % id
        sql = sql + " AND (t.field='totalhours' OR  t.field='estimatedhours' OR  t.field='baseline_cost')"
        #sql = sql + " GROUP BY t.time"
        cursor.execute(sql)
        result = []
        totalhours=""
        estimatedhours=""
        baseline_cost=""
        for row in cursor:
            d={}
            d['time']=row[0]
            d['time_iso']=xmlrpclib.DateTime(datetime.datetime.fromtimestamp(row[0]))
            if row[1] == None:
                d['totalhours']=totalhours
            else:
                d['totalhours']=row[1]
                totalhours=row[1]
            if row[2] == None:
                d['estimatedhours']=estimatedhours
            else:
                d['estimatedhours']=row[2]
                estimatedhours=row[2]
            if row[3] == None:
                d['baseline_cost']=baseline_cost
            else:
                d['baseline_cost']=row[3]
                baseline_cost=row[3]
            if totalhours != "":
                result.append(d)
        return result

その他の参照ページ

XMLRPCの拡張はすごく簡単.できるだけいらないデータ流さないようにとか考えると,積極的に拡張していってもいいのかなと思います.

|

« Tracの情報をもとにExcelで作ったレポートをPDF化し,Tracのチケットに添付してしまうところまでを自動化したい. | トップページ | TracのデータからバーンダウンチャートをExcelで作る »

Trac」カテゴリの記事

XMLRPC」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: TracのXMLRPCを拡張してみる:

« Tracの情報をもとにExcelで作ったレポートをPDF化し,Tracのチケットに添付してしまうところまでを自動化したい. | トップページ | TracのデータからバーンダウンチャートをExcelで作る »