Validation 在CKAN,我如何制作';组';在包架构中是否需要?

Validation 在CKAN,我如何制作';组';在包架构中是否需要?,validation,schema,ckan,Validation,Schema,Ckan,在CKAN中,包模式的原子属性被定义为验证器列表。要使属性成为必需的,我可以使用not\u empty验证器。例如,要使author属性成为必需属性,我可以在模式中定义它,如下所示: { ... “作者”:[非空,unicode安全], ... } 但是,groups属性不是原子的,模式定义是dict(组的模式),而不是验证器列表。因此,我的问题是:如何定义至少需要一个组存在的包架构? 我知道可以简单地说'groups':[not_empty],但是组的嵌套模式定义丢失了 (我也知道我必须调整

在CKAN中,包模式的原子属性被定义为验证器列表。要使属性成为必需的,我可以使用
not\u empty
验证器。例如,要使
author
属性成为必需属性,我可以在模式中定义它,如下所示:

{
...
“作者”:[非空,unicode安全],
...
}
但是,
groups
属性不是原子的,模式定义是dict(组的模式),而不是验证器列表。因此,我的问题是:如何定义至少需要一个组存在的包架构?

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


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

经过进一步的研究和实验,我可以在这里回答我自己的问题:关键是实现,它可以用于以超出通常采用的基于模式的验证的方式验证包:

从ckan.common导入_
将ckan.plugins.toolkit作为toolkit导入
def验证(自身、上下文、数据记录、模式、操作):
#首先,运行基于模式的验证以避免这种情况:
(数据记录,错误)=toolkit.navl\u验证(数据记录,模式,上下文)
#我们只对创建或更新操作感兴趣:
如果在['package_create'、'package_update']中执行操作:
#现在是实际验证:
如果“组”不在数据目录中:
errors['groups']=errors.get('groups',[])+[[\uz('Required field'groups\'未设置])]
否则,如果len(数据目录['groups']<1):
errors['groups']=errors.get('groups',[])+[\('\'groups\'属性没有值。')]
#我们可能还应该检查该组是否存在,等等。
返回(数据记录、错误)

这对于通过API创建/更新包应该很有效。如果我们想通过UI进行创建和更新,我们还必须调整包模板,以允许在主模板上设置
,否则主模板上可能会出现用户无法修复的错误。

要为其他模板添加更多参考,下面是一些关于模式和验证的文档。以及对一些验证器函数的引用,其中显示了一些可用的功能。scheming扩展是另一个选项,允许您根据需要标记字段。