在CKAN中,程序包模式的原子属性定义为验证程序列表。为了使属性成为必需,我可以使用not_empty
验证程序。例如,要使author
属性成为必需,我可以在架构中按如下所示对其进行定义:
{
...
'author': [not_empty, unicode_safe] ,
...
}
但是,groups
属性不是原子的,架构定义是dict(组的架构),而不是验证程序列表。因此,我的问题是:我如何定义至少需要存在一个组的程序包架构?
我知道可以简单地说'groups': [not_empty]
,但是group
的嵌套模式定义丢失了。
(我也知道我必须调整软件包模板以启用强制组,但这是另一回事)
答案 0 :(得分:1)
经过进一步的研究和实验,我可以在这里回答我自己的问题:关键是实现IDatasetForm.validate(),该方法可以用来验证软件包,其方式超出了通常采用的基于模式的验证: / p>
from ckan.common import _
import ckan.plugins.toolkit as toolkit
def validate(self, context, data_dict, schema, action):
# first, run the schema-based validation to get that out of the way:
(data_dict, errors) = toolkit.navl_validate(data_dict, schema, context)
# we're only interested if this is a create or update action:
if action in [ 'package_create', 'package_update' ]:
# now comes the actual validation:
if 'groups' not in data_dict:
errors['groups'] = errors.get('groups', []) + [ _('Required field \'groups\' not set.') ]
else if len(data_dict['groups'] < 1):
errors['groups'] = errors.get('groups', []) + [ _('\'groups\' property has no value.') ]
# we should probably also check if the group exists, etc.
return (data_dict, errors)
这对于通过API创建/更新程序包应该很好。如果我们要通过UI进行创建和更新,则还必须调整包模板以允许在主模板上设置groups
-否则主模板上可能会出现错误,用户将无法修复。