= Что нового в Bluebream 1.0 = <> == Вопросы миграции == === zope.app.keyreference -> zope.keyreference === Этот пакет был переименован в zope.keyreference и туда переехала вся функциональная часть. Новый пакет содержит небольшой обходной путь (workaround) для поддержки загружаемости старых персистентных ''keyrerefences'' без установки пакета ''zope.app.keyreference'', так что последний теперь не нужен вообще. И все-таки мы настоятельно рекомендуем пересмотреть свой программный код на наличие импортов из ''zope.app.keyreference'' и поменять их на импорты из zope.keyreference. === zope.app.intid -> zope.intid === Вся функциональная часть этих пакетов, не связання с интерфейсом пользователя, была перенесена в ''zope.intid'' с сохранением обратной совместимости импортов. Пересмотрите все ваши импорты из ''zope.app.intid'', чтобы узнать, нельзя ли их заменить на прямые импорты из ''zope.intid''. === zope.app.catalog -> zope.catalog === Вся функциональная часть этих пакетов, не связання с интерфейсом пользователя, была перенесена в ''zope.catalog''. Пересмотрите все ваши импорты из ''zope.app.catalog'', чтобы узнать, нельзя ли их заменить на прямые импорты из ''zope.catalog''. === zope.app.container -> zope.container === Вся функциональная часть этих пакетов, не связання с интерфейсом пользователя, была перенесена в ''zope.container''. Пересмотрите все ваши импорты из ''zope.app.container'', чтобы узнать, нельзя ли их заменить на прямые импорты из ''zope.container''. Вдобавок, исключения, которые импользуются в ''zope.container'' были изменены, так что если ваш код их отлавливает, вам нужно их пересмотреть: * !DuplicationError в методе ''setitem'' изменено на !KeyError. * !UserError в !NameChooser изменено на !ValueError. === zope.app.component -> zope.security, zope.site === Реализация ZCML директивы '''''' перенесена из этого пакета в ''zope.security''. Пакеты, которые получали эту директиву из ''zope.app.component'' должны объявить прямую зависимость от ''zope.security'', тем самым получив возможность полностью избавится зависимости от ''zope.app.component''. Вся функциональная часть этих пакетов, не связання с интерфейсом пользователя, перенесена в пакет ''zope.site'' с сохранением обратной совместимости импортов. Пересмотрите все ваши импорты из ''zope.app.component'', чтобы узнать, нельзя ли заменить их на прямые импорты из ''zope.site''. === zope.app.folder -> zope.site, zope.container === Реализация класса ''zope.app.folder.Folder'' перенесена в ''zope.site.folder'' с сохранением обратной совместимости по импортам. Пересмотрите все ваши импорты из ''zope.app.folder'', чтобы узнать, нельзя ли заменить их на прямые импорты из ''zope.site''. Вдобавок, '''Folder''' становится реализацией интерфейса '''IContainer''', который также является частью примеси функционала управления сайтом. В некоторых случаях, когда поддержка функционала управления сайтом не нужна, вы можете обойтись без класса '''Folder''', используя вместо него "чистую" реализацию этого интерфейса - '''Container''' из пакета ''zope.container''. Базовый класс с реализацией контейнерного поведения класса '''Folder''' перенесен в ''zope.container'' (а ''zope.site'' ипользует его для реализации '''Folder'''). Мы не считаем это изменение таковым, для которого необходимо сохранять обратную совместимость. === zc.copy -> zope.copy, zope.copypastemove, zope.location === Подключаемый механизм копирования, изначально разрабонанный как ''zc.copy'' был объединен с ''zope.location'', ''zope.copypastemove'' и новым пакетом ''zope.copy''. Пакет ''zope.copy'' теперь обеспечивает подключаемый механизм копирования объектов из ''zc.copy'' и не зависит ни от чего, кроме ''zope.interface''. Пакет ''zope.copypastemove'' использует функцию копирования из ''zope.copy'' в своем классе '''!ObjectCopier'''. Пакет ''zope.location'' теперь предоставляет адаптер '''ICopyHook''', который реализует механизм условного копирования, основанного на местоположениях (locations) объекта, который раньше обеспечивался с помощью ''zope.location.pickling.!CopyPersistent''. Заметьте, если вы не используете ZCML конфигурацию ''zope.location'', вам придется зарегистрировать ''zope.location.pickling.!LocationCopyHook'' вручную. Хотя ''zope.location.pickling.locationCopy'' и ''zope.location.pickling.!CopyPersistent'' и устарели в связи с появлением ''zope.copy'', была добавлена обратная совместимость импортов. Обратитесь к документации по пакету ''zope.copy'' для получения информации об использовании нового механизма. Новая версия пакета ''zc.copy'' теперь содержит только импорты для поддержки обратной совместимости и является устаревшей (deprecated). Для новых разработок используйте ''zope.copy''. === Рефакторинг zope.app.security === Пакет ''zope.app.security'' был полностью отрефакторен и разбит на несколько мелких частей с целью уменьшения зависимостей и прояснения целей использования. Реализация ZCML директивы '''''' перенесена в пакет ''zope.security''. Пакеты, в которых присутствовали зависимости от ''zope.app.security'' c целью доступа к использованию этой директивы, должны объявить прямую зависимость от ''zope.security'', что также даст возможность полностью избавится зависимости от ''zope.app.security''. Модуль ''protectclass'' этого пакета перенесен в ''zope.security'' с сохранением импотов для обратной совместимости. Пересмотрите ваши импорты из ''zope.app.security'', чтобы узнать, нельзя ли заменить их на прямые импорты из ''zope.security''. Все интерфейсы ('''IAuthentication''', '''IUnauthenticatedPrincipal''', '''ILoginPassword''' и т.д.) перенесены в новый пакет ''zope.authentication'' наряду с несколькими вспомагательными вещами, такими как '''!PrincipalSource''' и функцией '''checkPrincipal'''. Новый пакет имеет намного меньше зависимостей и определяет вбстрактные соглашения для реализации аутентификации внутри фреймворка Zope. Хотя импорты, обеспечивающие обратную совместимость, оставлены, настоятельно рекоммендуется обновить ваши импорты с целью использования пакета ''zope.authentication''. Глобальный реестр пользователей (principal) и их ZCML директивы перенесены в новый пакет ''zope.principalregistry'' с сохранением обратной совместимости импортов. Если ваше приложение использует глобальных пользователей (principals), пересмотрите свой код и ZCML конфигурацию, на предмет обновления путей. Функциональность локальной системы прав перенесена в пакет ''zope.app.localpermission''. Эта функциональность является частью шаблона разработки '''Through-The-Web''', которая больше не используется и не поддерживается в Zope Toolkit и Application, так что может считаться устаревшей. Как бы там ни было, она может служить прекрасным примером TTW компонента. Словари прав и стандартные методы защиты для объектов '''Message''' и аттрибутов ''__name__'', ''__parent__'', наряду с основными общими правами, такими как '''zope.View''' и '''zope.!ManageContent''' слиты в пакет ''zope.security''. Адаптеры из пакета ''zope.publisher'': интерфейсов '''IHTTPCredentials''' и '''IFTPCredentials''' к интерфейсу '''ILoginPassword''' перемещены в ''zope.publisher'', вместе с тем создавая зависимость ''zope.publisher'' от ''zope.authentication''. Ихначальный пакет ''zope.app.security'' содержит только несколько устаревших или специфичных для приложения прав, методов защиты модулей python, которые в общем случае нужны только для внедрение устаревшего шаблона разработки Through-The-Web, а также для поддержки ZMI видов обозревателя (''login.html'', вид для !PrincipalSource из ''zope.app.form'' и т.д.). Также сохранены импорты, обспечивающие обратную совместимость. Соответственно, если вы не используете TTW и/или стандартные браузерные виды ZMI, пересмотрите и обновите импорты для подхвата функциональности из новых мест и лишитесь зависимостей от ''zope.app.security'' с целью уменьшения общего их количества. Другие пакеты, которые использовали ''zope.app.security'', как ''zope.securitypolicy'' или уже адаптированы к вышеописаным изменениям или будут в скором времени. === Рефакторинг zope.app.publisher === Пакет ''zope.app.publisher'' был также отрефакторен и разбит на более мелкие части с целью уменьшения зависимостей и прояснения его целей. Механизм браузерных ресурсов (в большинстве случаев используемый для обслуживания статических файлов и папок) был вынесен в новый пакет ''zope.browserresource''. Он также был сделан более гибким, так что теперь при необходимости можно создавать и регистрировать специфические классы ресурсов для особой обработки отдельных файловых расширений. В качестве примера можно привести пакет ''zope.ptresource'', куда был перемещен клас '''!PageTemplateResource'''. Другой пример - пакет ''z3c.zrtresource'', который был адаптирован для автоматического использования класса-обработчика ZRT-ресурсов при наличии файлов с расширением ''.zrt''. Механизм браузерных меню был перемещен в пакет ''zope.browsermenu'' без изменений. ZCML директивы для простого создания браузерных видов (директива '''browser:page''' и т.д.) перемещені в новый маленький пакет ''zope.browserpage''. Также эти директивы теперь не зависят от механизма меню и параметры “menu” и “title”, в случае отсутствия пакета ''zope.browsermenu'', просто проигнорируются. Адаптер '''IModifiableBrowserLanguages''' был перенесен в ''zope.publisher'' вместе с несколькими ZCML директивами, связанными с безопасностью классов пакета ''zope.publisher'', которые раньше размещались в ''zope.app.publisher''. ZCML регистрации адаптера к '''!IXMLRPCPublisher''' для контейнеров перенесены в ''zope.container'', в связи с тем, что на самом деле реализация этих адаптеров уже находилась в ''zope.container'' и была зарегистрирована там в качестве адаптеров к !IBrowserPublisher. Наряду с этим, оба адаптера и их ZCML регистрации, возможно, будут перемещены еще куда-нибудь, когда мы отрефакторим ''zope.container''. Следующие части пакета ''zope.app.publisher'' остались нетронутыми: * словарь браузерных скинов * конвертер поля даты для механизма конвертации данных форм, реализванного в пакете ''zope.publisher''. * браузерный вид !ManagementViewSelector (часть связання с ZMI). * директива '''xmlrpc:view''' для публикации методов '''XML-RPC'''. Директива '''xmlrpc:view''', в основном, является полезной, так что в будущем может быть перемещена в отдельный пакет. На данный момент нет ясного представления о том, куда и как перемещать функционал, связанный с XML-RPC FTP. === Менеджеры паролей вынесены из ''zope.app.authentication'' === Интерфейс '''IPasswordManager''' и его реализации были вынесены из пакета ''zope.app.authentication'' в новый пакет ''zope.password'' для использования с другими системами аутентификации, такими как ''z3c.authenticator'', ''zope.principalregistry'' и любыми другими. Новый пакет зависит только от ''zope.interface'', так что может быть полезным даже в окружениях не связанных с Zope, например, в Pylons. Словарь имен менеджеров паролей также был перенесен в пакет ''zope.password'', но, по факту, является полезным только при использовании вместе с ''zope.schema'' и ''zope.component'', так что вам придется их установить. Это требование размещено в дополнительной спецификации требований, раздел “vocabulary”. === ZODB 3.9 FileStorage native blob support === Компонент '''!FileStorage''' ZODB 3.9, который используется в Zope Toolkit 1.0, теперь имеет родную поддержку blob-полей, так что больше не придется использовать !BlobStorage прокси. Таким образом, вы можете указать директорию для хранения blob-полей прямо в конфигурации !FileStorage. Если вы используете !ZConfig, то это будет выглядеть следующим образом: {{{#!highlight xml path var/Data.fs blob-dir var/blobs }}} вместо: {{{#!highlight xml blob-dir var/blobs path var/Data.fs }}} Если вы создаете хранилище данных из python, это будет выглядеть следующим образом: {{{#!highlight python storage = FileStorage('var/Data.fs', blob_dir='var/blobs') }}} вместо: {{{#!highlight python storage = BlobStorage('var/blobs', FileStorage('var/Data.fs')) }}} === Сравнительная таблица версий пакетов === || '''Название пакета''' || '''Zope 3.4.0''' || '''!BlueBream 1.0.0''' || ||bluebream || || 1.0a2 || ||clientform || 0.2.9 || 0.2.10 || ||distribute || || 0.6.10 || ||docutils || 0.4 || 0.6 || ||jinja2 || || 2.2.1 || ||lxml || 1.3.6 || 2.2.4 || ||martian || || 0.12 || ||mechanize || 0.1.7b || 0.1.11 || ||py || || 1.0.0 || ||pygments || || 1.2.2 || ||python-gettext || || 1.0 || ||pytz || 2007k || 2010b || ||restrictedpython || 3.4.2 || 3.5.1 || ||roman || || 1.4.0 || ||setuptools || 0.6c9 || 0.6c11 || ||sphinx || || 0.6.4 || ||transaction || || 1.0.0 || ||z3c.recipe.sphinxdoc || || 0.0.8 || ||z3c.testsetup || || 0.6.1 || ||zc.buildout || 1.1.1 || 1.4.3 || ||zc.lockfile || || 1.0.0 || ||zc.recipe.egg || 1.0.0 || 1.2.2 || ||zc.recipe.testrunner || 1.0.0 || 1.2.0 || ||zc.resourcelibrary || 1.0.1 || 1.3.1 || ||zc.sourcefactory || || 0.6.0 || ||zconfig || 2.5.1 || 2.7.1 || ||zdaemon || 2.0.2 || 2.0.4 || ||zodb3 || 3.8.1 || 3.9.4 || ||zodbcode || 3.4.0 || 3.4.0 || ||zope.annotation || 3.4.1 || 3.5.0 || ||zope.app.apidoc || 3.4.3 || 3.7.2 || ||zope.app.applicationcontrol || 3.4.3 || 3.5.5 || ||zope.app.appsetup || 3.4.1 || 3.13.0 || ||zope.app.authentication || 3.4.4 || 3.7.1 || ||zope.app.basicskin || 3.4.0 || 3.5.0 || ||zope.app.broken || 3.4.0 || 3.5.0 || ||zope.app.cache || 3.4.1 || 3.7.0 || ||zope.app.catalog || 3.5.1 || 3.8.1 || ||zope.app.component || 3.4.1 || 3.8.4 || ||zope.app.container || 3.5.6 || 3.8.2 || ||zope.app.content || 3.4.0 || 3.4.0 || ||zope.app.dav || 3.4.1 || 3.5.3 || ||zope.app.debug || 3.4.1 || 3.4.1 || ||zope.app.dependable || 3.4.0 || 3.5.1 || ||zope.app.error || 3.5.1 || 3.5.2 || ||zope.app.exception || 3.4.1 || 3.6.1 || ||zope.app.file || 3.4.4 || 3.5.1 || ||zope.app.folder || 3.4.0 || 3.5.1 || ||zope.app.form || 3.4.1 || 4.0.2 || ||zope.app.ftp || 3.4.0 || 3.5.0 || ||zope.app.generations || 3.4.1 || 3.5.1 || ||zope.app.http || 3.4.1 || 3.6.1 || ||zope.app.i18n || 3.4.4 || 3.6.2 || ||zope.app.interface || 3.4.0 || 3.5.0 || ||zope.app.interpreter || 3.4.0 || 3.4.0 || ||zope.app.intid || 3.4.1 || 3.7.1 || ||zope.app.keyreference || 3.4.1 || 3.6.1 || ||zope.app.locales || 3.4.5 || 3.6.0 || ||zope.app.localpermission || || 3.7.2 || ||zope.app.locking || 3.4.0 || 3.5.0 || ||zope.app.onlinehelp || 3.4.1 || 3.5.2 || ||zope.app.pagetemplate || 3.4.1 || 3.10.1 || ||zope.app.preference || 3.4.1 || 3.6.0 || ||zope.app.preview || 3.4.0 || 3.4.0 || ||zope.app.principalannotation|| 3.4.0 || 3.7.0 || ||zope.app.publication || 3.4.3 || 3.10.2 || ||zope.app.publisher || 3.4.1 || 3.10.1 || ||zope.app.renderer || 3.4.0 || 3.5.1 || ||zope.app.rotterdam || 3.4.1 || 3.5.1 || ||zope.app.schema || 3.4.0 || 3.5.0 || ||zope.app.security || 3.5.2 || 3.7.5 || ||zope.app.securitypolicy || 3.4.6 || 3.5.2 || ||zope.app.server || 3.4.2 || 3.5.0 || ||zope.app.session || 3.5.1 || 3.6.1 || ||zope.app.skins || 3.4.0 || 3.4.0 || ||zope.app.testing || 3.4.3 || 3.7.4 || ||zope.app.tree || 3.4.0 || 3.6.0 || ||zope.app.twisted || 3.4.1 || 3.5.0 || ||zope.app.undo || 3.4.0 || 3.5.0 || ||zope.app.wsgi || 3.4.1 || 3.6.1 || ||zope.app.xmlrpcintrospection|| 3.4.0 || 3.5.1 || ||zope.app.zcmlfiles || 3.4.3 || 3.7.0 || ||zope.app.zopeappgenerations || 3.4.0 || 3.5.0 || ||zope.app.zptpage || 3.4.1 || 3.5.1 || ||zope.applicationcontrol || || 3.5.5 || ||zope.authentication || || 3.7.0 || ||zope.broken || || 3.6.0 || ||zope.browser || || 1.2 || ||zope.browsermenu || || 3.9.0 || ||zope.browserpage || || 3.11.0 || ||zope.browserresource || || 3.10.2 || ||zope.cachedescriptors || 3.4.1 || 3.5.0 || ||zope.catalog || || 3.8.1 || ||zope.component || 3.4.0 || 3.9.3 || ||zope.componentvocabulary || || 1.0 || ||zope.configuration || 3.4.0 || 3.7.1 || ||zope.container || || 3.11.0 || ||zope.contentprovider || 3.4.0 || 3.6.1 || ||zope.contenttype || 3.4.0 || 3.5.1 || ||zope.copy || || 3.5.0 || ||zope.copypastemove || 3.4.0 || 3.6.0 || ||zope.datetime || 3.4.0 || 3.4.0 || ||zope.deferredimport || 3.4.0 || 3.5.0 || ||zope.deprecation || 3.4.0 || 3.4.0 || ||zope.documenttemplate || 3.4.0 || 3.4.2 || ||zope.dottedname || 3.4.2 || 3.4.6 || ||zope.dublincore || 3.4.0 || 3.6.0 || ||zope.error || 3.5.1 || 3.7.0 || ||zope.event || 3.4.0 || 3.4.1 || ||zope.exceptions || 3.4.0 || 3.5.2 || ||zope.file || 0.3.0 || 0.5.0 || ||zope.filerepresentation || 3.4.0 || 3.6.0 || ||zope.formlib || 3.4.0 || 4.0.2 || ||zope.hookable || 3.4.0 || 3.4.1 || ||zope.html || 1.0.1 || 2.0.0 || ||zope.i18n || 3.4.0 || 3.7.2 || ||zope.i18nmessageid || 3.4.3 || 3.5.1 || ||zope.index || 3.4.1 || 3.6.0 || ||zope.interface || 3.4.1 || 3.5.3 || ||zope.intid || || 3.7.2 || ||zope.keyreference || || 3.6.2 || ||zope.kgs || || 1.2.0 || ||zope.lifecycleevent || 3.4.0 || 3.6.0 || ||zope.location || 3.4.0 || 3.9.0 || ||zope.login || || 1.0.0 || ||zope.mimetype || 0.3.0 || 1.2.0 || ||zope.minmax || 1.1.0 || 1.1.2 || ||zope.modulealias || 3.4.0 || 3.4.0 || ||zope.pagetemplate || 3.4.0 || 3.5.0 || ||zope.password || || 3.5.1 || ||zope.pluggableauth || || 1.0.1 || ||zope.principalannotation || || 3.6.0 || ||zope.principalregistry || || 3.7.0 || ||zope.processlifetime || || 1.0 || ||zope.proxy || 3.4.2 || 3.5.0 || ||zope.ptresource || || 3.9.0 || ||zope.publisher || 3.4.6 || 3.12.2 || ||zope.ramcache || || 1.0 || ||zope.rdb || 3.4.0 || 3.5.0 || ||zope.schema || 3.4.0 || 3.6.1 || ||zope.security || 3.4.1 || 3.7.2 || ||zope.securitypolicy || 3.4.1 || 3.6.1 || ||zope.sendmail || 3.4.0 || 3.7.1 || ||zope.sequencesort || 3.4.0 || 3.4.0 || ||zope.server || 3.4.3 || 3.6.1 || ||zope.session || 3.4.1 || 3.9.2 || ||zope.site || || 3.9.0 || ||zope.size || 3.4.0 || 3.4.1 || ||zope.structuredtext || 3.4.0 || 3.4.0 || ||zope.tal || 3.4.1 || 3.5.2 || ||zope.tales || 3.4.0 || 3.5.0 || ||zope.testbrowser || 3.4.2 || 3.7.0 || ||zope.testing || 3.5.6 || 3.8.7 || ||zope.thread || 3.4 || 3.4 || ||zope.traversing || 3.4.1 || 3.12.0 || ||zope.viewlet || 3.4.2 || 3.7.0 || ||zope.xmlpickle || 3.4.0 || 3.4.0 || == Возможные ошибки и пути их исправления == === В работе buildout, возможны ошибки импорта модулей === Если вы получили ошибку, как показано ниже: {{{ ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global authentication') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global broken') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global error') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global i18n') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global session') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global schema') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global zopeappgenerations') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global keyreference') ConfigurationError: ('Invalid value for', 'package', 'ImportError: Module zope.app has no global principalannotation') }}} Добавьте имя яйца (egg) (например, ''zope.app.principalannotation'') в ''install_requires'' внутри скрипта ''setup.py'', как показано ниже. После добавления, запустите команду ''./bin/buildout'' еще раз. {{{#!highlight python install_requires=['setuptools', ... 'zope.app.authentication', 'zope.app.broken', 'zope.app.error', 'zope.app.i18n', 'zope.app.session', 'zope.app.schema', 'zope.app.zopeappgenerations', 'zope.app.keyreference', 'zope.app.principalannotation', ... ], }}} Другое решение - включить имя яйца (egg) (например, ''zope.app.principalannotation'') в ту часть Buildout, где находится список других яиц, используя рецепт ''zc.recipe.egg'' как показано ниже: {{{ [app] recipe = zc.recipe.egg eggs = samplproject ... zope.app.authentication zope.app.broken zope.app.error zope.app.i18n zope.app.session zope.app.schema zope.app.zopeappgenerations zope.app.keyreference zope.app.principalannotation interpreter = breampy }}} === Import error: zope.app.folder.interfaces.IFolder === Если вы получили следующую или похожую ошибку: {{{ ZopeXMLConfigurationError: File "/home/baiju/myapp/src/myapp/browser.zcml", line 21.2-27.8 ConfigurationError: ('Invalid value for', 'for', "ImportError: Couldn't import zope.app.folder.interfaces, No module named folder.interfaces") }}} Откройте файл ''browser.zcml'' и посмотрите на строчку с номером 21, и поменяйте внутри ZCML декларации '''zope.app.folder.interfaces.IFolder''' на '''zope.site.interfaces.IFolder'''. Если вы получили следующую или похожую ошибку: {{{ raise ValueError("Undefined permission id", permission_id) zope.configuration.config.ConfigurationExecutionError: : ('Undefined permission id', 'zope.ManageApplication') }}} Вам нужно включить пакет ''zope.applicationcontrol'' в конфигурационный ZCML файл (''site.zcml''), так как оттуда доступно описание права дотупа (permission). === Ошибка при доступе к виду ''login.html'' === {{{ .../eggs/zope.principalregistry-3.7.0-py2.5.egg/zope/principalregistry/principalregistry.py", line 82, in unauthorized a = ILoginPassword(request) TypeError: ('Could not adapt', , ) }}} Необходимо включить пакет ''zope.login'' в конфигурационный файл ZCML (site.zcml) поскольку в этом модуле осуществляется регистрация адаптера: {{{#!highlight xml }}} '''Перевод: Ростислав Дзинько'''