Необязательное поле в интерфейсе схемы - PullRequest
0 голосов
/ 01 октября 2018

У меня есть эта пользовательская схема, определенная в надстройке plone, которая будет использоваться для нескольких веб-сайтов.

class IUser(Interface):
    userid = schema.TextLine(
        title=_("User id"),
        required=True,
        constraint=validate_userid,
    )

    email = schema.TextLine(
        title=_(u"Email"),
        required=True,
        constraint=validate_email
    )

    optional_type = schema.Choice(
        title=_(u"User type"),
        vocabulary="user_types",
        required=True,
    )

Иногда поле optional_type иногда требуется, но не обязательно.user_types сохраняется в portal_vocabularies.Я хочу, чтобы поле использовалось только тогда, когда словарь существует, и я хочу, чтобы оно игнорировалось, когда определение отсутствует.

Я имею в виду, я хочу, чтобы это поле работало для веб-сайтов, где оно используется, но для пользователяСхема также для работы в другом случае.На данный момент я получаю эту ошибку: ComponentLookupError: (<InterfaceClass zope.schema.interfaces.IVocabularyFactory>, 'user_types').

Я знаю, что могу создать пустой неиспользуемый словарь, но у вас есть какое-нибудь лучшее решение здесь?

1 Ответ

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

Невозможно, но вы можете пропустить ошибку и создать видимость, что поле не существует.Полезно знать:

на самом деле user_types - это не название словаря, а название словарной фабрики ( источник )

Таким образом, вы можете решить эту проблему без определения словаря в portal_vocabularies.Просто определите фабрику как:

foo.py:

from zope.interface import provider
from zope.schema.interfaces import IVocabularyFactory
from zope.schema.vocabulary import SimpleTerm
from zope.schema.vocabulary import SimpleVocabulary


@provider(IVocabularyFactory)
def user_types_vocabulary(context):
    items = [
        ('test1', u'Test value 1'),
        ('test2', u'Test value 2')
    ]

    terms = [
        SimpleTerm(value=pair[0], token=pair[0], title=pair[1])
        for pair in items
    ]
    return SimpleVocabulary(terms)

как утилита:

configure.zcml:

  <utility name="user_types"
           component=".aaa.user_types_vocabulary" />

Тогда вы можете скрыть поле и просто игнорировать его везде, где это не нужно.

...