TODOタスクの状態表示と状態変更機能

前回で、TODOタスクに状態を持たせることができました。今度は、その状態の表示と、状態変化のロジックを実装することにします。

まず、TODOタスクの状態変化処理用のメソッドを用意します。

/todo/views.py

def update_task_status(request):
    if not request.user.is_authenticated():
        return render_to_response(request, "login.html")
    
    #ログインユーザのタスクかどうかチェック
    task = Task.get(request.POST["key"])
    if (task.user != request.user):
        return HttpResponseRedirect(reverse('todo.views.list_tasks'))
    
    task.status = int(request.POST["status"])
    task.put()
    
    return HttpResponseRedirect(reverse('todo.views.list_tasks'))

次に、/todo/update_statusにアクセスされたらこのメソッドが呼ばれるようにします。

/todo/urls.py

urlpatterns = patterns('todo.views',
    ...
    (r'^update_status$', 'update_task_status'),
    ...
)

最後に、TODOタスク一覧画面を変更し、個々のTODOタスクの状態と、状態を変更するボタンを追加します。

/todo/templates/task_list.html

<table class="list">
  <tr>
    <th width="400">タイトル</th>
    <th width="80">状況</th>
    <th width="250">締切</th>
    <th width="100">締切お知らせメール通知</th>
    <th width="200">変更</th>
    <th width="80">削除</th></tr>
  {% for task in object_list %}
  <tr><td><a href="update?key={{ task.key }}">{{ task.title }}</a></td>
  <td>{{ task.status_name }}</td>
  <td>{{ task.limit_time|date:"Y-m-d H:i" }}</td>
  <td>{% if task.is_notified %}する{% else %}しない{% endif %}</td>
  <form action="update_status" method="post">
  <input type="hidden" name="key" value="{{ task.key }}">
  <td>
    <select name="status">
      {% ifnotequal task.status 1 %}<option value="1">未着手</option>{% endifnotequal %}
      {% ifnotequal task.status 2 %}<option value="2">開始</option>{% endifnotequal %}
      {% ifnotequal task.status 3 %}<option value="3">完了</option>{% endifnotequal %}
      {% ifnotequal task.status 4 %}<option value="4">取消</option>{% endifnotequal %}
    </select>
    <input type="submit" value="変更">
  </td>
  </form>
  <form action="delete" method="post"><td><input type="hidden" name="key" value="{{ task.key }}"><input type="submit" value="削除"></td></form>
  {% endfor %}
</table>

これで状態を変更できるようになったので、いつものようにmanage.py updateコマンドを実行して金星翻車魚にアップロードしました。