TypeError: len() of unsized object (Plone3.2.2)
今回のエラーは、Ploneのコンテンツルールの拡張用プロダクトを追加した際に発生しました。
※追加プロダクトは、collective.contentrules.mailtogroup です。
Plone3.xには、コンテンツルールという機能が追加されました。
こちらは、コンテンツが指定の条件にマッチすると、登録しておいたアクションを実行してくれるという機能です。(SQLで言うところの、トリガのようなものでしょうか)
たとえば、こんなことができます。
- ニュースコンテンツを編集し、『非公開』から『公開』に遷移させた時に、指定のメールアドレスにそのURLやタイトルを送信する。
- 指定のフォルダの配下のコンテンツを削除したり更新した場合、バックアップ用のフォルダにコピーを作成する。
Plone2での利用中も、こういう機能は欲しかったのですが、とてもそんなカスタマイズやコーディングは無理でしたので、あきらめていました。出来るとしても、プロダクト個別対応くらいで、すべてのコンテンツタイプに適用できるようにPloneのコアの部分をいじるというのは、もっと無理です(^^;
それがPlone3.xでは、コードを書かなくとも、ニーズの高い条件とアクションが標準的に用意されていて、プルダウンやチェックボックスで選択して条件やルールを組み合わせることができるようになっていました。
用意されているアクションは、メール配信のほかには、コピーやバックアップ、ロギングなど。また、作成したルールも、コンテンツタイプやフォルダの場所に応じて使い分けが可能です。
使ってみたところ、なかなか良い感じだったので、冒頭で触れた、この機能の拡張用のプロダクトを追加してみることにしました。
手順は、buildout.cfg の[instance]セクションで、eggs & zcmlにcollective.contentrules.mailtogroupのエントリを追加するだけです。
あとは、buildout –> Ploneの管理画面から普通に プロダクトを追加。
これで、コンテンツルールのアクションの一覧に、『Plone上のグループ宛(グループに属するメンバー宛)にメールを送信』(Send email to groups and members) する項目が増えました。
さて、じゃあ実際に試してみようとすると…。
2009-08-07T14:16:31 ERROR Zope.SiteErrorLog http://………………/Plone/++rule++rule-1/+action/plone.actions.MailGroup
Traceback (innermost last):
Module ZPublisher.Publish, line 119, in publish
Module ZPublisher.mapply, line 88, in mapply
Module ZPublisher.Publish, line 42, in call_object
Module zope.formlib.form, line 770, in __call__
Module zope.formlib.form, line 885, in render
Module zope.formlib.form, line 764, in render……[長いので略] …………
Module zope.tales.tales, line 696, in evaluate - URL: /usr/local/Plone/buildout-cache/eggs/plone.app.form-1.1.6-py2.4.egg/plone/app/form/widgets/ubermultiselectionwidget.pt - Line 15, Column 2 - Expression:
- Names: {'args': (), 'context': , 'default': ………….. Module zope.tales.pythonexpr, line 59, in __call__
- __traceback_info__: (len(options['value']) == 0 and 'display: none' or None)
Module <string>, line 0, in ?
TypeError: len() of unsized object
プルダウンで選択し、条件を登録しようとしたところでエラーが発生!
調べてみたところ、どうやら、このバグに該当する模様でした。
- http://plone.org/support/forums/general#nabble-td2496203 (UeberSelectionWidget fails (Plone 3.2))
トラッカーのチケットを見ると、バグはFixされているようですが、リリースPlone3.3での反映になるようなので、取り急ぎ、差分を適用させることに。と言っても、2行程度のコード追加だったので、助かりました。
ただいま、PloneはUnified Installerをベースにbuildしたものなので、以下のファイルを修正。そのあと、bin/buildout –n しました。
- /usr/local/Plone/buildout-cache/eggs/plone.app.form-1.1.6-py2.4.egg/plone/app/form/widgets/uberselectionwidget.py
こういう修正の仕方は初めてだったのですが、buildout-eggsにダウンロードされたものは、再度ダウンロード&上書きされることは無かったので、いちおう変更は反映されて、OKになったようです。
良かった…。
plone.app.form-1.1.7でもエラーになり、まだ対応されていませんでした。
返信削除反映させたのは、こちらです。
https://dev.plone.org/plone/changeset/26001/plone.app.form/trunk/plone/app/form/widgets/uberselectionwidget.py