python - 如何在 CKAN 2.2 中定义自定义验证器

标签 python validation ckan

我需要在 CKAN 2.2 扩展中为日期定义一个新的验证器。 IValidators 接口(interface)无法正常工作。你能帮我一下吗?

最佳答案

目前有three different function prototypes可用于自定义验证器。下面是一个自定义日期字符串验证器的示例,该验证器使用带有两个参数的原型(prototype)(文档链接中的选项 5)。此类型必须返回字段的最终值(相反,它能够在存储之前更改值):

import ckan.plugins as plugins
import ckan.plugins.toolkit as tk  
from ckan.plugins.toolkit import Invalid

def date_str_validator(value, context):
    valid_date = tk.get_validator('isodate')(value, context)
    if not valid_date or not isinstance(valid_date, datetime.datetime):
        raise Invalid("Invalid date")
    return value

class MyPlugin(plugins.SingletonPlugin, tk.DefaultDatasetForm):

    plugins.implements(plugins.IDatasetForm, inherit=False)

    def _modify_package_schema(self, schema):
        schema.update({
            # Custom extras
            'origination_date':[tk.get_validator('ignore_missing'),
                                date_str_validator,
                                tk.get_converter('convert_to_extras')]
        })
        return schema

    def create_package_schema(self):
        schema = super(MyPlugin, self).create_package_schema()
        schema = self._modify_package_schema(schema)

        return schema

    def update_package_schema(self):
        schema = super(MyPlugin, self).update_package_schema()
        schema = self._modify_package_schema(schema)
        return schema

    def show_package_schema(self):
        schema = super(MyPlugin, self).show_package_schema()

        schema.update({
            # Custom extras
            'origination_date':[tk.get_converter('convert_from_extras'),
                                tk.get_validator('ignore_missing'),
                                date_str_validator]
        })

        return schema

请注意,验证器和转换器是按顺序调用的,因此此处显示的顺序在 _modify_package_schemashow_package_schema 中都很重要。

关于python - 如何在 CKAN 2.2 中定义自定义验证器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27967020/

相关文章:

python - 在类中重复函数

Python 异常 - 捕获除预期之外的所有异常

Python:查找给定用户名/组名的 uid/gid(对于 os.chown)

javascript - 一个字段上的语义 ui 表单验证规则是否可以以不同的字段为条件?

javascript - 如何禁用多部分表单上的下一个按钮?

ckan - 使用 API 删除和清除 CKAN 中的包?

python - 导出 pandas csv 文件时对行进行排序

ruby - 如何为 Dry::Validation.Params 方案设置默认值?

python - 覆盖 CKAN 中的 url 验证器