定期的に処理を走らせる

それでは、メールによる締切通知部分を作成しようと思います。

まず、締切時にメールを送信する設定になっていて、かつ、締切を過ぎているのにまだメールを送信していないTODOタスクを抜き出します。

    now = datetime.datetime.today()
    now += datetime.timedelta(hours=9)
    queryset = Task.gql(
        "WHERE limit_time != :none "
        + "AND limit_time <= :now "
        + "AND is_notified = True "
        + "AND mail_send_time = :none "
        + "LIMIT 10 ",
        now=now, none=None)

ここで、Nullの判定をするのにわざわざ :none とバインド変数を定義して none=None とNoneバインドしているのは、GQLの仕様でIS NULLといった構文が用意されていないからです。また、LIMIT 10と限定しているのは、大量のTODOが引っかかって処理がタイムアウトすることを防ぐためです。ちなみに、現在日時に9時間を足しているのは、日本時間に合わせるためです。もちろん、ちゃんと作るにはタイムゾーンを指定するべきですが、今回は日本専用で自分用という位置づけなので目をつぶります。

次に、メール送信部分のメソッドを用意します。

def send_notifier_mail(task, now):
    message = mail.EmailMessage(sender="...")  # 管理者のメールアドレス
    message.to = task.user.email
    message.subject = u"金星翻車魚:締切のお知らせ"
    message.body = u'''
こんにちは、%sさん

ご登録いただいた以下のTODOが
指定された締切日時に到達したことをお知らせします。

タイトル: %s
締切 : %s
''' % (task.user.username, task.title, task.limit_time.strftime("%Y-%m-%d %H:%M"),)
    message.send()

    logging.info(message.body)
    task.mail_send_time = now
    task.save()
    return

これら二つの処理を組み合わせたメソッドをcronjobという名前でviews.pyに定義し、それを、/todo/cronというURLに紐づけることにします。

/todo/urls.py

urlpatterns = patterns('todo.views',
    (r'^$', 'list_tasks'),
    (r'^create$', 'add_task'),
    (r'^delete$', 'delete_task'),
    (r'^update$', 'update_task'),
    (r'^cron$', 'cronjob'),
)

これで/todo/cronというURLにアクセスすると締切お知らせメールが送信されるようになりました。このURLはGoogle App Engineのcron処理で利用し、一般のアクセスは受け取らないつもりですので、app.yamlに以下の行を付け足します。

/app.yaml

- url: /todo/cron
  script: common/appenginepatch/main.py
  login: admin

login: adminと指定することで、一般のアクセスを受け取らないようにしています。なお、この設定は、以下の一般アクセス用の設定の前に入れておきます。

/app.yaml

- url: /.*
  script: common/appenginepatch/main.py

最後に、Google App Engineのcron(定期実行処理)の設定を書けば完了です。app.yamlと同じトップフォルダにcron.yamlというファイルを作成し、以下の設定を書き入れます。

/cron.yaml

cron:
- description: todo cron job
  url: /todo/cron
  schedule: every 15 minutes

これで、15分おきに定期実行されるようになりました。いつものようにmanage.py updateコマンドを発行し、金星翻車魚のサイトを更新しました。さて、次から何をしようかな。