Персональные инструменты

Модуль startup

Автор: Ирина Бессарабова Последнее изменение: 2011-05-01 20:17

Модуль 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 выше!

Действия с Документом