Redmineのプラグイン作成のための備忘録と、時々SQLite3

Tags: [ Ruby ] [ Redmine ] [ SQLite3 ] [ Windows ] [ 備忘録 ] Published: 2011/09/07

あらすじ

今あると幸せになれるもの
チケットのCSVエクスポート機能。ただし、履歴つきで。これがあるといわゆるバグとかPJ課題の管理がRedmineで一元化できExcelの呪縛から解き放てられる……

既に履歴つきCSVエクスポートプラグインは存在しているようです。履歴付チケット一覧出力プラグインを書いてみた - すえひろがりっっっっ! ただ、履歴の出方が1履歴毎に列を更新なんですよね。。

No, ... ,履歴
1, ... ,#1の履歴,#2の履歴,#3の履歴
2, ... ,#1の履歴,#2の履歴

今自分が抱えている縛り的にはこう出てほしい。

No, ... ,履歴
1, ... ,"#1の履歴
#2の履歴,
#3の履歴"
2, ... ,"#1の履歴,
#2の履歴"

吐き出したときにチケット1つの履歴を1セルの中に収めたい。CSVに改行はどうなんだとか1セルに改行しまくるのはどうなんだとか色々ありますがそこは縛りなので。。。

だもんで、これを機会にRedmineのプラグインはどう作るのかを調べてみました。

参考サイト

環境

  • WindowsXP
  • Redmine 1.0.0*1
    • Ruby 1.8.7
    • Rails 2.3.5
    • Rack 1.0.1
  • SQLite3 バージョン失念

プラグインのスケルトン作成

まずはプラグインのスケルトンというものを作成する。テンプレートみたいなもの? 以下のコマンドで自動生成してくれます。*2

>ruby script\generate redmine_plugin extendCsv

するといきなりエラー。

!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install
the mysql gem and try again: gem install mysql.

さらに、

LIBMYSQL.dll が見つからなかったため、このアプリケーションを開始できませんでした。…

libmysqlが必要らしい。なんでmysqlなんだろう? SQLite3使うようにしてなかったっけ?

(略)

あーわかった。config/database.ymlがこうなっていた。

production:
  adapter: sqlite3
  database: db/redmine
 
development:
  adapter: mysql
  database: redmine_development
  host: localhost
  username: root
  password:
  encoding: utf8

productionは変えていたけどdevelopmentはデフォルト=MySQLのままだった。開発時はdevelopmentモードを使うようになっているからmysql探し出したのか。変えてみた。

production:
  adapter: sqlite3
  database: db/redmine
 
development:
  adapter: sqlite3
  database: db/redminedev

再度。

>ruby script\generate redmine_plugin extendCsv
C:\redmine-1.0.0>ruby script\generate redmine_plugin extendCsv
      create  vendor/plugins/redmine_extend_csv/app/controllers
      create  vendor/plugins/redmine_extend_csv/app/helpers
      create  vendor/plugins/redmine_extend_csv/app/models
      create  vendor/plugins/redmine_extend_csv/app/views
      create  vendor/plugins/redmine_extend_csv/db/migrate
      create  vendor/plugins/redmine_extend_csv/lib/tasks
      create  vendor/plugins/redmine_extend_csv/assets/images
      create  vendor/plugins/redmine_extend_csv/assets/javascripts
      create  vendor/plugins/redmine_extend_csv/assets/stylesheets
      create  vendor/plugins/redmine_extend_csv/lang
      create  vendor/plugins/redmine_extend_csv/config/locales
      create  vendor/plugins/redmine_extend_csv/test
      create  vendor/plugins/redmine_extend_csv/README.rdoc
      create  vendor/plugins/redmine_extend_csv/init.rb
      create  vendor/plugins/redmine_extend_csv/lang/en.yml
      create  vendor/plugins/redmine_extend_csv/config/locales/en.yml
      create  vendor/plugins/redmine_extend_csv/test/test_helper.rb

vendor/plugins下にスケルトンができた。この「vendor/plugins/今回作成したディレクトリ」というのがプラグインのルートになるようです。

C:\redmine-1.0.0\vendor\plugins>dir

2011/09/06  09:24    <DIR>          .
2011/09/06  09:24    <DIR>          ..
略
2011/09/06  09:24    <DIR>          redmine_extend_csv
略

プラス、自動で頭に「redmine」付加+スネークケースにリネームしてくれている。これが規約か…? とりあえずフォルダ構成等は置いておいて、次の章へ。

init.rbの作成

プラグイン名、作者名などを記述できるが今は特になにも設定せず。後でプラグインを表示さす時に戻って来ます。

ここで一回起動してみる。

>ruby script\server

オプションに-e productionをつけないとdevelopmentモードで起動する。その前に、DBの初期化をしていない場合は初期化を……。(RAILS_ENV=productionを除外)

>rake db:migrate
>rake redmine:load_default_data

そしてRedmine起動 -> 管理 -> プラグインを見に行くと…あった!(写真なし)

補足:SQLite3あれこれ

ちょっとSQLite3も使ってみる。コンソールから見ることもないだろうとexeはDLしていなかったので今回初。

  • まずexe版SQLite3をDL
  • 実行
# Redmineのconfig/database.ymlで定義し作成したDBへ接続
>sqlite3.exe REDMINE_DB_FILE
SQLite version 3.7.7.1 2011-06-28 17:39:05
Enter ".help" for instructions
Enter SQL statements terminated with a ";"

今回はとりあえず下記の2つのコマンドを覚えて帰る。

.tableテーブル一覧を取得する
pragma_table_info(TABLE)テーブルのカラム情報を取得する
  • .table
sqlite> .table
attachments                          news
auth_sources                         open_id_authentication_associations
boards                               open_id_authentication_nonces
changes                              projects
changesets                           projects_trackers
changesets_issues                    queries
comments                             repositories
custom_fields                        roles
custom_fields_projects               schema_migrations
custom_fields_trackers               settings
custom_values                        time_entries
documents                            tokens
enabled_modules                      trackers
enumerations                         user_preferences
groups_users                         users
issue_categories                     versions
issue_relations                      watchers
issue_statuses                       wiki_content_versions
issues                               wiki_contents
journal_details                      wiki_pages
journals                             wiki_redirects
member_roles                         wikis
members                              workflows
  • pragma_table_info(TABLE)
sqlite> pragma table_info(issues);
0|id|INTEGER|1||1
1|tracker_id|integer|1|0|0
2|project_id|integer|1|0|0
3|subject|varchar(255)|1|''|0
4|description|text|0||0
5|due_date|date|0||0
6|category_id|integer|0||0
7|status_id|integer|1|0|0
8|assigned_to_id|integer|0||0
9|priority_id|integer|1|0|0
10|fixed_version_id|integer|0||0
11|author_id|integer|1|0|0
12|lock_version|integer|1|0|0
13|created_on|datetime|0||0
14|updated_on|datetime|0||0
15|start_date|date|0||0
16|done_ratio|integer|1|0|0
17|estimated_hours|float|0||0
18|parent_id|integer|0|NULL|0
19|root_id|integer|0|NULL|0
20|lft|integer|0|NULL|0
21|rgt|integer|0|NULL|0

今回欲しいテーブルはissues, journals, journal_detailsの3つでOKのはずなので*3これをちょっとメモしておく。

sqlite> pragma table_info(issues);
 0|id              |INTEGER     |1|    |1
 1|tracker_id      |integer     |1|0   |0
 2|project_id      |integer     |1|0   |0
 3|subject         |varchar(255)|1|''  |0
 4|description     |text        |0|    |0
 5|due_date        |date        |0|    |0
 6|category_id     |integer     |0|    |0
 7|status_id       |integer     |1|0   |0
 8|assigned_to_id  |integer     |0|    |0
 9|priority_id     |integer     |1|0   |0
10|fixed_version_id|integer     |0|    |0
11|author_id       |integer     |1|0   |0
12|lock_version    |integer     |1|0   |0
13|created_on      |datetime    |0|    |0
14|updated_on      |datetime    |0|    |0
15|start_date      |date        |0|    |0
16|done_ratio      |integer     |1|0   |0
17|estimated_hours |float       |0|    |0
18|parent_id       |integer     |0|NULL|0
19|root_id         |integer     |0|NULL|0
20|lft             |integer     |0|NULL|0
21|rgt             |integer     |0|NULL|0

sqlite> pragma table_info(journals);
 0|id              |INTEGER     |1|    |1
 1|journalized_id  |integer     |1|0   |0
 2|journalized_type|varchar(30) |1|''  |0
 3|user_id         |integer     |1|0   |0
 4|notes           |text        |0|    |0
 5|created_on      |datetime    |1|    |0

sqlite> pragma table_info(journal_details);
 0|id              |INTEGER     |1|    |1
 1|journal_id      |integer     |1|0   |0
 2|property        |varchar(30) |1|''  |0
 3|prop_key        |varchar(30) |1|''  |0
 4|old_value       |varchar(255)|0|    |0
 5|value           |varchar(255)|0|    |0

これで準備とデータを見ることはできるようになった! 次からは実際にプラグインの中身に入っていく!

*1: [http://redmine.jp/guide/RedmineInstall/:title=Redmineのインストール | Redmine.JP] に準拠。

*2: 途中でコマンドプロンプトからConsole2というフリーソフトに切り替えたのでパスの区切りが\だったり/だったりしてます。

*3: チケットの履歴がjournalテーブルで管理されているのを探すのに手間取ったんだけど、どう探すのがクールなんだろう。チケット画面遷移したときのログで探して辿り着いたんだけど。


Author: kk_Ataka / Powered by Jekyll on GitHub Pages