2011年4月22日金曜日

CRUD

CRUDが高級すぎてなんだか良く分からなかった。
最近、すこしわかってきた。要するにSQLFORMを1functionで済ませようという発想です。
データ一覧のテーブルのTHEADなどは呼ぶときに、messageや戻りアドレスはsettingsです。
その辺りはhttp://www.web2py.com/book/default/chapter/07#CRUDに詳しいのですが、実際に使うと驚くほどに簡単。


一番に理解を超えていたのが

def data(): return dict(form=crud())

とかくと、以下のURLがexposeされるという説明でした。
http://.../[app]/[controller]/data/tables
http://.../[app]/[controller]/data/create/[tablename]
http://.../[app]/[controller]/data/read/[tablename]/[id]
http://.../[app]/[controller]/data/update/[tablename]/[id]
http://.../[app]/[controller]/data/delete/[tablename]/[id]
http://.../[app]/[controller]/data/select/[tablename]
http://.../[app]/[controller]/data/search/[tablename]

これでViewはまったくいじらずに機能が実現します。

djangoにも同じようなのがありますが、結構に面倒くさかった。

そこで自分のアプリにも使ってみた。アドミだけが使うDBのメンテナンスだが、マスタースケジュールを作成、リスト、更新する

def list_schedule():
    db.schedule.id.represent=lambda id:  A('edit:',id,_href=URL('update_schedule',args=(id)))
    return dict(records=crud.select(db.schedule, db.schedule.id>0)) 
このfunctionはscheduleテーブルから全レコードを表示しています。表示されたIDの部分にhrefが隠れていて次の関数update_scheduleを呼びます。
 def update_schedule():
    return dict(form=crud.update(db.schedule, request.args(0),next=URL('list_schedule'))) 
scheduleを更新するフォームを表示して、更新したらlist_scheduleに戻ります。
 def create_schedule():
    form = crud.create(db.schedule, next=URL('create_schedule'),
           message=T("record created"))
    db.schedule.id.represent=lambda id:  A('edit:',id,_href=URL('update_schedule',args=(id)))
    return dict(form=form, records=crud.select(db.schedule, db.schedule.id>0,))
全てのscheduleと新規作成のフォームを表示しています。
ようするにappadminと同じなんですが、柔軟性と開発スピードではappadminとSQLFORMの間にあるということでしょうか。
htmlは何も書かなくて大丈夫です。

2011年4月9日土曜日

plugin_wiki SQLFORM カストマイズ crud.createで実行

plugin_wikiは強力です。
web2pyはphpと同じようにhtmlのなかにpythonコードを埋め込むことができます。
これはdjangoではできなかったことです。だからとんでもない(私にとっては)離れ業ができます。
SQLFORMもweb2pyの強力な武器ですが、この2つをつかって大方のデータベースがらみのページを作れます。
それをひとつ紹介します。

データベースの定義 db.py

db.define_table('plan',
    Field('hisname','string'),
    Field('date_start','date'),
    Field('date_end','date'),
    Field('mystyle','string',label ='私のスタイル'),
    Field('hisstyle','string',label='相手のスタイル'),
    Field('issue','text',label='起こりそうなコミュニケーション上の問題、上手にしたいこと'),
    Field('situation','text',label='どんな場面で対応性を発揮しますか。'),
    Field('action','text',label='その場面で対応性を発揮するにはどのように振る舞いますか'),
)
plugin_wikiのページ


``
{{#form = SQLFORM(db.plan)}}これは駄目です。
{{form = crud.create(db.plan)}}
        <h1>対応性向上計画</h1>
        {{=form.custom.begin}}
<table width=550>
    <tr>
        <td width=350>   計画の開始日と終了日</td><td width=200>どなたに対しての計画ですか</td>
        </tr>
    <tr>
        <td>{{=form.custom.widget.date_start}}{{=form.custom.widget.date_end}} </td>
        <td> {{=form.custom.widget.hisname}}</td>
    </tr>
</table><br/><br/>
<div>私のスタイル  {{=form.custom.widget.mystyle}}</div>
<div>この人のスタイル{{=form.custom.widget.hisstyle}}</div><br/>
考えられるコミュニケーション上の問題あるいは上達したいことはなにですか。<div class='plan'>  {{=form.custom.widget.issue}}</div>
どんな場面で対応性を発揮しますか。<div class='plan'>  {{=form.custom.widget.situation}}</div>
どんな言動をとりますか。<div class='plan'>  {{=form.custom.widget.action}}</div>
<p>{{=form.custom.submit}}</p>
{{=form.custom.end}}
``:template

画面 :テキストエリアが不細工ですが、これはcssで直すつもり。このサイトはsoialstyleclub.appspot.comでご覧になれます。因にこれはGoogle Application Enginesです。

2011年4月8日金曜日

plugin_wiki メニュー日本語

plugin_wikiは文字通り、リモートサイトでそのままページを編集できるすぐれものです。どこかですでに紹介しましたが、vimeo,youtube,slideshareなどの動画を表示できます。
pythonコードをそのまま組み込めます。なによりviewテンプレートがリモートで作成できます。
順調に開発を進めて来たのですが、メニューで躓きました。
meta_menuを使えば、menu.pyを上書きしてくれます。だからページを追加してもランチャー(私はGAEで開発しています)でアップロードしなくてもページ本体とそれを参照するメニューも更新できます。
問題はメニューのアイテムで日本語を表示するとアイテムとして認識してくれないのです。
たとえば
ホーム page:index
   スタイルの説明 page:explain

本来はメニューバーに「ホーム」が表示されて、そのサブメニューに「スタイルの説明」がぶらさがる筈ですがすべて無視されます。
そこでトリックを使いました。

.ホーム page:index

   .スタイルの説明 page:explain

という具合です。半角のピリオッドを冒頭に置くこととホームの下で1行開けることです。

本体にはもちろんお願いしました。

2011年4月5日火曜日

web2pyのスライドショー

ソーシャル・スタイル・クラブというサイトを開発していますが、そのほとんどをplugin_wikiで開発しました。
マニュアルにはありませんが、:templateというwidgetがあります。
このwidgetを使うとviewでできることは何でもできます。

このサイトはスタイルの学習サイトですから、コースの導入部でスライドショーをどうしても使いたかったのです。
Macのkeynoteでプレゼンテーションを作って、slideshare.comにアップロード。embedのスクリプトが表示されますからこれをtemplateタグの中にペーストして完成です。
このページにもペーストすると、以下のようになります。
因にslideshareのサイトは下のSlide1をクリックしてください。
Slide1
View more presentations from yutakakawate

2011年4月4日月曜日

Djangoグループを超えた


メッセージの数がDjangoユーザーグループを超えたそうです。
オリジナルのメッセージを転記します。


Massimo Di Pierro  
プロフィールを表示  
 詳細オプション 4月4日, 午前8:53
I mined some data from:
http://groups.google.com/group/web2py/about
http://groups.google.com/group/django-users/about
This web2py users group had 56,283 messages posted since 1/1/2009. The
Django-users list had 51,119 over the same time period.
Here is a plot showing the messages/month in the two users groups
http://i.imgur.com/GHcce.png
As you can see the surpass is significative and consistent since Oct
2009.
Now we know why some people are upset about web2py ;-)
Congratulations to all of you! 
Massimo