Python SOAP通信でmantisに案件を追加する(suds使用)

以前、C#からSOAP通信を経由して、mantisのデータ取得を行いました。

Visual C# 2008 Express Edition でSOAP通信
SOAP通信でmantisのプロジェクト名を取得する(Visual C# 2008使用)
SOAP通信でmantisに登録されている案件を取得する(Visual C# 2008使用)
SOAP通信でmantisに登録されている案件をCSV出力する(Visual C# 2008使用)


今回は、PythonからSOAP通信を使用して、mantisに案件の追加を行ってみます。




sudsのインストール



SOAP通信のライブラリに何を使用するか悩んだのですが、
https://fedorahosted.org/suds/
sudsというライブラリを使用することにしました。


ちなみに、SOAP通信を行うクライアントはUbuntu 11.10で、
Pythonのバージョンは2.7.2です。

$ python --version
Python 2.7.2+




easy_installでインストールしました。

$ sudu easy_install suds




※easy_installがインストールされていない場合は、

$ sudo apt-get install python-setuptools


でインストールできます。






簡単なサンプル



一番簡単な、バージョンを取得するサンプルを実行してみます。


  1. # -*- coding:utf-8 -*-
  2. from suds.client import Client
  3. url = 'http://www.example.com/mantis/api/soap/mantisconnect.php?wsdl'
  4. client = Client(url)
  5. mantis_connect_version = client.service.mc_version()
  6. print( mantis_connect_version )




まず、wsdlのURLを渡して、Clientを作成します。

次に登場する、service.mc_version()ですが、どこから出てきかたかというと、
http://[サーバーIP]/mantis/api/soap/mantisconnect.php

35_001_20120103170456.png


ここに、SOAPのAPI一覧が表示されますので、ここから使用したい機能の
API名を指定します。


実行してみると、バージョンが表示されます。
素っ気ないですが、とりあえずSOAP通信が行えることがわかりました。

$ python sample.py
1.2.8










案件の登録API



登録に使用するAPIは、「mc_issue_add」になります。
説明文には、このように記載されています。


Name: mc_issue_add
Binding: MantisConnectBinding
Endpoint: http://www.exapmle.com/mantis/api/soap/mantisconnect.php
SoapAction: http://www.exapmle.com/mantis/api/soap/mantisconnect.php/mc_issue_add
Style: rpc
Input:
  use: encoded
  namespace: http://futureware.biz/mantisconnect
  encodingStyle: http://schemas.xmlsoap.org/soap/encoding/
  message: mc_issue_addRequest
  parts:
    username: xsd:string
    password: xsd:string
    issue: tns:IssueData
Output:
  use: encoded
  namespace: http://futureware.biz/mantisconnect
  encodingStyle: http://schemas.xmlsoap.org/soap/encoding/
  message: mc_issue_addResponse
  parts:
    return: xsd:integer
Namespace: http://futureware.biz/mantisconnect
Transport: http://schemas.xmlsoap.org/soap/http
Documentation: Submit the specified issue details.




引数には、
username(string)
password(string)
issue(IssueData)
を取るようです。

username、passwordはよいとして、IssueData型はどのように作成するかというと、

client.factory.create('IssueData')



このように、client.factory.createを使用すれば作成できます。


こんなサンプルで試してみました。

  1. # -*- coding:utf-8 -*-
  2. from suds.client import Client
  3. url = 'http://www.example.com/mantis/api/soap/mantisconnect.php?wsdl'
  4. client = Client(url)
  5. issue = client.factory.create('IssueData')
  6. print( issue )




実行してみると、こんなかんじで1案件の内容を定義する「IssueData」オブジェクトが
生成されていることが確認できると思います。

$ python sample.py
(IssueData){
   id = None
   view_state =
     (ObjectRef){
         id = None
         name = None
     }
   last_updated = None
   project =
     (ObjectRef){
         id = None
         name = None
     }
   category = None





この中で登録時に必要となる値は、以下の4項目。

名称内容
projectObjectRef案件を登録するプロジェクト。idで指定する。
categorystring案件を登録するときのカテゴリー
summarystring案件の要約
descriptionstring案件の詳細


登録時の必須項目と同様です。
35_002_20120103170456.png



登録のテスト用に、「登録テストプロジェクト」という名前のプロジェクトを作成しました。
35_003_20120103170456.png


「登録テストプロジェクト」のidは1です。
35_004_20120103170455.png


合わせて、「登録カテゴリー」という名称のカテゴリーを作成しておきました。


この「登録テストプロジェクト」(id:1)に「登録カテゴリー」のカテゴリーで
案件を追加するサンプルは以下のとおり。


  1. # -*- coding:utf-8 -*-
  2. from suds.client import Client
  3. url = 'http://www.example.com/mantis/api/soap/mantisconnect.php?wsdl'
  4. client = Client(url)
  5. #IssueDataオブジェクトを作成
  6. issue = client.factory.create('IssueData')
  7. #登録するプロジェクトのid、カテゴリーなどを設定
  8. issue.project.id = 1
  9. issue.category = u'登録カテゴリー'
  10. issue.summary = u'要約'
  11. issue.description = u'内容'
  12. try:
  13.     result = client.service.mc_issue_add(
  14.         username='administrator',
  15.         password='root',
  16.         issue=issue)
  17.         
  18.     print( result )
  19. except Exception as e:
  20.     print e.message




実行してみると、ちゃんと要約と詳細が登録できました。
35_005_20120103170455.png

なお、戻り値「result」は登録して得られたチケットのIDになりますので、
この場合は「1」が帰ってきます。









添付ファイルの登録



これだけでは面白くないので、添付ファイルの登録も試してみます。

ファイルの登録ですが、案件の登録と同時には行えないようで、案件登録後に
取得できるIDをキーにして、別途「mc_issue_attachment_add」で登録しました。


mc_issue_attachment_addの引数は以下のとおり。


username: xsd:string
password: xsd:string
issue_id: xsd:integer
name: xsd:string
file_type: xsd:string
content: xsd:base64Binary





サンプルプログラムはこんな感じになりました。

  1. # -*- coding:utf-8 -*-
  2. import base64
  3. from suds.client import Client
  4. url = 'http://www.example.com/mantis/api/soap/mantisconnect.php?wsdl'
  5. client = Client(url)
  6. issue = client.factory.create('IssueData')
  7. issue.project.id = 1
  8. issue.category = u'登録カテゴリー'
  9. issue.summary = u'要約'
  10. issue.description = u'画像の追加テスト'
  11. try:
  12.     result = client.service.mc_issue_add(
  13.         username='administrator',
  14.         password='root',
  15.         issue=issue)
  16.     
  17.     #登録したい添付ファイルを開き、base64エンコードを行う
  18.     image_bin_data = ""
  19.     with open('image.jpg', 'r') as f:
  20.         image_bin_data = base64.encodestring( f.read() )
  21.     
  22.     #添付ファイルの登録を実行。
  23.     #issue_idに、result(直前で登録した案件のID)を指定する
  24.     attach_result = client.service.mc_issue_attachment_add(
  25.         username='administrator',
  26.         password='root',
  27.         issue_id=result,
  28.         name=u'添付画像.jpg',
  29.         file_type='image/jpeg',
  30.         content=image_bin_data)
  31.     
  32.     #結果は登録したファイルのID
  33.     print( attach_result )
  34. except Exception as e:
  35.     print e.message




実行してみると、ちゃんと添付されてます。
35_006_20120103170455.png



関連記事

コメント

非公開コメント

プロフィール

Author:symfo
blog形式だと探しにくいので、まとめサイト作成中です。
Symfoware まとめ

PR




検索フォーム

月別アーカイブ