目的
プロジェクトの課題が今週にどの程度更新され、そのうちどの程度が完了したか調べたい
プロジェクトを複数横断して、その週に更新されたチケットを集める
やってみた事
設定ファイルに記述されたプロジェクトで
その週に更新された課題を代表者のメールアドレスに送信する
送信されるレポートメールサンプル
代表者メールアドレスにその週に更新があったプロジェクト
とその課題がメール送信されます
▼ [PRJ_NAME] チケット 4件 更新 内完了 2件
[PRJ_NAME-10] 課題の概要
[PRJ_NAME-15] 課題の概要
[PRJ_NAME-22] 課題の概要
[PRJ_NAME-31] 課題の概要…
▼ [PRJ_NAME] チケット 3件 更新 内完了 0件
[PRJ_NAME-3] 課題の概要
[PRJ_NAME-11] 課題の概要
[PRJ_NAME-20] 課題の概要…
設定ファイル"config.ini"の記述例
Windowsのiniファイルの構文に従って設定ファイルを記述します
1234567891011 <span class="com"># 情報を取得するBACKLOGプロジェクトの名称(複数指定可)</span><span class="pun">[</span><span class="typ">ProjectName</span><span class="pun">]</span><span class="pln">project</span><span class="pun">:PROJECT</span><span class="pln">_1HOGE_PRJHUGAHUGA_SVCHOMUHOMU_AKMAWS_TESTNIFTY_ACTNIKONIKONIWEB_PUB_RELEASEUNIT-TANAKA</span>
123 <span class="com"># 代表者メールアドレス</span><span class="pun">[</span><span class="typ">ChiefAddress</span><span class="pun">]</span><span class="pln">address </span><span class="pun">=</span><span class="pln"> hogefoobar2015</span><span class="pln">@example</span><span class="pun">.</span><span class="pln">com</span>
1 |
<span class="com"> </span> |
プログラム本体
動作確認環境
- Python2.6.6
- backloglib(python)
https://code.google.com/p/backloglib/
設定ファイル
プログラムと同じディレクトリに配置の上
ファイル名をconfig.iniとしてください
ソースコード
# -*- coding: utf-8 -*- ##### ## FileName:report_mail_weekly.py ## Author:Ryo Tanaka ## Version:0.1.1 ## Date:2014/12/25 ## Usage:./report_mail_weekly.py ## Summary:更新が今週のBACKLOGのプロジェクトサマリをメール送信します ##### __author__ = 'tanaka' import math import datetime import backloglib import smtplib import ConfigParser 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 = 'メール送信元アドレスを記載' # # get_week_start その週の初めを取得します # @param today datetime.datetime.todayオブジェクト # @return week_start 週の初めの西暦(YYYYMMDD) # def get_week_start(today): week_start = today + datetime.timedelta(days=-week_start_offset) week_start = week_start.strftime('%Y%m%d') return week_start # # get_week_end その週の終わりを取得します # @param today datetime.datetime.todayオブジェクト # @return week_end 週の終わりの西暦(YYYYMMDD) # def get_week_end(today): week_end = today + datetime.timedelta(days=week_end_offset) week_end = week_end.strftime('%Y%m%d') return week_end # # 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() # # make_report 報告レポート作成 # @param project プロジェクト名 # @param summary 課題の概要 # @param issue 課題キー # @param total 課題数 # @param finish_total 完了した課題数 # @return rep 構築されたレポート # def make_report(project, issue, summary, total, finish_total): rep = u"▼ [" + project + u"]" + "\n" \ + u"チケット " + str(total) + u"件 更新 内完了 " + str(finish_total) + u"件" + "\n" \ + u"[" + issue + u"] " + summary + "\n" return rep # # append_report 報告レポート追記 # @param report 追記元レポート # @param issue 追記課題キー # @param summary 追記課題概要 # def append_report(report, issue, summary): rep = report + u"[" + issue + u"] " + summary + "\n" return rep # #### # # MAIN # # #### # if __name__ == "__main__" : config = ConfigParser.SafeConfigParser() config.read("./config.ini") projects = config.get("ProjectName", "project") projects = projects.splitlines() chief_addr = config.get("ChiefAddress", "address") today = datetime.datetime.today() week_start_offset = int(str(today.weekday())) week_end_offset = 7 - week_start_offset week_start = get_week_start(today) week_end = get_week_end(today) compiled_report = "" backlog = backloglib.Backlog(spacename, username, password) for prj_index in range(len(projects)): project = backlog.get_project(projects[prj_index]) report_subject = "【BACKLOG】" + project.key + "プロジェクト週次レポート" issues = backlog.find_issue({ 'projectId':project.id, 'sort':"DUE_DATE", 'updated_on_min':week_start, 'updated_on_max':week_end, 'order':1 }) issues_finished = backlog.find_issue({ 'projectId':project.id, 'statusId': 4, 'sort':"CREATED", 'updated_on_min':week_start, 'updated_on_max':week_end, 'order':1 }) total = len(issues) total_finished = len(issues_finished) if len(issues) < 1: continue report = [0 for cnt in range(len(projects))] for issue_index in range(len(issues)): issue = backlog.get_issue(issues[issue_index].id) if issue_index == 0: rep_section = make_report(project.key, issues[issue_index].key, issues[issue_index].summary, total, total_finished) report[prj_index] = rep_section else: report[prj_index] = append_report(report[prj_index], issues[issue_index].key, issues[issue_index].summary) report[prj_index] = report[prj_index].encode('utf-8') compiled_report += report[prj_index] + "\n" report = "".join(map(str, report)) # 配列を結合 whole_msg = create_message(from_addr, chief_addr, report_subject, str(compiled_report), 'utf-8') send_mail(from_addr, chief_addr, whole_msg) exit(0)
config.iniサンプル
# 情報を取得するBACKLOGプロジェクトの名称(複数指定可) [ProjectName] project:TEST1 TEST2 # 代表者メールアドレス [ChiefAddress] address = test@test.com
お詫び
2015/01/29 に上記ソースコードのメール送信部分にてエラーが起きてしまう部分を修正しました。
投稿者プロフィール
最新の投稿
- AWS2021年12月2日AWS Graviton3 プロセッサを搭載した EC2 C7g インスタンスが発表されました。
- セキュリティ2021年7月14日ゼロデイ攻撃とは
- セキュリティ2021年7月14日マルウェアとは
- WAF2021年7月13日クロスサイトスクリプティングとは?