0

Dexterity 型をプログラムで作成する場合、ファクトリに渡されるデータをフォームからのものであるかのように検証することは可能ですか?

多数の制約、不変条件、およびバリデーターを備えた Dexterity コンテンツ タイプがあります。

from zope import schema
from zope import interface
from z3c.form import validator
from plone import dexterity
from plone.directives import form
from five import grok

def is_not_foo(value):
    return value is not 'foo'

class IMyType(form.Schema):
    my_value = schema.TextLine(
        constraint = is_not_foo
    )
    min = schema.Int(default=0)
    max = schema.Int(default=99)

    @interface.invariant
    def max_more_than_min(data):
        if data.min is not None and data.max is not None:
            if data.min >= data.max:
                raise interface.Invalid( u'Min is more than Max' )

@form.error_message(form=IMyType['my_value'], error=schema.interfaces.ConstraintNotSatisfied)
def error_my_value_is_foo(value):
    return u'my_value must not be "foo"'

class ValidateMyValue(validator.SimpleFieldValidator):
    def validate(self, value):
        if value is not None:
            # value passes some test

validator.WidgetValidatorDiscriminators(
    ValidateMyValue,
    form = IMyType['my_value'],
)
grok.global_adapter(ValidateMyValue)

MyType のすべてのインスタンスが適切な既定値を持つようにするために、FieldProperty を使用してマップされた属性を持つカスタム クラスを作成し、型の FTI 宣言に割り当てました。

class MyType(dexterity.content.Item):
    interface.implements(IMyType)

    my_value = schema.fieldproperty.FieldProperty(IMyType['my_value'])
    min = schema.fieldproperty.FieldProperty(IMyType['min'])
    max = schema.fieldproperty.FieldProperty(IMyType['max'])

ただし、 を使用すると、課せられた制約などに準拠しないplone.dexterity.utils.createContentInContainerオブジェクトをインスタンス化することができます。理想的には、作成を行う前に、この検証を自分で実行できるようにしたいと考えています。

ここで私が見逃している簡単なアプローチはありますか? collective.transmogrifier を簡単に見てみましたが、入力の検証については言及されていません。

ありがとう。

4

1 に答える 1

1

あなたはzope.schema.getValidationErrors()関数を使うことができます:

 newInstance = createContentInContainer(folder, id, **schemavalues)
 errors = getValidationErrors(IMyType, newInstance)
 if errors:
     # Schema not validated; errors is a sequence of (field, exception) tuples
     # field is None if the error is for an invariant.
于 2012-08-23T06:25:33.107 に答える