特定ユーザを削除、ロックできないようにする(Redmine View Customize Plugin)

初期ユーザ(user_id=1)を、削除やロックできないようにしたいという要望です。(2つあって1つ目の方)

ボタンを非表示にするだけなので、CSSで対応します。

設定内容

  • Insertion position: Head of all pages
a[data-method="put"][href="/users/1?user%5Bstatus%5D=3"],
a[data-method="delete"][href^="/users/1"] {
  display: none;
}

動作

ユーザ一覧で表示されていたロック、削除ボタンが、

f:id:onozaty:20200920233656p:plain

下記のように非表示になります。

f:id:onozaty:20200920233515p:plain

また、ユーザの詳細画面でもボタンが消えます。

f:id:onozaty:20200920233623p:plain

Redmine Japan 2020 で「Redmineの画面をあなた好みにカスタマイズ – View customize pluginの紹介 –」というタイトルで発表しました

Redmine Japan 2020というイベントでView customize pluginについて発表しました。

資料はこちら。

まつもとさんの基調講演、前田さんの招待講演と続いて、いろいろな方々の経験にもとづく話が聞けて良かったです。
仕事があったので、自分の発表が終わったら抜けたのですが、ほんと最後まで聞けなくて残念でした。

自分の発表は、時間がギリギリになってしまったため、最後かなり巻きになってしまいました。時間配分考えて臨んだつもりが、、今回の失敗は次に生かそうと思います。
今回の発表でView customize pluginに興味持っていただいた方が一人でもいらっしゃったらうれしいです。

ありがとうございました。

JUnitの結果をCSVファイルに変換するツール(junit-xml2csv)を作りました

JUnitの結果を一覧で見たいなーってことで、CSVファイルに変換するツールを作りました。遅いテストを探すのに、EXCELでソートしたかったからです。

JUnitの結果XMLファイルが配置されているディレクトリ(Gradleだとbuild/test-results/testとか)と、出力ファイル名を指定すると、XMLファイル読み込んでCSVに変換します。

こんな感じのCSVになります。

TestSuite: Name,TestSuite: Timestamp,TestCase: ClassName,TestCase: Name,TestCase: Time,TestCase: Result
com.github.onozaty.junit.xml2csv.TestCase1,2020-08-28T04:39:49,com.github.onozaty.junit.xml2csv.TestCase1,test1,0.0,PASSED
com.github.onozaty.junit.xml2csv.TestCase1,2020-08-28T04:39:49,com.github.onozaty.junit.xml2csv.TestCase1,test2,0.0,FAILURE
com.github.onozaty.junit.xml2csv.TestCase1,2020-08-28T04:39:49,com.github.onozaty.junit.xml2csv.TestCase1,test3,0.001,ERROR
com.github.onozaty.junit.xml2csv.TestCase1,2020-08-28T04:39:49,com.github.onozaty.junit.xml2csv.TestCase1,test4,0.0,SKIPED
com.github.onozaty.junit.xml2csv.TestCase1,2020-08-28T04:39:49,com.github.onozaty.junit.xml2csv.TestCase1,test5,0.002,PASSED
com.github.onozaty.junit.xml2csv.TestCase2,2020-08-28T04:39:50,com.github.onozaty.junit.xml2csv.TestCase2,test1,0.0,PASSED
com.github.onozaty.junit.xml2csv.TestCase2,2020-08-28T04:39:50,com.github.onozaty.junit.xml2csv.TestCase2,test2,0.002,FAILURE

View customize の redmine.org でのURLが変わりました

redmine.org には、プラグインの情報を登録できる仕組みがあります。 登録したものは、下記で公開されます。

プラグインには、Identiferというプラグインを一意に表す識別子があり、上記サイトでもIdentiferを入力し、それがURLになるようになっています。

また、このIdentiferの情報を使って、インストール済みのプラグインの更新をチェックする仕組みがあります。

f:id:onozaty:20200825224858g:plain

で、本日下記のようなIssueをいただきました。

View customizeは既に登録済みなのに、なんでこんなIssueがあがるんだろう、、って思って確認したところ、redmine.orgに登録していたIdentiferが間違えていることに気が付きました。 view_customizeとすべきだったのがredmine_view_customizeになっていました。。

プラグイン側を変えるわけにはいかないので、redmine.orgに登録していたIdentiferを修正しました。これによってredmine.orgでのURLも変わることになりました。

redmine.org側にリンク張っていた方がいたら申し訳ありません。。

チェックボックスがチェックされたらテキストボックスを無効にする(Redmine View Customize Plugin)

上記の問い合わせに対応したサンプルコードを書いてみました。

チェックボックスをチェックしたら、テキストボックスを無効化します。

設定内容

  • Insertion position: Bottom of issue form
$(function() {

  const checkbox = $('#issue_custom_field_values_1');
  const text = $('#issue_custom_field_values_2');

  function changeEnableText() {
    text.prop('disabled', checkbox.prop('checked'));
  }

  checkbox.on('change', changeEnableText);

  changeEnableText();
});

動作

f:id:onozaty:20200823231739g:plain

FlywayのJavaコードによるマイグレーション

JavaのデータベースマイグレーションのライブラリであるFlywayですが、SQLファイルだけでなく、Javaのコードによるマイグレーションにも対応しています。

やり方は簡単で、SQLファイルと同じパッケージ(デフォルトだとdb.migration)配下に、SQLファイルと同じ規則でBaseJavaMigration を継承したクラスを追加して、migrateメソッドを実装するだけです。

package db.migration;

import org.flywaydb.core.api.migration.BaseJavaMigration;
import org.flywaydb.core.api.migration.Context;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;
import org.springframework.jdbc.datasource.SingleConnectionDataSource;

public class V2__Load_data extends BaseJavaMigration {

    @Override
    public void migrate(Context context) throws Exception {

        NamedParameterJdbcTemplate jdbcTemplate = new NamedParameterJdbcTemplate(
                new SingleConnectionDataSource(context.getConnection(), true));

        jdbcTemplate.update(
                "INSERT INTO customers(first_name, last_name, address) VALUES (:firstName, :lastName, :address)",
                new MapSqlParameterSource()
                        .addValue("firstName", "Taro")
                        .addValue("lastName", "Yamada")
                        .addValue("address", "Chiba"));
    }
}

SQLで書くのが面倒なもの(ロジック自体が既にJava側にあるようなものとか)は、SQLで頑張らずにJava側での処理で行った結果をデータベースに登録する、、といったことで手間が減らせそうです。
また、データベース以外(ファイルとして保存されているようなデータとか)のマイグレーションも、これを使うと合わせて行うことができるので、いろいろ幅が広がりそうだなーと思いました。

Redmine: View customize plugin の v2.7.0 をリリースしました

View customize plugin の v2.7.0 をリリースしました。

2つの機能追加、改修を行っています。

プロジェクト識別子で対象ページを指定可能に

プロジェクト識別子(正規表現)で対象ページを絞ることができるようになりました。

今までもそういったシチュエーションがあることは認識していて、JavaScriptでViewCustomize.context.project.identifierなどを参照してハンドリングするコードを書いていましたが、プロジェクト毎の指定が多くなると管理がしずらくなる(一覧で見た際にわからない)というのをPull Requestいただいた際に認識できたので、機能として入れることにしました。
(@basyura さんからPull Requestいただきました。ありがとうございます!)

Path Pattern を任意項目に

Path Patternを必須項目ではなく任意項目に変えました。未入力の場合は、すべてのページが対象になります。
Insert Positionが入ってから、Path Patternを.*とすることが多くなったので、いつか必須は外そうと考えていました。今回新たに入力項目が増えて良いタイミング(キャプチャ撮り直すのが1度で済む...)だと思ったので、あわせて対応しています。

f:id:onozaty:20200705212001p:plain