29926


以下のような動作を予定としてプログラムを組みました。  
1．redmineの機能を利用してcsvを取得する。  
2．csvの内容をxlsmファイルへコピペする。  
3．xlsmから情報をpythonの配列へ格納する。  
4.RestAPIを利用し、pythonからredmineへデータを書き込んで保存する。  
(2番までは手動で行う)

しかし、4番のpythonからredmineへデータを書き込んで  
保存を行おうとした際にエラーとなってしまいます。  
項目をそれぞれ切り分けていったところ、日付データの書き込みを  
保存しようとした際にエラーとなっていることが分かりました。

書き込む日付情報のフォーマットを変更してみましたが上手くいかず…  
redmineへ日付データの書き込みを可能とさせる型変換の方法を教えて頂けると有難いです。

以下、作成したプログラムと出力結果となります。  
見辛いかもしれないですがよろしくお願いいたします。

■実行したスクリプト＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

[code]

    #coding:shift_jis
    #■■■■■■■■■■■■■■■■■■データの格納処理
    def ImportXLSM(id,RedmineDays):
        redmine = Redmine('http://192.168.11.35',username='addmin',password='XXXX')
        issue=redmine.issue.get(id)
        issue.status_id=3
        issue.due_date=RedmineDays
        issue.save()
    #■■■■■■■■■■■■■■■■■■
    
    #初期素材準備
    import xlrd
    import datetime,re
    from redmine import Redmine
    FileName = 'ImportXLSM.xlsm'
    BookName = xlrd.open_workbook(FileName)
    SheetName = BookName.sheet_by_name('Sheet1')
    
    #データ格納配列A、一時格納配列B
    ListA=[]
    ListB=[]
    #カウント値、初期化
    con00=0
    con01=0
    
    #エクセルファイルのヘッダーを除いた行の数だけ処理を実行
    for row in range((SheetName.nrows)-1):
        #エクセルファイルの列の数だけ配列へ格納(１つのチケットの情報分)
        while con01 != 70:
            ListB.append(SheetName.cell_value(con00+1,con01))
            con01 = con01 + 1
        #チケット情報を持つ配列Bを配列Aの要素として格納
        ListA.append(ListB)
        ListB=[]
        con00 = con00 + 1
        con01 = 0
    
    #シリアル値から日付に変換（例として配列から期限日付を取得しています。）
    RedmineDays = ListA[0][50]
    RedmineDays = datetime.date(1900,1,1)-datetime.timedelta(1) +       datetime.timedelta(RedmineDays-1)
    
    print RedmineDays
    print type(RedmineDays)
    
    #配列の情報をredmineへ書き込む
    ImportXLSM(826,RedmineDays)
    
[/code]

■出力されるエラー＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝＝

[code]

    C:\Users\PC_USER01\Desktop>python test.py
    2016-06-08
    <type 'datetime.date'>
    Traceback (most recent call last):
        File "test.py", line 48, in <module>
            ImportXLSM(826,RedmineDays)
        File "test.py", line 10, in ImportXLSM
            issue.save()
        File "C:\Python27\lib\site-packages\redmine\resources.py", line 252, in save
            self.manager.update(self.internal_id, **self._changes)
        File "C:\Python27\lib\site-packages\redmine\managers.py", line 239, in update
            return self.redmine.request('put', url, data=data)
        File "C:\Python27\lib\site-packages\redmine\__init__.py", line 145, in request
    
        raise ValidationError(to_string(', '.join(e if is_string(e) else ': '.join(e
        ) for e in errors)))
    redmine.exceptions.ValidationError: 譛滓律 繧帝幕蟋区律繧医ｊ蠕後↓縺励※縺上□縺輔＞縲
    
[/code]


CC BY-SA 3.0
2016-10-24T09:24:05.953
29865
2016-10-27T01:38:29.397
2016-10-25T22:08:50.690
3054
19299
question
python redmine
python2.7にてredmineの日付書き込み時にバリデーションエラー

[code]

    redmine.exceptions.ValidationError: 譛滓律 繧帝幕蟋区律繧医ｊ蠕後↓縺励※縺上□縺輔＞縲
    
[/code]

エラーメッセージが化けていますが、ここに答が書いてあります。  
この文字化けを修正すると、以下の文面になります。

`期日 を開始日より後にしてください`

つまり、 `issue.due_date` に設定した日付が開始日よりも前だったために保存に失敗したということになります。

参考までに、文字化けの確認は以下のように行いました

[code]

    > python
    Python 2.7.12 (v2.7.12:d33e0cf91556, Jun 26 2016, 12:10:39) 
    >>> a = u'譛滓律 繧帝幕蟋区律繧医ｊ蠕後↓縺励※縺上□縺輔＞縲'
    >>> print a.encode('cp932').decode('utf-8', errors='ignore')
    期日 を開始日より後にしてください
    
[/code]

python-redmine
がValidationErrorにutf-8エンコードした文字列を渡していますが、日本語Windows等ではコンソールがcp932のために文字化けしているのでしょう。


CC BY-SA 3.0
2016-10-27T01:38:29.397
29926
2016-10-27T01:38:29.397
806
29865
answer