redmine-kb-summary-mail.py
#!~/usr/bin/env python
# -*- coding: utf-8 -*-
import mysql.connector
from boto.ses.connection import SESConnection
import requests
import json
import datetime
# ----------------------------------------------
# mysqlにアクセスするためのパラメータ
mysql_config = {
'user': 'bitnami',
'password': 'password',
'host': '127.0.0.1',
'database': 'bitnami_redmine',
'charset': 'utf8'
}
# AWS SESを利用するためのパラメータ
aws_access_key_id = 'aws_access_key_id'
aws_secret_access_key = 'aws_secret_access_key'
from_address = 'from_address'
to_address = ['to_address']
reply_address = ['reply_address']
# redmineのAPIにアクセスするためのパラメータ
redmine_api_url = 'redmine_api_url'
redmine_kb_url = 'redmine_kb_url'
redmine_apikey = 'redmine_apikey'
# ----------------------------------------------
def get_row_from_db(table,where):
'''
MYSQLのテーブルからすべてを取得する
'''
connect = mysql.connector.connect(**mysql_config)
cursor = connect.cursor(buffered=True)
if where == '':
sql = "select * from {0}".format(table)
else:
sql = "select * from {0} {1}".format(table,where)
cursor.execute(sql)
article_list = cursor.fetchall()
cursor.close
connect.close
return article_list
# ----------------------------------------------
def send_mail_by_ses(body):
'''
Amazon SESでメールを送信する
'''
conn = SESConnection(aws_access_key_id,aws_secret_access_key)
conn.send_email(from_address,
'The summary of Redmine Knowledgebase',
body,
to_address,
reply_addresses=reply_address)
# ----------------------------------------------
def get_info_from_redmine(author_id,project_id):
'''
mysqlに格納されているauthor_idから名前を取得する
myqslに格納されているproject_idからidentifierを取得する
'''
# 作成者の名前を取得
if author_id != '':
url = redmine_api_url + 'users/' + author_id + '.json?limit=100'
r = requests.get(url,headers={'Content-Type': 'application/json','X-Redmine-API-Key': redmine_apikey})
data = json.loads(r.text)
author_name = data['user']['login']
else:
author_name = ''
# プロジェクトの識別子を取得
if project_id != '':
url = redmine_api_url + 'projects/' + project_id + '.json?limit=100'
r = requests.get(url,headers={'Content-Type': 'application/json','X-Redmine-API-Key': redmine_apikey})
data = json.loads(r.text)
project_identifier = data['project']['identifier']
else:
project_identifier = ''
return author_name,project_identifier
# ----------------------------------------------
if __name__ == '__main__':
'''
メイン処理
'''
# メールの本文を作成する
body = '宛先各位\n\n' \
'お疲れ様です。\n\n' \
'本日更新されたナレッジ一覧を送付します\n\n' \
'---------------------------------------------------------------------------\n' \
'記事\n' \
'---------------------------------------------------------------------------\n' \
row = ''
# 記事のテーブルから記事の配列を取得する
article_list = get_row_from_db('kb_articles','')
'''
table value of kb_articles
0:id
1:category_id
2:title
3:summary
4:content
5:created_at
6:updated_at
7:author_id
8:comments_count
9:project_id
10:updater_id
11:version_comments
12:version
'''
for row in article_list:
# 今日の1日前を求める
today = datetime.datetime.today()
point = today - datetime.timedelta(days=1)
# 更新日付と1日前を比較する
if row[6] >= point:
author_name,project_identifier = get_info_from_redmine(str(row[7]),str(row[9]))
body += '{0} by {1}\n'.format(row[2].encode('utf-8'),author_name)
body += '{0}{1}/knowledgebase/articles/{2}\n\n'.format(redmine_kb_url,project_identifier,row[0])
body += '---------------------------------------------------------------------------\n' \
'コメント\n' \
'---------------------------------------------------------------------------\n' \
# コメントのあった記事一覧を作成する
comment_list = get_row_from_db('comments','')
'''
table value of comments
0:id
1:commented_type
2:commented_id
3:author_id
4:comments
5:created_on
6:updated_on
'''
for comment_row in comment_list:
# 今日の1日前を求める
today = datetime.datetime.today()
point = today - datetime.timedelta(days=1)
# 更新日付と1日前を比較し、メール報告対象のコメントをチェックする
if comment_row[6] >= point:
# コメントされた記事の情報を取得
comment_article = get_row_from_db('kb_articles','where id = {0}'.format(str(comment_row[2])))
for article in comment_article:
# コメント内のauthor_idと記事内のproject_idからログイン名とproject_identifierを取得する
author_name,project_identifier = get_info_from_redmine(author_id=str(comment_row[3]),project_id=str(article[9]))
# 記事のタイトル
body += '{0}\n'.format(article[2].encode('utf-8'))
# 記事のURL
body += '{0}{1}/knowledgebase/articles/{2}\n\n'.format(redmine_kb_url,project_identifier,article[0])
# コメントしたログイン名
body += '-->{0}がコメントしました\n\n'.format(author_name)
# メールの最後を作成する
body += '---------------------------------------------------------------------------\n\n' \
'以上\n\n' \
'send by redmine-kb-summary-mail'
# SES でメールを送信する
send_mail_by_ses(body)