【C#】redmine-net-apiでRedmineからRESTAPIで作業時間を取得

今回はRedmineからRESTAPIを使って作業時間を取得して、データを加工して表示するWindowsアプリを作ってみます。C# では、redmine-net-api というものがReadmineの公式ページからダウンロードできるようなので、それを使います。

やりたいこと

Redmineの作業時間のページです。作業時間は日付順にソートされています。しかし、この画面から作業時間の集計が非常にめんどくさいです

なので、C#で、自動的に集計してテキストで出力するWindowsアプリを作成します。

↑のように設定を入力してボタンを押したら自動的に出力します。

Redmineからデータを取得するために、redmine-net-apiを使います。

開発環境
  • Windows10
  • Microsoft Visual Studio Community2019
  • .NET Framework 4.7.2
  • WPF アプリ( .NET Framework )
  • Redmine 3.4.2
  • redmine-net-api 3.0.6.1

redmine-net-api をダウンロードする

redmine-net-api は.ReadmineのREST APIにアクセスするために使われるC#のライブラリです。

※ 詳しくは Using the REST API with .NET から。

redmine-net-api は以下のページからダウンロードします。

C#のプロジェクトからredmine-net-apiを参照する

今回はC#のWPFアプリ (.NET Framework ) でプロジェクトを作成します。プロジェクト名は、RedmineTimeConversion とします。

プロジェクトからredmine-net-apiを参照するためには、ソリューション エクスプローラーから

  • ソリューションを右クリック
  • 追加→既存のプロジェクト

を選択します。

先ほどダウンロードしたredmine-net-apiの中の、redmine-net-api-master/src/redmine-net-api/redmine-net-api.csproj を選択します。

これで、redmine-net-apiが使用できるようになりました

RedmineのREST APIを使うためには、設定を有効にする必要があります。

管理権限のユーザーでログインし、管理→設定でAPI タブを選択し、「RESTによるWebサービスを有効にする」をチェックします。

redmine-net-api で作業時間を取得する

では、アプリを作成してみます。

using Redmine.Net.Api;
using Redmine.Net.Api.Types;
using System;
using System.Collections.Generic;
using System.Collections.Specialized;
using System.Windows;

namespace ReamineTimeConversion
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            - 略 -
        }

        // 作業時間を取得ボタン押し
        private void Button_Click(object sender, RoutedEventArgs e)
        {
            - 略 -

            // redmine-net-apiで開始日から終了日までの作業時間データを取得する
            string date_start = ((DateTime)(Date_Start.SelectedDate)).ToString("yyyy-MM-dd");
            string date_finish = ((DateTime)(Date_Finish.SelectedDate)).ToString("yyyy-MM-dd");

            var manager = new RedmineManager(Setting.GetInstance().URL, Setting.GetInstance().APIKEY);
            var parameters = new NameValueCollection {
                                { RedmineKeys.LIMIT, "100" },
                                { RedmineKeys.PROJECT_ID, Setting.GetInstance().PROJECTID},
                                { RedmineKeys.SPENT_ON, "><" + date_start + "|" + date_finish } };

            try
            {
                // データ取得処理
                List<TimeEntry> timeEntryList = manager.GetObjects<TimeEntry>(parameters);

                // 出力用のクラスにRedmineから取得したデータを設定
                - 略 -

                // チケット順にソート
                - 略 -
            }
            catch( Exception )
            {
                TextBox_TimeEntryConversion.Text = "取得に失敗しました。";
            }
        }
    }
}

メインファイルのソースコードの一部です。

var manager = new RedmineManager(Setting.GetInstance().URL, Setting.GetInstance().APIKEY);

まずは、RedmineManager のオブジェクトを作成します。

設定パラメータ
  • string host : RedmineのURL ( https:// ~ )
  • string apiKey : Redmine のApiKey

RedmineのApiKey はRedmineのページから取得します。

個人ページから個人設定でAPIアクセスキーを表示できます。

var parameters = new NameValueCollection {
    { RedmineKeys.LIMIT, "100" },
    { RedmineKeys.PROJECT_ID, Setting.GetInstance().PROJECTID},
    { RedmineKeys.SPENT_ON, "><" + date_start + "|" + date_finish } };

次に、パラメータを設定します。

パラメータ
  • RedmineKeys.LIMIT : 取得する作業時間の最大数
  • RedmineKeys.PROJECT_ID : 取得するプロジェクトのID( 文字列 )
  • RedmineKeys.SPENT_ON : 取得する開始日から終了日 ( yyyy-mm-dd )
取得する開始日から終了日までのパラメータに “><開始日|終了日|”の形式を使っています。redmine-api-key のwikiで使っているのをそのまま使いました。
List<TimeEntry> timeEntryList = manager.GetObjects<TimeEntry>(parameters);

最後に作業時間のリストを取得します。RedmineManagerクラスのGetObjects メソッドで取得します。データはTimeEntryリスト形式で取得できます。

作成したプロジェクト

作成したプロジェクトは↓のサイトを参考にしてください。

 

まとめ

今回はRedmineからRESTAPIを使って作業時間を取得して、データを加工して表示するWindowsアプリを作ってみました。

C# では、redmine-net-api というものがReadmineの公式ページからダウンロードできるようなので、それを使いました。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です