Tbpgr Blog

元エンジニア 人事 tbpgr(てぃーびー) のブログ

Python | TODO管理ツール 日次集計結果保存スクリプトの作成

概要

TODO管理ツール 日次集計結果保存スクリプトの作成

内容

基本構成

now.yml=>当日の作業内容をyaml形式で管理するファイル
任意のフォルダ/todo/yyyy/mm/yyyymmdd_todo.yml=>日々の作業結果を保存するフォルダ構成

日々の作業内容をまとめる基本フォーマットは以下
title: yyyy/mm/dd
contents:
  - "title", "summary", "estimate", "from_date", "to_date", "diff_date"
  - "title", "summary", "estimate", "from_date", "to_date", "diff_date"
  # タスク数分続く
  - "title", "summary", "estimate", "from_date", "to_date", "diff_date"

要件

・1日の作業を終えてnow.ymlを記述し終わったらPluginを実行する。
・任意のフォルダ/yyyy/mm/ファイルを探し、無ければ作成する
・now.ymlファイルをコピーしてyyyymmdd_todo.ymlとして上記フォルダに保存する。
・ファイルの出力まで正常に終了したらnow.ymlの内容を以下のようにする

title: yyyy/mm/dd (翌日)
contents:

・出力元のnow.yml、出力先の「任意のフォルダ」のパスは設定ファイルで設定可能にする。
設定ファイルはPluginのPythonと同じ階層に「daily_calculate_cfg.yml」という名前で配置する。

ソースコード

# -*- coding: utf-8 -*-
import yaml
import os
import re
import shutil
import datetime

# 設定ファイル名、場所は任意の箇所に設定
CFG_PATH = 'daily_calculate_cfg.yml'
class DailyTodoManage:
  def output_path(self): 
    return self._load_yaml()['output']

  def input_path(self): 
    return self._load_yaml()['input']

  def load_daily_yaml(self): 
    return yaml.load(open(self.input_path()).read().decode('utf-8'))

  def get_year(self, ymd):
    return ymd[0:4]

  def get_month(self, ymd):
    return ymd[5:7]

  def get_tommorow(self):
    d = datetime.datetime.now()
    d = d + datetime.timedelta(days=1)
    return '%04d/%02d/%02d' % (d.year, d.month, d.day)

  def get_output_filepath(self, base_path, ymd):
    return base_path + "\\todo\\" + daily.get_year(ymd) + "\\" + self.get_month(ymd) + "\\" + self._get_output_filename(ymd)

  def clear_current_todo(self, input_path):
    template =u"""\
title: %s
contents:

    """ % self.get_tommorow()

    with open(input_path, "w") as f:
      f.write(template)


  def _load_yaml(self):
    return yaml.load(open(CFG_PATH).read().decode('utf-8'))

  def _get_output_filename(self, ymd):
    return ymd.replace("/", "") + "_todo.yml"

class YmdRegexp:
  def ymd_matcher(self, value):
    return True if self._get_ymd_pattern().match(value) else False

  def _get_ymd_pattern(self):
    return re.compile('^(\d){4}\/(\d){2}\/(\d){2}$')

class OutputManager:
  def create_todo_folder(self, base_path):
    self._create_folder(base_path, "todo")

  def create_ym_folder(self, base_path, year, month):
    self._create_folder(base_path + "\\todo", year)
    self._create_folder(base_path + "\\todo\\" + year, month)


  def _create_folder(self, base_path, dir_name):
    result_dir = base_path + "\\" + dir_name
    if (not os.path.isdir(result_dir)):
      os.mkdir(result_dir)
      print "success create result_dir:" + result_dir

daily = DailyTodoManage()
daily_yaml = daily.load_daily_yaml()
title = daily_yaml["title"]

if (not YmdRegexp().ymd_matcher(title)):
  raise ValueError, 'invalid settings[title] title have to yyyy/mm/dd format' 

base_output_path = daily.output_path()
output = OutputManager()
output.create_todo_folder(base_output_path)
output.create_ym_folder(base_output_path, daily.get_year(title), daily.get_month(title))
shutil.copyfile(daily.input_path(), daily.get_output_filepath(base_output_path, title))
daily.clear_current_todo(daily.input_path())

設定ファイル ※xxxx.yml,yyyyの部分には任意のファイル名・パスを設定

input: xxxx.yml
output: yyyyy

実行結果

例えば本日の作業内容に対して実行した場合
任意のパス/todo/2013/06/20130609_todo.yml
が作成されることを確認。

処理実行後のコピー元ファイルの状態

title: 2013/06/10
contents:

    

関連

TODO管理ツール 作業時間計測用Plugin開発
http://d.hatena.ne.jp/tbpg/20130523/1369333076