在CKAN中,如何在所需的包模式中创建“组”?

时间:2018-10-02 15:21:47

标签: validation schema ckan

在CKAN中,程序包模式的原子属性定义为验证程序列表。为了使属性成为必需,我可以使用not_empty验证程序。例如,要使author属性成为必需,我可以在架构中按如下所示对其进行定义:

{
    ...
    'author': [not_empty, unicode_safe] ,
    ...
}

但是,groups属性不是原子的,架构定义是dict(组的架构),而不是验证程序列表。因此,我的问题是:我如何定义至少需要存在一个组的程序包架构?

我知道可以简单地说'groups': [not_empty],但是group的嵌套模式定义丢失了。

(我也知道我必须调整软件包模板以启用强制组,但这是另一回事)

1 个答案:

答案 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-否则主模板上可能会出现错误,用户将无法修复。