特定の Archetypes の id をフォルダ内で連番になるように生成する
Plone ではコンテンツを新規作成すると日付やタイトルから id が自動生成される。でも「それじゃちょっと都合が悪いんだ!」「DB みたいに通し番号で管理したいんだ!」みたいな要望があって、探してみたらそのものずばりの記事を発見。
Error
でも上の記事は Plone 2.1 時代の記事で、今の Plone 3.1 とかでは動かないみたい。
なので、最新版の Poi のコードを参考にしつつ、若干改造してみた。ほんと若干だけど。。
で、記事に書いてある Poi のコードだとフォルダ内に色んな Type のオブジェクトが含まれていてもそれら全てが連番計算の対象になるようになっているけど、これじゃ関係ないコンテンツまで連番になっちゃう可能性があるんで、連番にしたい Type のみ連番生成するようにして、そんで持って id が必ず5桁とか指定の桁数になるようにした。
とりあえず、以下コード。
Archetypes で作るときにスキーマとか定義するあのファイルのクラス内に記述する。
# Products/Sample/content/Sample.py # ~~~~~~~~~~~~~~~ # このへんにスキーマの定義とか諸々あって # ~~~~~~~~~~~~~~~ class Sample(BaseContent): security = ClassSecurityInfo() schema = schema meta_type = portal_type = 'Sample' archetype_name = 'Sample' _at_rename_after_creation = True # ~~~~~~~~~~~~~~ security.declarePrivate('_renameAfterCreation') def _renameAfterCreation(self, check_auto_id=False): parent = self.aq_inner.aq_parent max_id = 0 for id in parent.objectIds(spec=meta_type): # spec には meta_type を指定。なしだとフォルダ内全てのオブジェクトを取得する。 try: int_id = int(id) max_id = max(max_id, int_id) except(TypeError, ValueError): pass new_id = str(max_id + 1).zfill(5) # id を5桁に transaction.savepoint(optimistic=True) self.setId(new_id)
とりあえず、自動生成される id をいじるには基本的に BaseObject の _renamaAfterCreation 関数を上書きすればなんでもやりたいほーだいできるみたい。
parent を変更したり、objectIds じゃなくて searchResults とかを使うようにしたらサイト内にある全てのコンテンツを対象に連番生成できたりするかなーとか思いつつやってませーん。