|
|
プロダクト化
プロダクト化する方法について皆でお勉強しましょう
最初から要点だけ # 字下げが変 ソースみて下さい。 9/12 修正したけど、いろんなブラウザがあるのでどうかなあー 1.Zope の Pruducts に適当なフォルダを作成(普通は meta_type) や class 名と一緒の名前が良いでしょう ここでは 仮に POPMailDB とする。 2.作成したフォルダの中に dtml, www 等のフォルダを作成する。 通常 dtmlフォルダは dtml 文を www にはアイコン等を配置してあるようだ。(dtml,www は別名でも可) 3.POMailDB に __init__.py をつくる。 """POPMailDB Product""" import POPMailDB def initialize(context): context.registerClass( POPMailDB.POPMailDB, permission='Add POP objects', # -> パーミッション constructors=(POPMailDB.manage_addPopForm,POPMailDB.manage_addPop), # ↑ どこにプロダクトを初期化する手順があるか指定する icon='www/pop_icon.gif', # -> プロダクトのアイコン ) おきまりのパターンだから暗記、又はどこぞのプロダクトより拝借して変更すれば良いでしょう。 4.POPMailDB/dtmlに manage_addPopForm.dtml を書く 5.POPMailDBの中に POPMailDB.py を作成してスクリプトを書く import string, os from Globals import Persistent, DTMLFile, InitializeClass, package_home from AccessControl.Role import RoleManager import Acquisition, sys, types import OFS.SimpleItem from OFS.DTMLMethod import DTMLMethod from OFS.Folder import Folder from AccessControl import ClassSecurityInfo, getSecurityManager from DateTime import DateTime 通常必要になる物を import する。 from POPTemplates import POPTemplates 別に自分で作ったスクリプトも必要なら import する。 manage_addPopForm=DTMLFile('dtml'+os.sep+'addPopForm', globals()) 初期化用 dtml をスクリプトに教える。これもお決まりパターン os.sep はパスの区切り文字です。 win なら「¥」 linux は「/」 def manage_addPop( self, id, title='', penname='nopenname', user='noname', passwd='nopass', server='noserver', timeout=1.0, REQUEST=None ): ' add aPOP3 into the system ' ob = POPMailDB( id, title, penname, user, passwd, server, timeout ) self._setObject( id, ob ) これもだいだいお決まりパターン self._setObject で登録。 プロダクト内に dtml, pythonScript 等配置したい場合は、今self._setObject で登録したオブジェクトを ob 変数にいれる ob = self._getOb(id) POPTemplate.py に書いた辞書を呼び出し dtmlMethod を配置する。 for (id, data) in POPTemplates.items(): ob.addDTMLMethod(id, file=data) 今回は dtml を配置する為 Folder を継承する。 class POPMailBase(Folder): メタタイプを作成 meta_type='POPMail Database' 作成したプロダクトの値を変更する dtmlMethod をスクリプトへ教える manage_changePOPMail=DTMLFile('dtml'+os.sep+'managePopMail', globals()) セキュリティ設定 security = ClassSecurityInfo() security.declareProtected( 'Change configuration', 'manage_makeChanges' ) 値を変更するスクリプト def manage_makeChanges(self, title, penname, user, passwd, server, REQUEST=None): 'make the changes' title=str(title) penname=str(penname) user = str(user) passwd = str(passwd) server=str(server) self.title=title self.penname = penname self.user = user self.passwd = passwd self.server=server if REQUEST is not None: msg = 'POP Mail %s updated' % self.id return self.manage_main( self , REQUEST , manage_tabs_message=msg ) Zope 内でプロダクトを新規に作成する時に表示されるタブに上で作成した manage_makeChanges 等を配置 継承したFolder のタブ+ manage_makeChanges「Edit」というラベルで表示される ヘルプは今回ないので # としてます。 manage_options= Folder.manage_options+( {'icon':'', 'label':'Edit' ,'action':'manage_changePOPMail' #,'help':('MailHost','Mail-Host_Edit.stx') }, ) 次にプロパティを作成 title, content_type を作成 _properties=( {'id':'title', 'type': 'string', 'mode':'w'}, {'id':'content_type', 'type': 'string', 'mode':'w'}, ) content_type に初期値を設定 content_type = 'text/plain; charset=iso-2022-jp' # だいだいこんな所。 # python と dtml が書ければもうあなたも作成可能っす。 # さあ、なんか作って投稿しましょうよ # 簡単なやつからね。 PS>オセロ待ってまーす。(こっそり呼び出してみる)
>>2 DB だけでも分けてくれると助かるけど。無いものねだり;; あ、嬉しい仲間ができた。 ソースが汚くてゴメン! >>特に限定しなくてもよさそうな気がします。 koyoshi さんの RoolScreen が良いかなと思ったけど、koyoshi さんの楽しみを奪ってわいけないので(^o^);; RDB は Products/POPMailDB/maildb.fdb にあります。 予備が、Products/POPMailDB/www/maildb.fdb にあります。 Firebird を使ったのは、あらかじめこちらで作成して準備する事ができる為です。 ポスグレで作成するには、データベースを作成して貰うか、その処理をプロダクト側でしなければならないから、題材に不適当と思っただけです。 実は最初、kinterbasdb 用 Python Database API2.0にて内部にデータベースへアクセスするスクリプトを書いていた。(意図した動きをしなかったけど^^;;) # プロダクト作成が簡単なRDBは Firebird だと思います。 でもこの状態で少し手をいれればポスグレで動かす事も可能です。 Psycopg_Database_connection を展開した POPMailDB に作成し、mailtb と言うテーブルを作成して、POPMailDB 内にある ZSQLMethod の Connection Id を作成した Psycopg_Database_connectionに変更すれば良いと思います。 以下 Create table mailtb のZSQLMethod ---- CREATE TABLE mailtb ( message_uid varchar(80) NOT NULL, message_id integer, message_size varchar(20), header_len integer, message_from varchar(254), message_to varchar(254), subject TEXT, message_date varchar(60), unread integer, body TEXT, delchk integer, PRIMARY KEY(message_uid) ) ---- ちなみに Firebirdの create table mailtb ---- CREATE TABLE mailtb ( message_uid varchar(40) CHARACTER SET EUCJ_0208 NOT NULL, message_id integer , message_size varchar(10) CHARACTER SET EUCJ_0208, header_len integer, message_from varchar(127) CHARACTER SET EUCJ_0208, message_to varchar(127) CHARACTER SET EUCJ_0208, subject varchar(250) CHARACTER SET EUCJ_0208, message_date varchar(30) CHARACTER SET EUCJ_0208, unread integer, body blob SUB_TYPE TEXT CHARACTER SET EUCJ_0208, delchk integer, PRIMARY KEY(message_uid) ) ---- PS > お勉強になっていないのでちょっとだけ。 1. Database_connection の Connection_Id を Products/POPMailDB/maildb.fdb にする為の処理 解りにくいな、ようするに自分の作ったプロダクトのディレクトリィ位置 --- from Globals import package_home file_path = package_home(globals()) この file_path が作成したディレクトリィになる maildb_path = file_path+os.sep+'maildb.fdb' で達成できる。 --- 2. dtmlMethod,PythonScript を作成したプロダクトに配置するには --- from OFS.Folder import Folder class hoge(Folder): xxxx --- Folder や Folderを継承したクラスを継承する。 例えば Zch 等のように class ZchSite(ZCatalog.ZCatalog): xxx うそ書いていたら突っ込んで下さい。>ALL
ひーっ難しい POPMailDB プロダクトかっこいいですね。ポスグレに入らないかな? DB だけでも分けてくれると助かるけど。無いものねだり;; >> なにか適当な題材があれば変更しても良いと思います 特に限定しなくてもよさそうな気がします。 僕は勉強がてら将棋盤をプロダクトにしようと思ってました。最初はオセロかも。
|
|