Модуль startup
Модуль startup
Перед запуском обычно кода инициализации Zope продукта, нам нужно определить Message Factory для интернационализации продукта:
from zope.i18nmessageid import MessageFactory
exampleMessageFactory = MessageFactory('example.archetype')
Определенный объект MessageFactory будет импортироваться в большинстве модулей со специальным именем "_" и инструменты интернациализации будут извлекать строки вида _(u"message") для перевода.
Далее мы импортируем полезные модули из API Архетиов: process_types нужен для получения контент-типов продукта, ассоциированных конструктурах и Factory Type Infromation (FTI), listTypes будет использоваться для получения списка типов доступных в продукте.
Нам также нужно импортировать модуль utils из CMFCore, чтобы позже иметь возможность использовать его класс ContentInit.
from Products.Archetypes.atapi import process_types from Products.Archetypes.atapi import listTypes from Products.CMFCore import utils
Замечания:
-
Factory Type Information (FTI): Часть конфигурации портала, структура данных, которая хранит информацию необходимую для описания контент-типа внутри портала. С другой сторона, FTI — это объект внутри компонента portal_types, который объясняет CMF и Plone как создавать контент этого типа и как его отображать.
-
Как работает listTypes?: обратите внимание на вызовы registerType() внутри модулей контент-типов. Заметьте, что мы также импортируем эти модули в content/__init__.py. Вызовы registerType говорят AT про тип, поэтому listTypes может найти их.
Один из важных шагов — импорт всего, что определено в подпакете content, то есть все его модули:
from content import message
Далее мы импортируем модуль конфигурации для того, чтобы иметь доступ к его переменным таким, как право доступ Add:
import config
Теперь время для реальных действий. Вы определяете функцию, которая нужна Zope и CMF для инициализации нашего контент-типа:
def initialize(context):
Первая часть функции генерирует контент-типы, конструктуры и информацию о типах (FTI) необходимую для того, чтобы ваши типы работали с CMF:
content_types, constructors, ftis = process_types(
listTypes(config.PROJECTNAME),
config.PROJECTNAME)
Вторая часть инициализрует объект класс ContentInit и регистрирует ваш тип в CMF:
utils.ContentInit(
"%s Content" % config.PROJECTNAME,
content_types = content_types,
permission = config.ADD_CONTENT_PERMISSIONS['InstantMessage'],
extra_constructors = constructors,
fti = ftis,
).initialize(context)
Обработка нескольких типов контента
Это пример кода для инициализации классов контент-типов с правом "Add" и конструктором, который работает, если у вас определено несколько типов контента. Он полезен, если вы планируете добавлять в продукт новые типы в будущем.
def initialize(context):
content_types, constructors, ftis = process_types(
listTypes(config.PROJECTNAME),
config.PROJECTNAME)
# We want to register each type with its own permission,
# this will afford us greater control during system
# configuration/deployment (credit : Ben Saller)
allTypes = zip(content_types, constructors)
for atype, constructor in allTypes:
kind = "%s: %s" % (config.PROJECTNAME, atype.portal_type)
utils.ContentInit(kind,
content_types = (atype,),
permission = config.ADD_CONTENT_PERMISSIONS[atype.portal_type],
extra_constructors = (constructor,),
fti = ftis,
).initialize(context)
Замечания:
-
Мы используем конструкцию "ADD_CONTENT_PERMISSIONS[atype.portal_type]", так как ADD_CONTENT_PERMISSIONS ссылается на словарь, в котором ключи - названия контент-типов.
-
Функция zip() - встроенная функция Python, которая создает список пар из элементов двух списков. В нашем случае, "allTypes" будет содержать список кортежей, где первый элемент кортежа - название типа, второй - его конструктор.
-
Если у вас несколько контент-типов, вы должны импортировать каждый модуль с классом контент-типа, как это сделано в примере с message выше!

Предыдущий: Модуль Configuration
