投稿練習(73, 0)
 メ-ル希望(3, 0)
 障害情報(18, 0)
 雑談(871, 0)
 業務報告(284, 0)
 VineseedにZope(623, 0)
 Zope27使おう(6, 0)
 ImgBBS(14, 0)
 会員専用(0, 0)
 ぼやき場所(27, 0)
 メモ(32, 0)
 eclipse(6, 0)
  

プロダクト化

プロダクト化する方法について皆でお勉強しましょう

投稿画面の表示を 

検索文字 

お名前  EMail 
 左に表示されている数値を入力してください 


4 kiyo 2003年 9月11日 10時31分 Id=kiyo

最初から要点だけ
 
# 字下げが変 ソースみて下さい。
  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>オセロ待ってまーす。(こっそり呼び出してみる)



3 kiyo 2003年 9月11日 7時52分 Id=kiyo

>>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



2 owa 2003年 9月11日 0時13分 Id=owa

ひーっ難しい
POPMailDB プロダクトかっこいいですね。ポスグレに入らないかな?
DB だけでも分けてくれると助かるけど。無いものねだり;;
 
>> なにか適当な題材があれば変更しても良いと思います
特に限定しなくてもよさそうな気がします。
僕は勉強がてら将棋盤をプロダクトにしようと思ってました。最初はオセロかも。



1 kiyo 2003年 9月10日 21時18分 Id=kiyo

メール送受信のプロダクト( http://fzug.com/fzug_prog/zopeing/d_load/TEST/POPMailDB-0.1.*** )を作成してみました。
POPで受信したファイルをデータベースへ納めるようにしました。
 
必要なファイル
FirebirdSS-1.0.3.972-0
kinterbasdbDA 3.0-pre-4
Kconv
かなりソースが汚いので修正しようかと思いましたが、これからプロダクト作りを始める方にはそのままが良いと
判断しました。
メールは死んだと何処かのサイトでみたのですが、題材が思い浮かばなかった。
このプロダクトから学べるプロダクトの作成方法は
1.プロパティを配置して値を設定方法
2.dtml-Method,PythonScript等を作成したプロダクト内に展開する方法
位ですが、そのかわり内容が簡単です。
まだ、機能が足りないのでこれを元に一緒にお勉強しませんか?
なにか適当な題材があれば変更しても良いと思います。
 
サンプル
http://fzug.com/fzug_prog/POPMailDB