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

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

あらすじ

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

既に履歴つきCSVエクスポートプラグインは存在しているようです。http://d.hatena.ne.jp/suer/20101003/1286120294:title ただ、履歴の出方が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] に準拠。

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

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

関連記事(この記事の初版より古い記事はリンクがグレーで表示されます)

  1. 2011/05/01 [Ruby] [Redmine] [Windows] Redmineインストール備忘録(Windows)
  2. 2012/07/17 [Ruby] [Windows] [Redmine] Windows版Redmineをサービスに登録してブート時に起動させる(宿題あり)
  3. 2011/12/15 [Ruby] [Solaris] [Redmine] RedmineとApacheを連携させるPassengerをインストールできなかった
  4. 2011/12/05 [Ruby] [Redmine] RedmineでプラグインインストールしたらTemplateErrorが出た
  5. 2011/09/30 [Java] [Windows] [Ruby] .msgファイルをパースして中から添付ファイルを抜き出す
  6. 2011/08/23 [Ruby] [Windows] MicrosoftOutlookで消せなくなったフォルダをwin32ole経由でRubyから消してみる
  7. 2011/07/09 [Windows] [Ruby] MicrosoftOutlookのメールをRuby(win32ole)で操作する! その2
  8. 2011/05/17 [Ruby] [Windows] MicrosoftOutlookのメールをRubyで操作する!
  9. 2013/08/20 [Ruby] [Rails] [Redmine] Rails3のログ出力にANSIカラーコードを使用しない設定
  10. 2013/08/09 [Ruby] [Redmine] [MySql] [StartUp] WindowsにRedmine2.3をインストールする手順と、プラグイン作成用メモ
  11. 2012/10/01 [Ruby] [Bundle] [Windows] bundle execを省略したいのでバッチを作った(Windows版)
  12. 2012/05/28 [Ruby] [イベント] [Jenkins] [Redmine] Jenkins,Redmine使いこなし勉強会に参加しました と、ちょっとプラグイン作ってみた #jen_red
  13. 2012/04/20 [Ruby] [Windows] ZenTestで実行したRSpecの結果をGrowlで通知してくれるようにした
  14. 2012/03/27 [Windows] [Jenkins] [Ruby] simplecovとsimplecov-rcovを使ってJenkinsでカバレッジを確認
  15. 2012/03/20 [Windows] [Jenkins] [Ruby] Windows環境用にrcovをビルドしなおす手順