When it’s ready.

出来るまで出来ない

GoogleAppEngieでigの付箋アプリみたいなの作りたい。

複数人で共有出来る付箋が非常に面白いとVoluntas氏から聞かされ、付箋の共有もかけてもらったのだが、全然情報が流れてこない。

くやしいので、GAEで付箋アプリもどきみたいなのを作ってみた。

Googleの付箋がうらでどらくらい賢い事をしているか判らないが、賢い事をする頭は持ち合わせていないので、後書き優先。上書きされたくなかったら、こまめにセーブよろ的な仕組みにすることにした。

pullするのを忘れない様に、フォームがクリックされると最新の内容にリフレッシュされる様にもしてみた。

アプリはここ>http://10.2.a2c.appspot.com/fusen
(次のデプロイで、アクセス不能になります。404な時は、マイナーバージョンを適当に上げてみてください。)


1)トップページで新規にノートを作成すると、上に自分が参加しているノートの一覧が表示される。
2)ノートの名前をクリックする事で、ノートの編集ページに移動する。

3)ノートのページでは、適当に書いて文字を保存できる。
4)ノートを共有したい人のメールアドレス(appspotにログインする際に使うもの)か、ニックネームを登録するとそのノートが共有される。

ノートの名前がurlになっているが、ノートに共有者登録が無いとそのノートを見る事が出来ない様になっている。

と、書いてみたが、項目4の共有の所がいまいち上手く行ってない。
ログインしている自分のuserオブジェクトは取れるけど他人のuserオブジェクトの取り方が判らないのと、userオブジェクトとニックネームをひも付けるテーブルを作ってみたけど、それらをListPropertyに入れて一網打尽にノートの情報を引っ張ってくる方法が分からない。

明日の勉強会で聞いてみよう。

以下ソース

# coding:utf-8
import logging
import wsgiref.handlers
from google.appengine.ext import db
from google.appengine.api import users
from google.appengine.ext import webapp
from google.appengine.ext.webapp import template

import urllib
import datetime
from google.appengine.ext.webapp.util import *
from django.utils import simplejson
from google.appengine.ext.db import djangoforms


class Card(db.Model):
  owner = db.UserProperty()
  title = db.StringProperty(multiline=True, required=True)
  body = db.StringProperty(multiline=True)
  audience = db.ListProperty(users.User)
  update = db.DateTimeProperty()
  create_at = db.DateTimeProperty(auto_now_add=True)


class NickName(db.Model):
  mine = db.UserProperty(required=True)
  nick_name = db.StringProperty(required=True)

class CardForm(djangoforms.ModelForm):
    class Meta:
        model = Card
        exclude = ['create_at']     # フォームに不要なプロパティリスト


class Index_Page(webapp.RequestHandler):
  @login_required
  def get(self):
    user = users.get_current_user()
    cards = Card.all().filter('audience =', user)
    p = {'cards':cards}
    p['card_form'] = CardForm()
    p['login_user'] = user
    #p['nick_name'] = NickName.all().get().get_by_key_name(user)
    self.response.out.write(template.render('templates/main.html', p))
  def post(self):
    user = users.get_current_user()
    card = Card.all().filter('title')
    self.request.get('body')

class note_page(webapp.RequestHandler):
  @login_required
  def get(self, note_title):
    user = users.get_current_user()
    card = Card.all().get().get_by_key_name(note_title)
    p = {'card':card}
    #p['card_form'] = CardForm(card[0])
    self.response.out.write(template.render('templates/note.html', p))
  def post(self, note_title):
    title = self.request.get('title')
    xbody = self.request.get('body')
    card = Card.get_or_insert(title, 
                                body = xbody
                                )
    card.body = xbody
    card.update = datetime.datetime.now()
    card.put()
    self.redirect('/fusen/note/%s'%(title))

class NewNote(webapp.RequestHandler):
  def post(self):
    user = users.get_current_user()
    title = self.request.get('title')
    card = Card.get_or_insert(title, 
                                owner = users.get_current_user(),
                                title = title,
                                body = u'空っぽのふせん',
                                update = datetime.datetime.now()
                                )
    card.audience.append(user)
    card.put()
    self.redirect('/fusen')


#-------------API--start------------------------

class Api_get_body(webapp.RequestHandler):
  def get(self):
    note_title= self.request.get('note')
    card = Card.all().get().get_by_key_name(note_title)
    res = {'body':card.body}
    self.response.content_type = 'application/json'
    self.response.out.write("%s" %
        (simplejson.dumps(res, ensure_ascii=False)))

#-------------API--end------------------------

def main():
  app_urls = [('/fusen', Index_Page),
              ('/fusen/note/(.*)', note_page),
              ('/fusen/new_note', NewNote),
              ('/fusen/api/get_body.*', Api_get_body),
              ('/fusen.*', Index_Page)
              ]
  application = webapp.WSGIApplication(app_urls, debug=True)
  wsgiref.handlers.CGIHandler().run(application)

#web.webapi.internalerror = web.debugerror


if __name__ == '__main__':
  main()