redmine-trunk-changes 2019-06-20

今日はJPLさんが大量にコミットしていてすごい日、Redmine 4.1の期日が6/22と迫っているからでしょうか。

リビジョン 18261 - Preview .webm as video instead of audio (#31553). Patch by Seiei Miyagi. - Redmine

拡張子webmのファイルをプレビューする際、音声ではなく動画としてプレビューするようにしています。 わたしがパッチ書いたんですが、はじめてパッチ取り込まれました。嬉しい。 みんなのマシンで私の書いた1行が動く...!!!

リビジョン 18262 - ffi gem is missing for running tests on windows. - Redmine

Windowsでテストを実行する際にffi gemが必要なので足しています。 Windows環境でテスト走らせたことなかったなあ

リビジョン 18263 - Issues in paginated views may be lost because sorting criteria are not unique... - Redmine

チケット一覧で複数ページにまたがるぐらい多くのチケットが表示されているとき、チケットのソート基準によっては順序が不定になってしまっていました。 ものすごい雑な例をだすと例えば同じ題名のチケットが1000チケットあるときに題名でソートした場合ですね。全部同じ題名の場合、順番がランダムになってしまう。 その状態で2ページ目とかいくと、1ページめに表示されてるチケットもランダムなら2ページめもランダムで、チケットの見逃しとかが発生してしまいます。

このリビジョンでは、ソートの順序の指定に#が含まれていない場合、最後に#順を指定し、同じ並び順のチケットの場合は最終的に#の降順に並び替えるようにしています。 同じ題名のチケットが1000チケットあった場合は#順にならぶわけです。べんり。

合わせて作業時間一覧も修正されています。

リビジョン 18264 - Groups are incorrect when grouping by date without user timezone set. - Redmine

User#time_to_dateが今までは

  • ユーザーのタイムゾーンが設定されている場合、timeをユーザーのタイムゾーンでの時刻に変換してから日付に変換する
  • ユーザーのタイムゾーンが設定されていない場合、timeをtime自身のtimezoneでの時刻で日付に変換する

という動作になっていました。 time自身のtimezone、通常特に設定の変更を加えていない場合DBから帰ってきた時間のタイムゾーンなどはRailsconfig.time_zoneに従ったタイムゾーンが設定されています。デフォルトはUTCです。

一方Redmine::I18n#format_timeでは、タイムゾーンが設定されていない場合は

といった動作になっていました

ユーザーのタイムゾーンが設定されていない場合の時刻の扱いがずれていたんですね。

これをRedmine::I18n#format_timeの動作によせた感じです。

変更は

  • User#convert_time_to_user_timezoneを追加(今までのRedmine::I18n#format_time相当の時刻の変換を行う)
  • User#time_to_dateではUser#convert_time_to_user_timezoneを使って時刻を変換したあと日付に変換する

という感じ

日本時間の夕方とか夜に日本時間のマシンでRedmine本体のテスト実行すると落ちていたりしたのですが、直ってよかった 対象バージョンが外されてるけど、対象バージョンはChangelogに載せる変更につける運用方針なのかな 今回の変更はもともとほかの4.1向けのチケットで生まれた機能のバグ修正なので、まだリリースされていない機能だからバグ修正してもChangelogにはのらない感じっぽい。 なるほど

リビジョン 18265 - Roadmap shows 100%, but one of its tasks is still set to 90% (#30949). Patch... - Redmine

ロードマップの一部のタスクが90%しか進捗ないのに、ロードマップの表示が100%になってしまっていたのを修正しています。 四捨五入してたのを切り捨てに変えたようです。なるほどな〜。

リビジョン 18266 - Test for #30949. Patch by Marius BALTEANU. - Redmine

さきほどの変更のテストを追加しています。

リビジョン 18267 - Duplicate method definition in tests (#31093). - Redmine

テストで重複したメソッド名をつけてしまっていたのを、重複しないように直しています。 重複していると、前に定義されていた方のテストが実行されなさそうなので、直ってよかった。

リビジョン 18268 - Text may unexpectedly be enclosed in pre tags when an issue is created via HT... - Redmine

HTMLメール経由でチケットを作った際に意図せずpreタグでマークアップされてしまっていたのを修正しています。 今まではHTMLをパースする前に空白を取り除いていたのですが、それだとHTMLをパースしてからテキストを抜いてくるときに先頭に空白が入っちゃうことがあったので、文字列を抜き出したあと先頭の空白を削除してる感じですね。たぶん。

リビジョン 18269 - Reverts r18245 (#31582, #31365). Issue subjets are truncated in some cases w... - Redmine

メールからチケットを作成する際に題名が端折られることがあったのを直したコミットが入ったんですが、なんかうまく動いていなかったようで別のチケットがたっていたため、リバートされました。

Defect #31582: Issue subject may be truncated if the subject field in the receiving email is split into multiple lines in singlebytes and multibytes mixed - Redmine

リビジョン 18270 - Merged r18269 from trunk to 4.0-stable in order to revert r18246 (#31582, #31... - Redmine

4-0-stableにさきほどのリバートをバックポートしています。

リビジョン 18271 - Allow tabs to have a custom action (#3058). Patch by Marius BALTEANU. - Redmine

ここから、このチケット関連の変更が続きます。

Feature #3058: Show issue history using tabs - Redmine

タブの設定でonclickオプションをわたしてデフォルトの動作をカスタマイズできるようにしています。

選択されたタブを表示する際はタブをクリックしたときと同じコードが直接JSからよばれるよう。

リビジョン 18272 - Show issue history in tabs (#3058). Patch by Marius BALTEANU. - Redmine

チケットの下の方の注記が追加されていく部分がタブ化されていて

  • 今までどおりの全部表示
  • コメント
  • コメントなしの変更(チケットの属性のみの変更)

の3つになっています。

コメントだけみたい、とか期日の変更履歴だけみたいときに便利そうですね。

コードについてはJSのコードのほうtab_contentvarついてなくてグローバルプロパティになっていそうな気配あるな。。。。(直した方がよさそう)

journals_with_notes/journals_without_notes分ける部分はpartitionメソッドで分けたら1行なのにな〜という感じ。

あとでパッチ投げてもいいかもしれない。

リビジョン 18273 - Move changesets to its own tab (#3058). Patch by Marius BALTEANU. - Redmine

タブのファイルをapp/views/_historyからapp/views/issues/tabs/historyに移動してチェンジセットもタブで表示するように変更しています。

リビジョン 18274 - Add time entries tab to issue history tabs (#3058). Patch by Marius BALTEANU. - Redmine

作業時間を閲覧できる権限をもっていて、作業時間の記録がある場合、タブで作業時間を表示するようにしています。

リビジョン 18275 - Load changesets and time entries tabs async (#3058). Patch by Marius BALTEANU. - Redmine

作業時間とチェンジセットのタブはクリックしたタイミングでAjaxで描画するようにしています。

リビジョン 18276 - Load remote tab only once (#3058). Patch by Marius BALTEANU. - Redmine

作業時間とチェンジセットのタブ、クリックするたびajaxしていたのを初回だけajaxでロードするよう変更しています。 JSのAPIとしてはクリックするたびロードもできるような引数を追加しています。

これ追加した引数、デフォルト引数だからIEで動かない可能性あるような...どうでしょう?

デフォルト引数 - JavaScript | MDN

リビジョン 18277 - User preference for issue history default tab (#3058). Patch by Marius BALTE... - Redmine

ユーザーの設定画面で、チケットのタブについてデフォルトでどのタブを表示するか設定する項目を追加しています。

リビジョン 18278 - Remove history label and no data (#3058). Patch by Marius BALTEANU. - Redmine

履歴のタイトルはもはやタブをみればわかるので見出しを削除して、チケットへのコメントやリビジョンが何もないときに表示される何もないよ的な文言を非表示にしています。

リビジョン 18279 - Set border on tab content instead of #history. - Redmine

タブのとこに区切り線を移動しています。(見た目ちゃんと確認してないのでよくわからず)

リビジョン 18280 - Don't show empty fields in email notifications (#10378). Patch by Yuichi HAR... - Redmine

チケットをメール通知する際に内容が入力されていない項目については項目名だけが見えている状態でしたが、内容がない場合項目名も表示しないようにしています。 読みやすくなりそう。

リビジョン 18281 - Update locales (#3058). - Redmine

チケットのコメント等のタブ表示についてi18n用のファイルを追加しています。翻訳コントリビュートチャンス。

リビジョン 18282 - Japanese translation update (#31594). Patch by Go MAEDA. - Redmine

さきほどのコメント等の表示の日本語訳を更新

  • チケットの履歴のデフォルトタブ
  • プロパティ更新
  • コメント
  • 最後に開いたタブ

なるほど〜〜〜。 「プロパティ更新」か。「プロパティ」が使われてる場所いま少ないので慣れが必要そう。(なれなかったらishikawa999/redmine_message_customize: This is a plugin for Redmine. 使えばいいのかな?

リビジョン 18283 - Make project settings more accessible (#22090). Patch by Jan Schulz-Hofen an... - Redmine

表示しているモジュールに対応するプロジェクトの設定を開けるリンクが追加されています。 設定を開いて「〜」をクリックして〜みたいなサポート業が減りそうなのでべんり。 バージョンを表示していて、バージョン関連の設定したかったら直接バージョンの設定に飛べる!

リビジョン 18284 - Test failure with mysql (#30288). - Redmine

さきほどのタイムゾーンのテストがMySQLだと落ちてしまうよう

Railsconfig.time_zoneconfig.activerecord.default_timezoneとサーバーの時間あたりの時間の設定が色々あって難しい

リビジョン 18285 - Support external ID when importing issues (#28213). Patch by Gregor Schmidt ... - Redmine

チケットをインポートする際にユニークIDとして指定した列を元にチケットの親子関係などを設定できるようになっています。 はっきりよくわかってないんだけど行の位置に依存して親子関係設定していたのが不便なので絶対IDみたいな感じのを使えるようにしたかんじかな、べんりそう

リビジョン 18286 - Removes lazy loading of i18n files for 18n 1.6.0 compat (#31384). - Redmine

Redmineでは独自のi18nバックエンドを使っていたのでi18n gemの新バージョンで提供されている機能が使えませんでした。

新機能を使えるようにするために、独自バックエンドを削除しています。 しかしRedmineのバックエンドで使えていたlocaleのかしこい遅延読み込みなどが使えなくなっているため、開発環境でlocaleを読み込むのが遅くなったよう。 i18nが遅いのはi18nの問題そうなので、やる気がある人がいればi18nの方のバックエンドに消えた最適化の機能を送り込んでi18nの方を直すとよさそう。

リビジョン 18287 - Update locales (#28213). - Redmine

さきほどのユニークIDの翻訳ファイルを追加しています。

リビジョン 18288 - Add "<< me >>" option to user format issue custom fields (#31444). Patch by ... - Redmine

チケットのカスタムフィールドで、ユーザー型のカスタムフィールドの選択肢に担当者等と同様に自分自身の選択肢を追加しています。べんりだ。

リビジョン 18289 - Code cleanup: RuboCop: Style/UnneededInterpolation - Redmine

Rubocopに怒られてたのを直しています。

リビジョン 18290 - Code cleanup: RuboCop: Style/DefWithParentheses - Redmine

これもRubocopに怒られてたのを直しています。

Style一律無効でもよいのではと思わなくもないし、これでCIおちるなら--fail-levelみたいなオプション指定してfatal以外は無視とかしてもよさそうな気がする。

rubocopが一切使われていないRailsアプリにrubocopを段階的に導入していく際にやったこと/やりたいこと - Qiita

リビジョン 18291 - Code cleanup: RuboCop: Rails/Presence - Redmine

rubocopに怒られてたの直しています

リビジョン 18292 - RuboCop: Disable Metrics - Redmine

Metrixを一律オフにしています。歴史あるプロジェクトだとなりがち。

リビジョン 18293 - Set the first status as a default status in "New tracker" form (#29589). Pat... - Redmine

あたらしくトラッカーを作る際にデフォルトステータスの選択肢が空白のままだと保存してもエラーが出てしまうので初期値として、ステータスを設定するようにしています。

リビジョン 18294 - Remove code related to JRuby and unsupported Ruby versions (#29441). Patch b... - Redmine

ん? JRubyサポートやめるのかな? Unsupported Ruby versionsのほうはわかる。

まあでもテストファイルの変更だけか

リビジョン 18295 - Remove code related to JRuby and unsupported Ruby versions (#29441). Patch b... - Redmine

と思ったらGemfileからもjrubyの場合はrmagick入れないみたいなガードが外れてる...

リビジョン 18296 - Increase maximum size for role name (#27625). Patch by Aleksandar Pavic. - Redmine

ロールの名前が30文字制限だったのを255文字に増やしています。

リビジョン 18297 - Issue macro for flexible linking to issues (#29489). Patch by Jens Krämer. - Redmine

Wiki{{issue(123)}}みたいなマクロを書くといい感じにチケット名等が展開されたリンクがはれるようになりました。 チケットの#だけだとわかりづらいですよね。べんりになりそう。

リビジョン 18298 - redmine_plugin_model_generator improvements (#27659). Patch by Javier Menénd... - Redmine

bin/rails g redmine_plugin_model--parentオプションが効くようになりました! 他、--migration / --no-migrationオプションでマイグレーションファイルをつくる/つくらないを選べるようになったり 生成されるマイグレーションのファイル名がタイムスタンプになったりしました。

タイムスタンプ便利なのかな?

結構一度にいろんな改善詰め込んでいるように見える

リビジョン 18299 - Code cleanup: RuboCop: Style/UnneededInterpolation - Redmine

rubocopの怒られを直してそう

リビジョン 18300 - Code cleanup: RuboCop: Layout/TrailingWhitespace - Redmine

rubocopの末尾の空白の怒られを直してそう

リビジョン 18301 - Add honorific suffixes ("san") in Japanese translation (#29151). Patch by Go... - Redmine

日本語訳で「山田太郎が追加しました」みたいな感じの訳になっていたのを「山田太郎さんが追加しました」のように「さん」をつけて敬語にしてそう

リビジョン 18302 - Test failure (#31444). - Redmine

I18nのlocaleを英語にしないと先程追加したユーザー型カスタムフィールドの選択肢に自分を追加するテストが落ちるよう。

Feature #31444: Add "<< me >>" option to user format issue custom fields - Redmine

あるあるですね

RSpecでテストするときI18n以外にも何箇所かbeforeで設定をいじった記憶あるけど、TestUnitだとこれでいい感じに通るのだろうか

リビジョン 18303 - Move the links from the sidebar under actions dropdown (#30294). Patch by Ma... - Redmine

チケット関連の操作をサイドバーから、チケット一覧画面のドロップダウンメニューに移動しています。

これは、どこに行ったか分からなくなるユーザーが出そう...?

みんな「...」に馴染み深いから大丈夫なのかなぁ

リビジョン 18304 - Remove "View all issues" link from actions dropdown (#30294). Patch by Mariu... - Redmine

さきほどのコミットで追加された全てのチケットを表示の操作を外しています(すでに一覧画面で見てるもんなぁ)

リビジョン 18305 - Add links to administration pages in project settings (#30203). Patch by Go ... - Redmine

管理者の場合、プロジェクトの設定画面の各項目のよこに、管理画面の対応する項目へのリンクを追加しています。 プロジェクトでカスタムフィールドの設定とかいじっていて、新しくカスタムフィールド追加したくなったときにちょくで飛べるようになってべんり。

リビジョン 18306 - Add a randomized name attribute to all form fields (#26604). This is a worka... - Redmine

Firefoxのバグで意図しない内容がフォームから送られるのを防ぐために、フォームのname属性にランダムな名前をつけています。

リビジョン 18307 - Wiki page collapse block image is not displayed in exported PDF (#30162). Pa... - Redmine

Wikiで開いたり閉じたりできるところにはった画像がPDFに出力されないのを、されるように直しています。 これこないだ詳しくみたけど内容忘れてしまった。 なんかマクロの中で更に他のページ読んだときとかにも展開が引き継がれるようにオプションバケツリレーしてたような...

リビジョン 18308 - Test errors with SQLite3 (#10378). - Redmine

さきほどの空の項目を通知メールに表示しない変更で、メーラーのテストがSQLite3でエラーになっていたのを直しています。 読み込むfixtureが足りてなかったよう。 なんでその状態でSQLite3以外は通るんだろう...