kongou-ae
11/15/2014 - 2:33 PM

redmine-kb-summary-mail.py

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)