2009-08-08

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) する項目が増えました。

Plone: Contents Roules 

さて、じゃあ実際に試してみようとすると…。

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

プルダウンで選択し、条件を登録しようとしたところでエラーが発生!

調べてみたところ、どうやら、このバグに該当する模様でした。

トラッカーのチケットを見ると、バグは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になったようです。

良かった…。

1 件のコメント:

  1. plone.app.form-1.1.7でもエラーになり、まだ対応されていませんでした。

    反映させたのは、こちらです。

    https://dev.plone.org/plone/changeset/26001/plone.app.form/trunk/plone/app/form/widgets/uberselectionwidget.py

    返信削除