1letter
(Jan)
November 20, 2020, 9:36am
1
# my example schema for a contentype
class IEntry(model.Schema):
providername = schema.TextLine(
title="Name",
required=True)
# in a test
entry = api.content.create(
type="Entry",
title="Entry",
description="This is a description",
container=portal
)
> pp entry.providername
> None
I thought this was going to fail, because the property "providername" is not set, but the object is created. Is this the default behavior of api.content.create?
jensens
(Jens W. Klein)
November 20, 2020, 9:48am
2
plone.api
works on a low level using invokeFactory
and so does not validate the fields. I think this is by intend.
If you need validation, have a look at the plone.restapi
deserializers. There validation happens.
Overall schema handling:
def get_schema_data(self, data, validate_all):
schema_data = {}
errors = []
for schema in iterSchemata(self.context):
write_permissions = mergedTaggedValueDict(schema, WRITE_PERMISSIONS_KEY)
for name, field in getFields(schema).items():
field_data = schema_data.setdefault(schema, {})
if field.readonly:
continue
if name in data:
dm = queryMultiAdapter((self.context, field), IDataManager)
if not dm.canWrite():
continue
if not self.check_permission(write_permissions.get(name)):
This file has been truncated. show original
and actual validation per field:
class DefaultFieldDeserializer(object):
def __init__(self, field, context, request):
self.field = field
if IField.providedBy(self.field):
self.field = self.field.bind(context)
self.context = context
self.request = request
def __call__(self, value):
if not isinstance(value, six.text_type):
self.field.validate(value)
return value
value = IFromUnicode(self.field).fromUnicode(value)
# IFromUnicode.fromUnicode() will validate, no need to do it twice
return value
@implementer(IFieldDeserializer)
@adapter(ITextLine, IDexterityContent, IBrowserRequest)
class TextLineFieldDeserializer(DefaultFieldDeserializer):