TurboGearsで何か作る

と、いうわけでTurboGearsが動くようになったので、公式サイトのチュートリアルを参考にしながらToDoアプリを作ってみます。

まずは、モデルを作る。
SQLObjectはActiveRecordパターンということで、クラス名とテーブル名、クラスのプロパティとテーブルのカラムが対応するかたちになる。
なので、テーブル名クラスの中に、カラムを設定していく。

model.py

class TodoList(SQLObject):
    title = UnicodeCol(default='', length=255)
    content = UnicodeCol(default='')
    created = DateTimeCol(default=datetime.now)  #作成日時
    deadline = DateTimeCol(default=None) #〆切り
    finished = DateTimeCol(default=None) #終了日時
    user = ForeignKey("User")

    def isfinish(self):
      return self.finished is not None

    isdone = isfinish()

class User(SQLObject)
  ・・・
  todolist = MultipleJoin("TodoList", joinColumn="user_id")

ユーザーとTodoは、1対多になるので、TodoクラスにUserクラスへの外部キーを設定する。
UserクラスにTodoクラスへの参照を設定するには、MultipleJoin()を使えばいいらしい。

モデルを設定したら、SQLを発行して設定した内容のテーブルを作る。

tg-admin sql create

と、打ったらモデルに設定した内容でデータベースにテーブルが作られた!すげー


ではではコントローラを書いてく。
TurboGearsでは、CherryPyというコントローラを使っていて、URLとクラス・メソッドを結びつけてくれるそうです。
controller.py

class Root(controllers.RootController):
  todo = Todo()

としてやると、「http://localhost:8080/todo/」にアクセスすると、Todoクラスのindex()を実行してくれる。

class Todo(controllers.RootController):
  @identity.require(identity.not_anonymous())
  @expose(template="tgtest.templates.todo")
  def index(self):
    all_todolist = identity.current.user.todolist
    todolist = [dict(title=t.title,
              deadline=t.deadline,
              content=t.content,
              isdone=t.isdone) for t in all_todolist]
    return dict(todolist=todolist)

「@identity.require(identity.not_anonymous())」は、ログインしているかをチェック、
「@expose(template="tgtest.templates.todo")」は、戻り値を渡して表示するテンプレートの指定です。
モデルで、テーブルの関係を設定しているので、「identity.current.user.todolist」で今ログインしているユーザーのToDo一覧を取ってこれます。

最後にテンプレートを作る。
todo.kid

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:py="http://purl.org/kid/ns#" py:extends="'master.kid'">
<head>
  <meta content="text/html; charset=utf-8" http-equiv="Content-Type" py:replace="''"/>
  <title>ToDo</title>
</head>
<body>
  <div id="main_content">
    <!-- ToDoを表示 -->
    <div align="center">
      <ul>
        <li py:for="task in tasks">
          <span py:content="task['title']"></span>
          <span py:content="task['deadline']"></span>
          <span py:content="task['content']"></span>
        </li>
      </ul>
    </div>
  </div>
</body>
</html>


ToDoテーブルにデータを適当に放りこんで、「http://localhost:8080/todo」にアクセスしてログインすると・・・
無事放り込んだToDoデータの一覧が表示されたー

あー疲れた。細かく追加した機能はまた後で書く。
と、いうかPHPと比べると、TurboGearsについて書いてる日本語サイトのひっかかる量が少なすぎ。。。
やっぱり日本ではTurboGearsはメジャーじゃないのか、TurboGearsを使っている人があまりブログを書かないのかどっちなんだー

でも、ファイルの更新検知してWebサーバーを自動リブートとか、URLとメソッドのマッピングとか、expose()の仕組みとかでCherryPyのソース読んでたらめちゃめちゃ勉強になりました。
こんな自分でも読めるってことは、やっぱりPythonはきれいに書けるというのは本当かもしれないです。
とか書いてたらだんだん好きになってきたので、もっとTurboGears調べて書いてみようっと。