BacklogAPI有効活用 -各担当者へ個別レポート-

目的

便利なバックログですが最近タスクがたまり気味のため
各タスクオーナに個別詳細レポートを送信する

やってみた事

各担当者へ納期順に個別レポートをメールする

送信されるレポートメールサンプル

担当者のメールアドレスに自分が担当分の下記レポートメールが送信され
代表者のメールアドレスには全ての担当者分がまとまって送信されます。

期限日:2014/06/24
[PRJ_NAME-95] 課題名
状態:処理済み / 担当者:XXX

2014/06/23 14:13:57
最新コメントの先頭100文字
https://space-name.backlog.jp/view/PRJ_NAME-95
...

プログラム本体

動作確認環境

  • Python 2.6.6
  • backlog lib (python)
    https://code.google.com/p/backloglib/

設定ファイル

プログラム本体と同一ディレクトリに配置の上
ファイル名を config.ini として下さい

1行目 プロジェクト名
2行目 代表者メールアドレス

ソースコード

#coding:utf-8

#####
## FileName:report_mail.py
## Author:Ryo Tanaka
## Version:0.3
## Date:2014/06/26
## Usage:./report_mail.py
## Summary:担当者別にBACKLOGのプロジェクトサマリをメール送信します
#####

__author__ = 'tanaka'
import datetime
import backloglib
import smtplib
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

config_file = "config.ini"

spacename = "スペースネームを記載 xxxx.backlog.jp の部分です"
username = "API用ユーザネームを記載 APIリクエストに使うユーザ名"
password = "API用ユーザパスワードを記載 APIリクエストに使うユーザのパスワード"

smtpsvr = "メール送信サーバアドレス"
port = 25
from_addr = "メール送信元アドレスを記載"

whole_report = ""
separator = "--------------------------------------------------------------------"

#
# load_config 設定ファイル読み込み
# @param cnf 設定ファイル名
#
def load_config(cnf):
    global line
    try:
        f = open(cnf, 'r')
        line = f.readlines()
        f.close()
    except:
        print cnf + "の読み込みに失敗しました"
        exit(1)

#
# create_message MIMETextを作成
# @param from_addr 送信元アドレス
# @param to_addr 送信先アドレス
# @param subject 件名
# @param body メール本文
# @param encoding 文字エンコーディング
# @return msg MIMEText
#
def create_message(from_addr, to_addr, subject, body, encoding):
    msg = MIMEText(body, 'plain', encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate(localtime=True)
    msg['X-Priority'] = '1'
    return msg

#
# send_mail メール送信
# @param from_addr 送信元アドレス
# @param to_addr 送信先アドレス
# @param msg 送信するMIMEText
#
def send_mail(from_addr, to_addr, msg):
    smtp = smtplib.SMTP(smtpsvr, port)
    smtp.sendmail(from_addr, [to_addr], msg.as_string())
    smtp.close()

#
# cut_comment コメント整形
# @param come コメント
# @return come 整形したコメント
#
def cut_comment(come):
    come = come[0:100]
    come = come.replace('\n', '')
    come = come.replace('\r', '')
    come = come.replace('\r\n', '')
    return come

#
# make_report 報告レポート作成
# @param due 期限日
# @param key 課題キー
# @param summary 課題の概要
# @param assigner 担当者
# @param url 課題URL
# @param time 時刻
# @param comment コメント
# @return rep 構築されたレポート
#
def make_report(due, key, summary, status, assigner, url, time, comment):
    global separator
    rep = u"期限日:" + due + "\n"  + \
        "[" + key + "] " + summary + "\n" + \
        u"状態:" + status + u" / 担当者:" + assigner + "\n" + "\n" + \
        time + "\n" + \
        comment + "\n" + \
        url + "\n" + "\n" + \
        separator + "\n"
    return rep

#
# convert_time 時刻整形
# @param str 日付文字列(YYYYmmddHHMMSS)
# @return t_str 整形済み日付文字列(YYYY/mm/dd HH:MM:SS)
#
def convert_time(str):
    time = datetime.datetime.strptime(str, "%Y%m%d%H%M%S")
    t_str = time.strftime("%Y/%m/%d %H:%M:%S")
    return t_str

#
# convert_date 時刻整形
# @param str 日付文字列(YYYYmmdd)
# @return t_str 整形済み日付文字列(YYYY/mm/dd)
#
def convert_date(str):
    time = datetime.datetime.strptime(str, "%Y%m%d")
    t_str = time.strftime("%Y/%m/%d")
    return t_str

#
# set_blank 空白埋め
#
def set_blank():
    global comment
    global time_str
    comment = ""
    time_str = ""

# #### #
# MAIN #
# #### #
if __name__ == "__main__" :
    load_config(config_file)
    projects = line[0].strip()
    chief_addr = line[1].strip()

    backlog = backloglib.Backlog(spacename, username, password)
    backlog_admin = backloglib.BacklogAdmin(spacename, username, password)

    project = backlog.get_project(projects)
    allusers = backlog_admin.get_users()

    report_subject = "【BACKLOG残タスク】" + project.key + "プロジェクトで未完了のタスクを報告します"

    mail_addr = [0] * (len(allusers) - 1)

    for cnt in range(len(allusers) - 1):
        mail_addr[cnt] = allusers[cnt].mail_address

    for prj_index in range(len(allusers) - 1):
        issues = backlog.find_issue({
            'projectId':project.id,
            'statusId':[1,2,3],
            'assignerId':allusers[prj_index].id,
            'sort':"DUE_DATE",
            'order':True
        })

        if len(issues) < 1:
            continue

        report = [0] * (len(issues) - 1)

        for issue_index in range(len(issues) - 1):
            issue = backlog.get_issue(issues[issue_index].id)
            comments = backlog.get_comments(issues[issue_index].id)

            if len(comments) < 1:
                set_blank()
            else:
                try:
                    comment = comments[-1].content # 最新のコメントを取得
                    time_str = convert_time(comments[-1].created_on) # 時刻を整形
                except:
                    set_blank()

            comment = cut_comment(comment)

            if len(comment) < 1:
                comment = u"コメントが存在しませんでした"

            if len(issue.due_date) < 1:
                due_date = u"なし"
            else:
                due_date = convert_date(issue.due_date)

            rep_section = make_report(due_date, issue.key, issue.summary, issue.status.name, issue.assigner.name, issue.url, time_str, comment)
            report[issue_index] = rep_section.encode('utf-8')
            report_msg = "".join(map(str, report)) # report配列を結合
            issue_index += 1

        try:
            to_addr = mail_addr[prj_index]
            body_msg = create_message(from_addr, to_addr, report_subject, report_msg, 'utf-8')
            whole_report += report_msg
            send_mail(from_addr, to_addr, body_msg)
        except:
            prj_index += 1
            continue

        prj_index += 1

whole_msg = create_message(from_addr, chief_addr, report_subject, whole_report, 'utf-8')
send_mail(from_addr, chief_addr, whole_msg)
exit(0)

投稿者プロフィール

takashi
Japan AWS Ambassadors 2023, 2024
開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て
2010年よりスカイアーチネットワークスに在籍しております

機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。

コメントを残す

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

Time limit is exhausted. Please reload CAPTCHA.

ABOUTこの記事をかいた人

Japan AWS Ambassadors 2023, 2024 開発会社での ASP型WEBサービス企画 / 開発 / サーバ運用 を経て 2010年よりスカイアーチネットワークスに在籍しております 機械化/効率化/システム構築を軸に人に喜んで頂ける物作りが大好きです。