В CKAN, как сделать «группы» в схеме пакета требуется? - PullRequest
0 голосов
/ 02 октября 2018

В CKAN атомарные свойства схемы пакета определяются как списки валидаторов.Чтобы сделать свойство обязательным, я могу использовать валидатор not_empty.Например, чтобы сделать обязательным свойство author, я мог бы определить его в схеме следующим образом:

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

Однако свойство groups не является атомарным, и определение схемы является диктатом (схема для групп), а не список валидаторов.Итак, мой вопрос: как я могу определить схему пакета, для которой требуется присутствие хотя бы одной группы?

Я знаю, что можно просто сказать 'groups': [not_empty], но тогдаОпределение вложенной схемы для group потеряно.

(я также знаю, что мне пришлось бы настроить шаблон пакета для включения обязательных групп, но это другое дело)

1 Ответ

0 голосов
/ 08 октября 2018

После некоторых дальнейших исследований и экспериментов я могу ответить на свой вопрос здесь: ключом является реализация IDatasetForm.validate () , которая может использоваться для проверки пакетов способами, выходящими за рамки схемы.обычно используется проверка на основе:

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.Если мы хотим сделать эту работу для создания и обновления через пользовательский интерфейс, мы также должны настроить шаблон пакета, чтобы разрешить установку groups в основном шаблоне - в противном случае может быть ошибка в основном шаблоне, которую выиграл пользовательне могу исправить.

...